.net 表达式树的执行

.net 表达式树的执行,.net,dynamic-language-runtime,.net,Dynamic Language Runtime,要使用DLR,应将动态语言转换为表达式树。当我执行使用动态语言开发的应用程序时会发生什么 例如,hello world应用程序。在运行时执行表达式树代码时会发生什么。表达式树到操作系统的通信实际上是如何工作的?表达式树只是构建IL指令序列的另一种方法。表达式树中的IL将被JIT编译为本机硬件指令,就像C#中的IL或编译为IL的其他源语言一样。My理解力可能会受到限制(我不是DLR专家),即在使用表达式的情况下,对于MemberExpression等节点,将遍历表达式树,并使用每个成员/方法/等的

要使用DLR,应将动态语言转换为表达式树。当我执行使用动态语言开发的应用程序时会发生什么


例如,hello world应用程序。在运行时执行表达式树代码时会发生什么。表达式树到操作系统的通信实际上是如何工作的?

表达式树只是构建IL指令序列的另一种方法。表达式树中的IL将被JIT编译为本机硬件指令,就像C#中的IL或编译为IL的其他源语言一样。

My理解力可能会受到限制(我不是DLR专家),即在使用表达式的情况下,对于
MemberExpression
等节点,将遍历表达式树,并使用每个成员/方法/等的名称与每个对象的提供者进行对话。这可能意味着使用
IDynamicMetaObjectProvider
接口,传递表达式。为关键节点遍历表达式与LINQ提供程序等技术非常相似,只是在许多方面更简单(因为有一个更直接的映射-它不必用SQL等外语重新表述)

动态对象的实现由该动态对象决定,但可能意味着从内部值字典中查找值(例如,
ExpandoObject
),也可能是任何内容(例如,
DynamicObject
的一些特殊子类,或者来自第一个主体的一个特殊子类
IDynamicMetaObjectProvider
实现)


如果类型未实现
IDynamicMetaObjectProvider
(即,在动态世界中浮动的非动态对象),则通常将反射用作回退,缓存执行此操作的机制(可能的原因是反射不是动态的,并且不能进行猴子修补等).

AFAIK,表达式树不是为DLR编译的…?事实上,考虑到这些对象的动态特性,这似乎根本无法工作。你的意思是,我用动态语言编写的任何内容都将在运行时转换为IL和JIT编译??我的理解是,DLR、LINQ、C#和其他人使用表达式树API作为一个指定可执行逻辑的方法比发出IL操作码更简单。请参阅Microsoft文档()要使用表达式树,请构造一系列节点,然后调用expression.Compile()。这是IL发出的地方,也是表达式可JIT和可执行的地方。如果表达式树只是解释数据图,C#lambda表达式的性能成本将是可怕的。DLR可能会使用表达式树动态重写代码。如果DLR在运行时做所有事情,这些动态语言的运行时间将比c#运行时慢(因为在c#while执行时,现有IL是JIT编译的,而在诸如IronRuby之类的动态语言中,IronPython在运行时创建IL&JIT编译)。有意义吗???@HukmChand我认为动态语言使用表达式树发出IL代码,使用DLR例程获取/设置对象实例上的动态属性或方法。DLR提供了一个访问对象成员的间接方法,允许动态更改对象类型/元数据。如果动态语言代码为IL,则使用DLR是IL(或本机),在我看来,整个过程可以实时编译为本机代码。与C#相比,DLR可能需要更多的时间来访问成员,但大多数程序逻辑(循环、数值、ifs等)都是相同的JIT编译IL.IMO。