DLR,Boo和JVM

时间:2010-12-23 01:20:23

标签: .net clr ironpython dynamic-language-runtime boo

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

1)这怎么可能?

2)DLR对等式有什么影响?

3)像Boo这样的语言是否可以通过在DLR方面重新实现来获得任何收益?

从我在这里和那里收集到的东西,看起来DLR来自IronPython,当他们将.Net中DL支持所需的所有内容分解出来,并将其置于可重复使用的形式中。所以我猜的是DLR并不特别,只是一些帮助Microsoft.Scripting.dll中的动态对象的库,但是如果你有时间的话,你不能自己出去编写代码。我猜是Boo发生了什么?然后对于2和3,我想DLR的通用性和可重用性将允许任何未来的DLR改进自动进行,但是如果你已经制作了你的DLR,那么就没有迫切的“需要”来重新使用DLR自定义运行时?或者,DLR是否有一些秘密的MS酱,它比我们在.Net上做的任何东西都好?

4)DLR真的是运行时还是只是一组库? (究竟什么是运行时?我甚至可能需要学习更多编译器理论才能理解这个问题的答案,或者它是否甚至是一个意味着什么的问题。忽略这个问题。或者不要。)

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

6)JVM的DaVinci项目是否有所不同?看起来它是JVM本身的实际重新实现。这种方法有什么含义?我猜测有很大的性能提升,但其他什么呢? MS没有采取这条道路的原因吗?

7)DLR是否使Boo在制作DSL方面有些过时了?

2 个答案:

答案 0 :(得分:4)

这里有很多问题!我不确定我能否回答所有,但我会尽我所能:

  1. Boo不像(Iron)Python那样具有动态性。它主要是一种静态类型语言,具有强类型推断和pythonic语法。这与其可选的鸭子打字相结合,给人一种非常动感的感觉,但它肯定与Python不同。 Boo与C#4比Python更相似(语法除外)。

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

    < / LI>
  3. 不是真的恕我直言。它会变得与IronPython太相似了。准确地说,Boo的一个特点就是它是静态类型的。

  4. 运行时库,支持该语言中的一些基本结构。 VB.NET,C#,F#,Boo,它们都有运行时库。您通常不会看到VB.NET或C#运行时,因为它们带有.NET框架。 Eric Lippert对此有一个很好的答案,但我找不到它。

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

  6. 不了解达芬奇项目,无法对此发表评论。

  7. 没有。据我所知,Boo的宏和可扩展编译器对于.NET语言来说是非常独特的(Nemerle具有类似的宏功能)。我不能说Boo DSL是否比IronPython DSL更强大或更弱。我可以肯定地说,Boo DSL的实现与Python DSL的实现完全不同

答案 1 :(得分:4)

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

  • 一组扩展的表达式树(首先引入w / LINQ),可以编译完整的程序。这些提供了一种比直接生成IL更容易生成代码的方法 - 它摆脱了许多能够生成无效IL并将更多案例转化为易于调试的运行时异常的情况。
  • 内置的呼叫站点缓存机制,因此您无需创建自己的(对于动态语言中的良好性能非常有用)。这包括多级缓存和老化未使用的项目等内容。
  • 一种元对象协议,它允许动态语言在运行时相互通信并协商调用语言的正确结果(例如,当成员不存在时在JavaScript中返回undefined或在Python中抛出AttributeError而不管动态对象编写的语言)。

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

IronPython完全建立在DLR之上 - 因此它的编译模型实际上是编译到表达式树。使用.NET 4.0发布的DLR内层用于编译这些表达式树,我们使用解释器作为外层的一部分来解释这些表达式树。然后我们可以在解释版本变热之后懒洋洋地编译表达式树。该编译包括我们用于动态调度各种操作(获取,设置成员,调用对象等等)的调用站点的生成,并且我们再次使用DLR - 在这种情况下它是调用站点机制。 IronPython使用两种标准DLR绑定器组合进行这些操作,以及定制绑定器,这些绑定器执行IronPython特定操作(流经代码上下文,支持* args和** args调用等...),然后返回到标准DLR绑定器互操作。

Davinci项目将向JVM添加“方法句柄”,CLR已经以委托的形式提供了这些句柄。它还将添加一个新的“invokedynamic”操作码,CLR没有并且没有获得DLR工作。相反,DLR只使用现有的原语(委托,具体的泛型)和库来定义互操作协议。两者都添加了呼叫站点的概念,两者之间可能非常相似。