为什么javac源代码用Java语言编写?

7
我已经从这里下载了javac源代码,发现它本身是用Java语言编写的。然而,我原本以为它是用c/c++编写的。
无论如何,当没有Java编译器时,这个用Java编写的Java编译器源代码是如何被编译的呢?

3
http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29 - nneonneo
4
编写一种语言的编译器来展示其能力是一种常见做法。据我所知,由于这些原因,许多人不认为VB是一种“真正的”语言。 - amit
2
@amit: 任何编程语言都不可能首先在其自身中实现。VB也不例外。你的编程语言讲师可能有偏见,可能认为VB不适合“真正”的编程任务。尽管如此,它实际上是一种真正的编程语言,人们使用它来解决实际问题(即使你希望他们不这样做)。 - nneonneo
2
如果我们要变得非常技术化......按照这个定义,x86也是“JIT”,因为真正的处理器将x86指令作为微码序列执行。那么你会称C编译器为“不真实”吗,因为它们不生成微码? - nneonneo
5
你说(引用):“实际上,我认为JVM运行时的JIT是唯一真正的编译器。” 这明确排除了javac作为“真正的”编译器。 这与说“JIT也是编译器”完全不同。 如果你要开始区分“编译器”和“真正的编译器”,那么我们需要为两个术语提供定义... - Jon Skeet
显示剩余21条评论
3个回答

4

来自这里

最初由Sun Microsystems开发的第一个Java编译器是使用C编写的,其中使用了一些C++库。

此外,编译后的字节码由JVM解释,而JVM是用C++编写的。来自这里

Oracle JVM(HotSpot)是用C++语言编写的。


事实上,维基百科的文章在这一点上存在争议,因为它说应该有引用或参考资料来证明这个说法是真实的。虽然我不怀疑它,但这个参考文献可能并不是最好的。 - Edwin Dalorzo
并非所有的JVM都是用C++编写的。 - nneonneo
@nneonneo 好的,在这种情况下,既然提到了编译器,那就是C++。 - loxxy
@nneonneo 当然,我们在这里谈论的是另一部分... - loxxy
Hotspot 的一部分是由 C 编写的,而不是 C++。 - Antimony
显示剩余3条评论

1

一种用于编译自身语言的编译器称为引导编译器。

它们的制作方式有点令人费解,但是想一想:当最初的语言被编写时,还没有Java,因此他们不得不使用另一种语言来创建编译器,而这种语言实际上是用C/C++编写的。在这里查看:Java编译器和JVM使用哪种语言编写?

此外,Java的工作方式是,编译器(javac)实际上不会生成机器代码文件,而是创建字节码文件,然后由JVM进行解释


1
现代JVM不再进行解释。动态(JIT)编译是一种常态,应该默认情况下使用。(您可以指定JVM标志来强制解释,以查找是否存在与JIT相关的错误。但是,正常部署永远不应使用这些标志。) - C. K. Young
1
这是我在stackoverflow上的第一个问题,我没想到会这么快得到这么多回复。 我知道Java的工作原理,我下载openjdk的编译器源代码的原因是我想用Java语言自己开发一个Java编译器来学习。谢谢大家。 - bob zhou
@Chris,我了解解释模式和JIT编译之间的区别,但“编译”这个术语所给出的推论是代码直接在机器上执行,而我不想给人留下这种印象。在语义学上很容易迷失方向,但就编程语言而言,我认为JIT只是一个优化解释器——其优化步骤包括对字节码的贪婪式机器编译——而不是编译器。 - alvonellos
3
“@ChrisJester-Young说‘现代JVM都不再进行解释了’这个陈述显然是错误的。以随机示例来看,HotSpot仍在进行解释。不仅如此,大多数时候它都在进行解释。默认编译阈值是代码片段迭代10,000次之后才会被JIT编译。正如JVM的名字所示,HotSpot会检测您代码中的热点,并愉快地将其余部分进行解释。” - Marko Topolnik
1
@ChrisJester-Young 公正的说,随着采用JIT编译器的虚拟机的出现,解释器和编译器之间的区别正在失去其概念基础,并且在讨论中应该减弱这种区别的重要性。 - Marko Topolnik
显示剩余9条评论

1
通常情况下,您需要现有的Java编译器(和运行时)来引导。但是,还有其他可用的Java编译器,比如Jikes,它们是用C++编写的。是否可以使用Jikes来引导OpenJDK是另一回事,但理论上应该是可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接