0

我正在玩 DLR 以更好地理解它。我还不完全熟悉它的所有概念和术语,因此对我的问题中的任何术语或概念错误感到抱歉。

基本上,我理解的方式是在表达式树中传递对象,但使用绑定器将对象的动态功能公开给其他支持 DLR 的语言。因此,不是直接在表达式树中进行添加(例如,使用 Expression.Add),而是创建一个绑定器,调用站点在需要时调用该绑定器并为您执行添加。

但是,由于您传递对象,因此在加法操作结束时(例如,如果操作数是两个 Int32 值),您将不得不将生成的 Int32 装箱到一个对象,因为(仍在活页夹中)调用什么网站预计。我有点担心这种不断的装箱/拆箱可能会在一定程度上影响运行时的性能。

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

4

2 回答 2

1

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

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

于 2009-10-26T22:07:04.070 回答
1

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

于 2009-10-27T02:14:28.533 回答