2010-02-17 93 views
34

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

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

+1

不是Bjarne Stroustroup用C++编写的第一个C++编译器(当它仍被称为“C with Classes”时)?我认为这更令人印象深刻,因为C++不是一种解释型语言,但需要编译器! – Matthias 2010-02-17 08:47:39

+1

这正是我不明白的:) – kji 2010-02-17 08:49:34

+5

New Dragon Book,第一版(远离错误发生的第二版)解释了编译器引导。 – 2010-02-17 08:55:36

回答

14

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

+1

java *语言*可能不需要VM,但术语“java”涵盖的不仅仅是语言,还包括VM。 – skaffman 2010-02-17 08:36:33

+0

而Maxine似乎至少需要JDK1.6 JVM才能运行。 – Thilo 2010-02-17 08:39:07

+0

@kji:我想我错了。似乎Maxine会编译为本地可执行文件,因此在创建Maxine之后不需要JDK JVM(我相信它仍然需要类库)。 – Thilo 2010-02-17 08:49:44

1

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

0

你可以看看引导编译器的成熟方法。我认为它开始于70年代...

6

您需要引导用Java编写的JVM的JVM可能不需要太多功能(如垃圾回收和JIT),可能非常简单。所有更高级的功能都可以用Java实现(这似乎正是Maxine的要点,在JVM技术中尝试新想法)。另外,Maxine确实包含C代码,我猜想它构成了一个最小的运行时环境,用于让Maxine的其余部分进入。我认为有趣的位(JIT编译器,垃圾收集)然后在Java中完全实现。

+0

很好的解释,谢谢 – kji 2010-02-17 08:46:04

+0

没有。 Maxine中的C代码更像数据定义语言,它实际上并没有实现任何有趣的功能。操作系统期望某些结构以特定的方式在内存中进行布局,并且C编译器知道如何执行此操作,所以Maxine使用C来正确地布局这些结构。但是只有少数地方使用C:一个最小的启动器,它将VM映像加载到内存中,将加载地址写入映像内的特定位置,然后跳转到另一个特定位置。调试器,因为Maxine使用OS的C调试工具。 – 2010-02-17 10:03:42

+0

JNI的低级部分,因为JNI的全部内容都是与C集成的。而且,线程的低级部分,因为Maxine使用本地线程,这些线程在系统间非常不同。 – 2010-02-17 10:05:25

0

这是有点 'whooaoaa人,这怎么行???' - 但我认为你正在描述被称为'自托管'的现象:

语言(或工具链/平台)不是以自我托管的形式出现 - 它们是以现有平台为基础开始的:在某一时刻,它们变得足够功能以允许编写程序来理解它本身碰巧写入的语法。

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

“美丽的代码”中有另一个例子,它有一个可以解析Javascript的Javascript程序。我想这件事情要记住 - 如果你有一个用Java编写的JVM,因此可以运行Java字节代码:运行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

2

我看了一下上周玛克辛和想知道同样的:)

从玛克辛documentation

1建设启动镜像

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

2运行玛克辛

现在玛克辛将自己编制, 我们可以作为一个标准的Java虚拟机上运行它。 max vm命令处理类和库路径的详细信息 ,并且 提供了一个类似于 标准java launcher命令的接口。

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下运行。