我刚刚开始尝试了解有关.NET VM基础的更多信息,并立即被某物抛弃。我知道有一个名为DLR的新东西,它允许C#中的所有动态内容以及Ironx语言的运行。但是现在我正在阅读这种名为Boo的语言,显然它在DLR存在之前就已经具有动态功能。所以,

1)这是怎么可能的?

2)DLR添加了什么方程式?

3)像Boo这样的语言会通过根据DLR重新实现自己来获得任何东西吗?

从我在这里和那里聚集的东西来看,DLR似乎是从Ironpython出来的,当时他们将.NET中DL支持所需的所有内容都考虑在内,并以可重复使用的形式提出。所以我猜是DLR没什么特别的,只是一些有助于Microsoft.scripting.dll中动态对象的库,但是如果您有时间我想嘘发生了什么?然后,对于2和3,我想DLR的共同点和可重复性将允许自动进行任何DLR改进,但是如果您已经使您的DLR,则没有紧急的“需要”重新实施自己的自定义运行时?还是DLR有一些秘密的酱汁,使它比我们在.NET上做的任何事情都更好?

4)DLR真的是运行时还是一组库? (无论如何,运行时间到底是什么?我可能需要学习更多的编译器理论,甚至才能理解这个问题的答案,或者甚至是一个意味着任何意义的问题。忽略这个问题。或者不要。)

5)Ironpython编译如何工作?它是否将其编译为CIL的新动态版本,还是仅将“ Ironpython.exe”命令预先到包含程序文本的字符串中?嗯,好吧,如果动态是C#中的关键字,那么CIL必须有动态版本,对吗?那么.NET如何知道是否在CIL上使用CLR或DLR?

6)JVM的Davinci项目与众不同吗?看起来这是JVM本身的实际重新实现。这种方法有什么意义?我猜想有巨大的性能增长,但是还有其他吗? MS没有走这条路的原因吗?

7)DLR是否使BOO有些过时,以制作DSL?

有帮助吗?

解决方案

DLR基本上为聚会带来了3件事:

  • 一组扩展的表达式树(首先引入了W/ LINQ),可启用完整的程序。这些提供了一种比直接生成IL更容易生成代码的方法 - 它摆脱了许多能够生成无效IL的情况,并将更多情况变成了易于辩论的运行时异常。
  • 内置的呼叫站点缓存机制,因此您无需创建自己的(对于动态语言中的良好性能非常有用)。这包括诸如多级缓存和老化未使用的项目之类的东西。
  • 元对象协议,允许动态语言在运行时相互交流并协商调用语言的正确结果(例如,当成员不存在或在python中丢弃属性时,在JavaScript中返回undefined,而不管语言的动态如何对象被写入)。

元对象协议是唯一需要共享的唯一部分 - 您可以自己创建的所有其他内容。

Ironpython完全建立在DLR的顶部 - 因此,它的编译模型实际上是为了编译到表达树。运送带有.NET 4.0的DLR内层用于编译这些表达式树,我们使用解释器,该解释器是外层的一部分来解释这些表达式树。然后,我们可以在解释版本变热之后懒洋洋地编译表达树。该汇编包括我们用于动态调度各种操作(获取,设置成员,呼叫对象等)的呼叫站点的生产,我们再次使用DLR-在这种情况下,它是呼叫站点机制。 Ironpython使用两种标准DLR绑定器的组合以及这些操作的定制粘合剂,这些粘合剂执行铁皮特定的动作(通过代码上下文,支持 *args和** args呼叫等),然后落回到标准的DLR binders for标准DLR Binder互动。

Davinci项目将为CLR以代表的形式添加“方法处理”。它还将添加一个新的“ Invokedynamic” Opcode,CLR没有,并且没有获得DLR工作。取而代之的是,DLR仅使用现有的原语(代表,Refied Generics)以及定义Interop协议的库。两者都添加了呼叫站点的概念,两者之间的概念可能相当相似。

其他提示

这里有很多问题!我不确定我能回答 全部 其中,我会尽我所能:

  1. 嘘不是动态的,就像(铁)python是。这主要是一种具有强类型推理和Pythonic语法的静态类型语言。加上它的可选鸭子打字,给它一种非常动态的感觉,但肯定与Python不同。比Python比C#4更相似(语法除外)。

  2. DLR增加了对语言实施者的动态支持 在之上 CLR,更适合静态类型的语言(例如VB.NET,C#,F#)

  3. 不是真正的恕我直言。它会变得与Ironpython太相似。 BOO的特征恰恰是它是静态输入的。

  4. 运行时间 支持语言中一些基本构造的库。 vb.net,c#,f#,boo,它们都有运行时库。您通常永远不会看到vb.net或C#runtimes,因为它们具有.NET框架。关于埃里克·利珀特(Eric Lippert)的这一点,有一个很好的答案,但我找不到。

  5. 无法对此发表评论,对Ironpython没有太多的实践经验。

  6. 不知道Davinci项目,不能对此发表评论。

  7. 否。据我所知,Boo的宏和可扩展编译器对于.NET语言非常独特(Nemerle 具有相似的宏功能)。我真的不能说BOO DSL是否比Ironpython DSL更强大或多或少。我可以肯定地说的是BOO DSL的实施是 大不相同 根据Python DSL的植入。

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