相当于JVM的DLR?

时间:2010-02-03 13:32:44

标签: java jvm

JVM上是否有等效的DLR(.NET的动态语言运行时)?我知道我可以继续实现自己的动态绑定并用Java发出自己的字节码。但是,是否有任何预先构建的框架(如DLR),所以我不必重新发明轮子?

2 个答案:

答案 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中发生。

标准化嵌入API

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>