前段时间我找到了MJVM项目。可悲的是,这个项目已被作者遗弃(我通过电子邮件问Igor)。
我想知道是否有一个(继续的)开源项目,用Java完全实现JVM。
“完整”,我的意思是,不仅要仿效移动设备。
答案 0 :(得分:30)
Jikes RVM可能是用Java编写的最突出的JVM实现。但是,它的最低级实现只包含对“魔术”接口的静态方法调用,该接口由编译器专门处理并转换为本机代码。
Maxine VM(最初由Sun Labs开发,现在是Oracle Labs)是一个真正的 metacircular VM,其中不仅所有内容都是用Java编写的,而且没有特殊的外壳在编译器中继续。更重要的是:不仅Maxine VM是用Java编写的,它甚至可以运行本身!这可能听起来很疯狂,坦率地说,我不知道它是如何工作的,但它基于Klein VM(由Sun Labs开发),它为自编程语言做同样的事情。
这有一些非常有趣的属性:由于JVM本身是JVM解释的代码库的一部分,与用户代码所属的代码库相同,这意味着它可以进行优化,例如跨VM边界的内联。 IOW:它可以将VM代码内联到用户代码中,反之亦然。这也意味着VM本身需要进行相同的运行时分析和动态优化 - 在其他VM(甚至包括Jikes)上 - 只有用户代码,这意味着VM本身不断被重新编译并重新优化为适应不断变化的负载,正在加载的新类,更改配置文件,更改使用模式等。
在像HotSpot,JRockit,J9等虚拟机上,这些优化是不可能的,原因很简单,JVM只知道如何优化JVML字节码,但VM不是用Java编写的。但即使在Jikes中,这也是不可能的,因为虽然VM是用Java编写的,但它在运行之前会被静态编译为本机代码,并且VM本身的代码不是代码的一部分VM“看到”。
Squawk VM也是由Sun Labs开发的JVM,现在是Oracle实验室。与Maxine不同,Maxine与目标受众中的J9,HotSpot或JRockit大致相似,Squawk更类似于KVM(最初由Sun开发,现在是Oracle),即针对资源受限的嵌入式设备。 Squawk的灵感来自Klein。与Maxine不同,它有一个用C编写的小抽象层。但请记住,Maxine需要运行操作系统,而Squawk在没有操作系统的情况下运行。因此,从某种意义上说,Squawk甚至比Maxine更纯粹,因为很多部分不是Maxine的一部分,而是操作系统的一部分(它们通常用C,C ++或其他低级语言实现),实际上是Squawk的一部分本身。例如,设备驱动程序是用Java编写的。只有一个小的硬件抽象层和I / O库是用C语言编写的。
答案 1 :(得分:6)
Jikes RVM是一个用Java编写的JVM,用于研究并保持活跃开发。
答案 2 :(得分:1)
JNode是一个用Java编写的JVM +操作系统,它运行一个裸x86 PC或虚拟机。该项目的SVN最近一直处于非活动状态(大约是过去6个月),但我相信该项目的GIT镜像中有活动。
答案 3 :(得分:0)
一个有趣的Java JVM实现是这样的:
https://gitlab.com/neoexpert/jvm
它能够运行简单的Java程序和一些高级程序。它也应该能够运行。 它还有一个子项目,其中包含能够在浏览器中运行的JVM的JavaScript实现。非常快。 您可以通过以下方式运行JS实现:
mvn clean install
cd jsjvm
./run.sh
JavaScript实现确实有一个简单的JDK,其中包含一些用于DOM操作和WebGL绑定的类。 我打算为其实现JDWP(Java调试器有线协议)。完成后,您将可以连接调试器(例如,来自IntelliJ的调试器)并调试在浏览器中运行的Java代码。