如何用Java编写JVM

如何用Java编写JVM,java,jvm,bootstrapping,Java,Jvm,Bootstrapping,我简要地阅读了关于哪一个是用Java编写的开源JVM实现的文章。对我来说,这听起来很有道理。如果java需要一个虚拟机来运行,那么虚拟机本身如何用java编写(VM代码不需要一个虚拟机来运行,等等?) 编辑:好的,我发现我忽略了Java不必在VM中运行的事实。那么如何解释如何用LISP编写LISP编译器呢?或者这应该是一个全新的问题吗?您认为Java需要虚拟机的假设一开始就不正确。查看该项目。Java代码可以直接编译为机器代码,这样就不需要虚拟机。您可以了解一种成熟的引导编译器的方法。我认为它始

我简要地阅读了关于哪一个是用Java编写的开源JVM实现的文章。对我来说,这听起来很有道理。如果java需要一个虚拟机来运行,那么虚拟机本身如何用java编写(VM代码不需要一个虚拟机来运行,等等?)


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

您认为Java需要虚拟机的假设一开始就不正确。查看该项目。

Java代码可以直接编译为机器代码,这样就不需要虚拟机。

您可以了解一种成熟的引导编译器的方法。我认为它始于70年代…

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


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

请参见。

您正在询问有关鸡和蛋的问题


阅读:

这有点像‘哇哦,男人,这怎么行?’——但我认为你描述的是一种被称为‘自我托管’的现象:

语言(或工具链/平台)并不是从自我托管开始的——它们开始于在现有平台上构建的生命:在某一点上,它们的功能足以让程序能够理解它本身所使用的语法

在经典的AWK书中有一个很好的例子,它介绍了一个AWK程序,它可以解析(一个简化版本)其他AWK程序:参见下面的链接

在《美丽的代码》一书中还有一个例子,它有一个可以解析Javascript的Javascript程序

我认为需要记住的是,如果你有一个用Java编写的JVM,它可以运行Java字节码:运行Java JVM本身的JVM必须本地托管(也许这个JVM是用C编写的,然后编译成机器码):这一点在任何情况下都是正确的,因为最终会在某个地方出现自托管程序

因此,这个谜团被揭开了——因为在某个时刻,有一个本地机器代码程序运行在所有东西的下面

这相当于能够用英语本身来描述英语(etc)语言……也许


我上周看了Maxine一眼,也在想同样的事情:)

从Maxine:

1构建引导映像

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

2跑马拉松

既然Maxine已经编译好了, 我们可以将其作为标准JavaVM运行。 max-vm命令处理细节 类和库路径的定义以及 提供一个类似于 标准java启动器命令


我知道这篇文章很老,但我想我可能会在讨论中补充一点,因为这些都是遗漏的要点。因此,未来的读者可能会发现这一点很有帮助

我不知道大家是否都没有抓住要点。您可以用几乎任何语言编写大多数类型的编译器、解释器或虚拟机。当使用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微秒的汇编代码。我的观点是,输出不必与输入或目标相同。也就是说,用Java编写JVM并不意味着最终结果必须在Java JVM下运行。

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


请注意,虽然引导自宿主编译器和引导自宿主VM有些相似,但我相信它们不会带来完全相同的挑战

java语言可能不需要虚拟机,但术语“java”所涵盖的不仅仅是语言,它还包括虚拟机。而Maxine至少似乎需要一个JDK1.6 JVM来运行。@kji:我想我错了。看来玛克辛确实编译了一个本地的可执行文件,所以在构建Maxine initally之后,不需要JDK JVM(它仍然需要类库,我相信)。Bjarne Stroustroup writte不是第一个C++编译器。