JVM上是否有等效的DLR(.NET的动态语言运行时)?我知道我可以继续实现自己的动态绑定并用Java发出自己的字节码。但是,是否有任何预先构建的框架(如DLR),所以我不必重新发明轮子?
答案 0 :(得分:11)
DLR有几个不同的东西,其中一些在Java中具有直接的等价物,其中一些以不同的形式存在,其中一些没有等价物。其中一些做具有等效的部分已经是平台的一部分,有些将成为Java 7的一部分,有些可以从第三方获得。
DLR具有运行时绑定和缓存基础架构,可以快速高效地进行动态调度。如何使动态调度与静态调度一样快,并且比C ++式虚拟表调度快得多,已有20多年的历史,但大多数动态执行引擎都没有采用多态内联缓存,动态类型推理等技术。 ,类型反馈优化等。 DLR尝试提供单个实现,可以由所有基于DLR的语言共享(包括用于C#4中dynamic
关键字的C#运行时绑定程序。)
与此等效的Java是JSR-292,它使用运行时绑定和缓存基础结构扩展了JVM。 DLR和JSR-292之间的主要区别在于JSR-292是在VM级别实现的,这意味着为了使用它,您需要一个新的VM。 JSR-292将成为下一个JVM规范的一部分,而JVM规范又将成为Java 7平台规范的一部分,但这还需要一年左右的时间。 (它已经在当前的JDK7 Early Access版本中提供,并且已经有一段时间了。)
DLR,OTOH只是一个库,如果你愿意,可以在CLR 2.0上安装它。实际上,您甚至不需要CLR,任何 CLI兼容的VES都可以,例如Novell的Mono。由于DLR是开源的,因此Novell可以从Microsoft网站下载源代码,并将其作为Mono的一部分发布,而无需编写单个代码......这正是他们正在做的事情。 Sun的JSR-292实现也是开源的,但这对IBM,Oracle,Apache,RedHat,GNU等没有帮助,因为它是特定于VM的,因此每个JVM供应商都必须自己实现它。 (并且有很多那些,单独的Sun 有四种不同的JVM。)
[注意:是一个RémiForax的JSR-292 backport,它通过字节码重写为较旧的JVM实现JSR-292。它100%兼容,但速度很慢。]
DLR包含一个MOP(IDynamicObject
接口),它允许所有基于DLR的语言相互之间以及基于CLI的语言在更高级别上进行互操作,并且集成度要比必须更加紧密通过CTS。
在Java空间中,等效的是Attila Szegedi(用于JVM的Rhino JavaScript编译器的维护者)dynalang项目,其灵感来自CommonLisp MOP。但是,
所有这三个可能会在某个时候发生变化,但至少最后一个可能不将在Java 7中发生。
DLR为基于DLR的语言提供标准化嵌入API,允许您在应用程序中嵌入语言运行库,而无需为每个不同的运行时学习不同的API。实际上,您甚至不必知道运行时是什么!
与此相当的是JSR-223 Java Scripting API,它自Java 6以来一直是Java平台的一部分,并且位于javax.script
package。
DLR包含代码的标准表示(DLR树,表达式树)以及这些树的解释器和高度优化的编译器,这允许语言实现者专注于他们的语言特定的编译器前端并使DLR处理幕后代码生成的细节。
Java中没有相应的内容。
C#4和VB.NET 10添加了动态类型,以便更轻松地与动态语言集成。虽然这在技术上与DLR无关,但它使用DLR进行一些工作。
Java中没有相应的内容。
答案 1 :(得分:2)
我不能说我特别关注这些事情,但我相信Da Vinci Machine项目大致相当于DLR。这是一种稍微不同的方法,因为它改变了字节码指令集,而不仅仅是位于VM顶部的库,但项目都有相同的意图:使各个平台更容易创建高性能的动态语言。 / p>