如何用Java编写JVM

时间:2010-02-17 08:31:33

标签: java jvm bootstrapping

我简要地阅读了Maxine这是一个用Java编写的开源JVM实现。这对我来说是圆形的。如果java需要运行虚拟机,那么虚拟机本身如何用Java编写(VM代码不会需要运行的VM,等等吗?)。

编辑:好的,所以我看到我忽略了Java不必在VM中运行的事实。那么如何解释如何在LISP中编写LISP编译器?或者这应该是一个新问题?

10 个答案:

答案 0 :(得分:15)

您认为Java需要虚拟机is incorrect to begin with

答案 1 :(得分:13)

你在询问鸡肉和鸡蛋。

阅读:http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

答案 2 :(得分:7)

引导用Java编写的JVM所需的JVM可能不需要很多功能(例如垃圾收集和JIT),可能非常简单。然后,所有更高级的功能都可以用Java实现(这似乎正是Maxine的要点,试验JVM技术中的新想法)。

此外,Maxine确实包含C代码,我猜这个代码构成了一个最小的运行时环境,用于获取Maxine的其余部分。我认为有趣的位(JIT编译器,垃圾收集)然后完全用Java实现。

答案 3 :(得分:3)

请参阅bootstrapping

答案 4 :(得分:2)

Java代码可以直接编译为机器代码,因此不需要虚拟机。

答案 5 :(得分:2)

上周我看了一下Maxine并且想知道同样的事情:)

来自Maxine documentation

  

1构建启动映像

     

现在让我们构建一个[启动映像]。在   这一步,Maxine在主机JVM上运行   然后配置原型   编译自己的代码和数据   为...创建一个可执行程序   目标平台。

     

2运行Maxine

     

现在Maxine已经编译了自己,   我们可以将它作为标准Java VM运行。   max vm命令处理细节   类和库路径和   提供类似于的界面   标准java启动程序命令。

答案 6 :(得分:0)

您可以查看完善的自举编译器方法。我认为它始于70年代......

答案 7 :(得分:0)

有点'whooaoaa男人,怎么可以工作?' - 但我认为你在描述被称为“自托管”的现象:

语言(或工具链/平台)并不是以自托管方式开始的 - 它们是在现有平台上构建的:在某一时刻它们的功能足以允许编写理解语法的程序它本身恰好写在。

经典的AWK书中有一个很好的例子,它引入了一个AWK程序,它可以解析其他AWK程序(如果它发生的简化版本):见下面的链接。

“Beautiful Code”一书中有另一个例子,它有一个可以解析Javascript的Javascript程序。

我认为要记住这一点 - 如果你有(比方说)用Java编写的JVM,因此可以运行Java Byte代码:运行Java JVM的JVM本身必须进行托管(也许这个JVM是写的在'C'然后编译成机器代码):在任何自助托管程序的情况下都是如此 - 在某个地方沿线。

所以这个谜团被删除了 - 因为在某些时候,有一个本机机器代码程序在所有东西下运行。

它有点像能用英语本身描述英语(等)语言......也许......

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

答案 8 :(得分:0)

我知道这篇文章已经过时但我认为我可能会在讨论中添加一些内容,因为它们是错过的点。所以未来的读者可能会觉得这很有帮助。

我想知道每个人是否都错过了这一点。您几乎可以用任何语言编写任何类型的编译器,解释器或虚拟机。当使用C编写C编译器时,需要C编译器来编译新的编译器。但是,输出是在指定平台上运行的本机代码。仅仅因为JVM是用在JVM上运行的语言编写的,并不意味着输出必须导致在JVM上运行的代码。例如,您可以用Java编写C,Basic,Pascal编译器甚至汇编程序。在这种情况下,您将需要JVM来创建编译器或汇编程序,但是一旦创建,如果初始代码导致本机代码,则可能不再需要JVM。另一种方法是编写一个转换器,它接受输入语言并将其转换为本机机器语言,以便用A语言编写程序,该语言编译成语言B,然后编译成机器代码。在微控制器领域,你会看到很多。有人想用Basic或Java编写程序,因此他们编写Basic / Java编译器来为现有的C编译器生成C代码。然后将生成的C代码编译成提供本机Basic / Java编译器的机器语言。这种方法通常比直接在机器代码中编写Basic / Java编译器更容易。

许多年前,我编写了BasicA和GWBasic程序,它们将汇编代码生成为6800和Z80微程序。我的观点是输出不必与输入或目标相同。 I.E.仅仅因为您在Java中编写JVM并不意味着最终结果必须在Java JVM下运行。

答案 9 :(得分:0)

这是一篇关于引导自托管VM的好文章。这不是Java,而是javascript,但原则是一样的。

Bootstrapping a self-hosted research virtual machine for JavaScript: an experience report

请注意,虽然引导自主编译器和引导自托管VM有点相似,但我相信它们不会引发完全相同的挑战。