.net - DLR、Boo 和 JVM

标签 .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 的通用性和可重用性将允许任何 future 的 DLR 改进自动继承,但是如果您已经使用 DLR 重新实现,则没有迫切的“需要”自己的自定义运行时?或者 DLR 是否有一些 secret 的 MS 调味料,使它比我们在 .Net 上可以做的任何事情都更好?

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

5) IronPython 编译是如何工作的?它是编译成 CIL 的新动态版本,还是只是将“ironpython.exe”命令添加到包含程序文本的字符串中?嗯,如果 dynamic 是 C# 中的关键字,那么 CIL 肯定有一个动态版本,对吗?那么.Net如何知道在CIL上使用CLR还是DLR呢?

6) JVM 的达芬奇项目有什么不同吗?看起来它是 JVM 本身的实际重新实现。这种方法的含义是什么?我猜有巨大的性能提升,但还有什么?有什么理由 MS 不走这条路?

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

最佳答案

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

  • Boo 不像 (Iron)Python 那样是动态的。它主要是一种静态类型语言,具有强类型推断和 pythonic 语法。这加上它可选的鸭子类型,给它一种非常动态的感觉,但它肯定与 Python 不同。 Boo 比 Python 更类似于 C# 4(除了语法)。
  • DLR 在 CLR 之上添加了对语言实现者的动态支持,这更适合静态类型语言(例如 VB.NET、C#、F#)
  • 不是真的恕我直言。它会变得与 IronPython 过于相似。确切地说,Boo 的特征之一是它是静态类型的。
  • 运行时是支持语言中一些基本结构的库。 VB.NET、C#、F#、Boo,它们都有运行时库。您通常不会看到 VB.NET 或 C# 运行时,因为它们随 .NET 框架一起提供。埃里克·利珀特 (Eric Lippert) 对此有一个很好的回答,但我找不到。
  • 不能对此发表评论,对 IronPython 没有太多的实践经验。
  • 不了解达芬奇项目,无法对此发表评论。
  • 不。据我所知,Boo 的宏和可扩展编译器对于 .NET 语言来说是非常独特的(Nemerle 具有类似的宏功能)。我真的不能说 Boo DSL 是否可以比 IronPython DSL 更强大或更不强大。我可以肯定的是,Boo DSL 的实现与 Python DSL 的实现大不相同。
  • 关于.net - DLR、Boo 和 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4515135/

    相关文章:

    c# - 进程间通信 - 现代选项?

    c# - async void 方法是否在每次调用时都创建一个新线程?

    .net - IronPython 中的多线程

    Python 等同于 C# 的 using 语句

    python - Python vs Jython vs IronPython vs wxPython有什么区别?

    .net - 清理 GC 的 .NET 数据结构

    .net - 'Version' 属性未在 nuspec 文件中声明

    multithreading - C++/CLR 中的线程编程

    c# - 虚拟和物理内存/OutOfMemoryException

    c# - 异步 I/O 方法是如何处理的