如何用Java编写JVM?
我简要阅读了关于Maxine ,这是一个用Java编写的开源JVM实现。 这听起来像是循环的。 如果java需要运行一个虚拟机,那么虚拟机本身如何用Java编写(VM代码是否需要运行的虚拟机,等等)。
编辑 :好的,所以我看到我忽略了Java不必在虚拟机中运行的事实。 那么如何解释一个LISP编译器如何在LISP中编写呢? 或者这应该是一个新的问题呢?
您假设Java需要虚拟机是不正确的 。
你在问鸡和鸡蛋
阅读: http : //en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
您需要引导使用Java编写的JVM的JVM可能不需要很多function(例如垃圾回收和JIT),可能非常简单。 所有更高级的function都可以用Java来实现(这似乎正是Maxine的要点,在JVM技术中尝试新的想法)。
另外,Maxine确实包含C代码,我猜想它构成了一个最小的运行时环境,用于让Maxine的其余部分继续运行。 我认为有趣的部分(JIT编译器,垃圾收集)然后在Java中完全实现。
请参阅引导 。
我上周看了一眼马克西恩,想知道同样的:)
从Maxine 文档 :
1构build启动映像
现在我们来构build一个[启动映像]。 在这一步中,Maxine运行在主机JVM上来configuration原型,然后编译自己的代码和数据,为目标平台创build一个可执行程序。
2运行Maxine
现在Maxine已经编译好了,我们可以把它作为一个标准的Java VM来运行。 max vm命令处理类和库path的细节,并提供类似于标准java launcher命令的接口。
Java代码可以直接编译为机器代码,这样就不需要虚拟机。
你可以看看引导编译器的已经build立的方法。 我认为它始于七十年代
这是一个'whooaoaa男人,怎么可以这样工作? – 但我想你正在描述这种被称为“自主托pipe”的现象:
语言(或工具链/平台)并不是以自我托pipe为出发点的,它们是以现有平台为基础的,它们的生命开始于某个时刻,它们的function足以允许编写能够理解其自身语法的程序恰好被写入。
在经典的AWK书籍中有一个很好的例子,它介绍了一个AWK程序,它可以parsing其他AWK程序(一个简化版本):参见下面的链接。
在“美丽的代码”这本书中有另一个例子,它有一个Javascript程序,可以parsingJavaScript。
我想这件事情要记住 – 如果你有一个用Java编写的JVM,因此可以运行Java Byte代码:运行Java JVM本身的JVM必须被本地托pipe(也许这个JVM是用'C '然后编译成机器码):在任何情况下,最终都会发生一个自托pipe程序 – 在某个地方。
所以这个秘密被删除了,因为在某种程度上,有一个原生的机器代码程序运行在一切之下。
这相当于能够用英语本身来描述英语(等)语言….也许…
我知道这个post已经老了,但是我想我可能会在讨论中增加一点,因为他们是错过的观点。 所以未来的读者可能会觉得这有帮助
我想知道大家是否错过了这里的观点。 您几乎可以用任何语言编写大多数编译器,解释器或虚拟机。 当使用C编写C编译器时,需要使用C编译器来编译新的编译器。 但是,输出是在指定平台上运行的本机代码。 仅仅因为JVM是使用在JVM上运行的语言编写的,并不意味着输出必须导致运行在JVM上的代码。 比如你可以编写C,Basic,Pascal编译器,甚至是Java编译器。 在这种情况下,您将需要JVM来创build编译器或汇编程序,但是一旦创build,您可能不再需要JVM,如果最初的代码导致本机代码。 另一种方法是编写一个翻译器,它接受一种input语言并将其转换为本地机器语言,以便用A语言编写程序,编译成语言B,然后编译为机器代码。 在微控制器领域,你会看到很多。 有人想用Basic或Java编写程序,所以他们编写Basic / Java编译器来为现有的C编译器生成C代码。 然后将生成的C代码编译为提供本机Basic / Java编译器的机器语言。 这种方法通常比直接在机器代码中编写Basic / Java编译器更简单。
许多年前,我写了BasicA和GWBasic程序,生成汇编代码到6800和Z80微。 我的观点是,输出不需要与input或目标相同。 IE只是因为你用Java编写JVM并不意味着最终结果必须在Java JVM下运行。
这是一个关于引导自托pipe虚拟机的好文章。 这不是Java,但JavaScript,但原则是一样的。
引导一个自主研究的JavaScript虚拟机:一个体验报告
请注意,引导自主宿主编译器和引导自托pipe虚拟机有些类似,但我相信它们不会引发完全相同的挑战。