是Java Bootstrapped的编译器吗?
如果引用了java的第一个编译器,它是如何编写的?
答案 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编译器编译它的意义上引导的。