我正在玩DLR以更好地理解它。我对其所有概念及其术语并不完全熟悉,对于我的问题中的任何术语或概念错误都很抱歉。

基本上,我理解它的方式是你传递表达式树中的对象,但是你使用绑定器来将对象的动态功能暴露给其他DLR感知语言。因此,不是直接在表达式树中使用(使用Expression.Add)进行添加,而是创建一个绑定程序,只要需要它就会调用它,并为您添加。

但是,由于您在添加操作结束时传递对象(例如,如果操作数是两个Int32值),您必须将生成的Int32打包到一个对象,因为(仍在绑定器中)呼叫网站期望什么。我有点担心这种不断的装箱/拆箱可能会在某种程度上影响运行时的性能。

这真的是它应该如何工作(所有拳击/拆箱)或我错过了什么?

有帮助吗?

解决方案

在动态类型语言中,静态类型变量的识别和优化是特定于域的优化。在特定的动态语言X的实现中,您可以在生成的代码中保留一个未装箱的局部变量,但是只要您公开动态类型的API,就无法保证静态类型(动态语言的本质)。

为了避免装箱,你必须确定可以在整个过程中证明静态类型的代码片段,并通过 Linq.Expressions ILGenerator

其他提示

就粘合剂而言,您还可以实现自定义活页夹。该自定义绑定器可以返回非对象类型,也可以执行其他特定优化。在IronPython中,我们使用DLR外层ComboBinder和ComboActionRewriter来优化条件。例如,“if a.b:”可以变成一个ComboBinder,它同时执行a.b和转换为bool。如果a.b导致非盒装bool,我们将避免装箱和拆箱。我们计划尝试更多这样的优化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top