是Java Bootstrapped的编译器吗?

时间:2012-02-10 02:26:07

标签: java compiler-construction javac bootstrapping

是Java Bootstrapped的编译器吗?

如果引用了java的第一个编译器,它是如何编写的?

2 个答案:

答案 0 :(得分:6)

这是一个有趣的问题。来自Oracle的当前javac编译器,它只是(1)一个编译器,实际上是用Java编写的,这意味着,是的,你可以考虑它bootstrapped,假设你的定义意味着“已经被引导,以便它现在可以自行编译”(2)

虚拟机本身主要是用内存中的C ++编写的,因此,当编译器被引导时,构建JRE需要一个C ++编译器。


(1) GCJ是另一个,它碰巧是用C语言编写的,所以它依赖于你所指的编译器。

(2)您的问题中的单词“bootstapped”可以通过多种方式获取。如果您对“bootstrapped”的定义意味着“必须 引导以获得正常工作的编译器”,那么答案就是否定。


至于第一个Java编译器在引导之前是如何编写的,在时间的迷雾中(或者Gosling等人的脑海中)仍然会丢失。

鉴于编译器可以相对容易地编写而没有任何花哨的OO概念,我的猜测将是他们只是用C或C ++编写第一个(或几个)。

这似乎由this entry from the Wayback Machine证实:

  

团队的努力开启了一种新的面向对象编程语言的开发,Gosling称之为Oak,在窗外的树后。由于松散地基于C ++,语言被剥离到最低限度,以便与手持设备中的芯片所提供的有限空间兼容,并且旨在使程序员能够更轻松地支持动态,可更改的硬件。

以及后来:

  

Arthur van Hoff在Oak中编写了一个完全使用Oak编译器,而不是使用C语言.Naughton和Jonathan Payne构建了一个名为“WebRunner”的Oak-ready浏览器。第一个小程序 - 杜克在互联网上向父母挥手致意 - 诞生了。

此外,来自Patrick Naughton's epilogue的书“The Java Handbook”(我的大胆):

  

现在我们有了一个记录计划,在网上以源形式运送Oak,事情变得更有成效。我们开始专注于修复语言中的所有松散结束。 Jonathan Payne正致力于优化翻译。 Arthur van Hoff在Oak本身重写了编译器,取代了James最初编写的C版本。这也是对环境的一个很好的测试,因为这个编译器是有史以来最大的单个Oak程序。相当数量的被烧毁的工程师正在利用这个时间作为Sun的带薪假期,但在大多数情况下,核心团队忽略了他们并重新开始工作。

因此,看起来“Java”(Oak)编译器的原始版本是用C语言编写的,然后从那里引导。

答案 1 :(得分:0)

根据http://openjdk.java.net/groups/compiler/

  

请注意,javac的本机启动程序的代码是与之共享的   所有其他JDK工具,都存在于JDK存储库中。如果你只是   下载并构建langtools存储库,您将获得一个   可以直接使用java调用的可执行jar文件   命令,或者提供的简单shell脚本。

因此编译器是用Java编写的。所以是的,它是在需要使用早期版本的Java编译器编译它的意义上引导的。