相当于JVM的DLR?

thr*_*thr 12 java jvm

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

Jör*_*tag 12

DLR有几个不同的东西,其中一些在Java中有直接的等价物,其中一些以不同的形式存在,其中一些没有等价物.一些那些的具有同等已经是平台的一部分,有些人会成为Java 7的一部分,有些是由第三方提供.

运行时绑定器和缓存基础结构

DLR具有运行时绑定和缓存基础架构,可以快速高效地进行动态调度.如何使动态调度与静态调度一样快,并且比C++式虚拟表调度快得多,已有20多年的历史,但大多数动态执行引擎都没有采用多态内联缓存,动态类型推理等技术. ,类型反馈优化等.DLR尝试提供单个实现,可以由所有基于DLR的语言共享(包括用于dynamicC#4中关键字的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.)

[注:有一个雷米Forax的JSR-292后向移植,它实现了JSR-292通过字节码重写较旧的JVM.它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包中.

代码表示和编译器

DLR包含代码的标准表示(DLR树,表达式树)以及用于这些树的解释器和高度优化的编译器,这允许语言实现者专注于他们的语言特定的编译器前端并使DLR处理本机 - 幕后代码生成的坚韧不拔.

Java中没有等价物.

静态语言的动态功能

C#4和VB.NET 10添加动态类型,以便更轻松地与动态语言集成.虽然这在技术上与DLR无关,但它使用DLR进行一些工作.

Java中没有等价物.


Jon*_*eet 2

我不能说我特别关注这些事情,但我相信达芬奇机器项目大致相当于 DLR。这是一种有些不同的方法,因为它改变了字节码指令集,而不仅仅是一个位于虚拟机之上的库,但这些项目都有相同的目的:更容易地为各自的平台创建高性能的动态语言。