为什么javac源代码是用java编写的?

为什么javac源代码是用java编写的?,java,compiler-construction,javac,Java,Compiler Construction,Javac,我从下载了javac源代码,发现它本身是用java语言编写的。但是,我希望它是用c/c++编写的 无论如何,在没有java编译器的情况下,用java编写的java编译器源代码是如何编译的?用编译语言编写的编译器称为引导编译器 它们的制作方式有点让人扫兴,但试想一下:当原始语言编写时,没有java,因此他们不得不用另一种语言创建编译器,实际上,它是用C/C++编写的。请在这里查看: 另外,Java的工作方式,我不知道你是否知道,编译器(javac)实际上并不生成机器代码文件,而是创建字节码文件,然

我从下载了
javac
源代码,发现它本身是用java语言编写的。但是,我希望它是用c/c++编写的


无论如何,在没有java编译器的情况下,用java编写的java编译器源代码是如何编译的?

用编译语言编写的编译器称为引导编译器

它们的制作方式有点让人扫兴,但试想一下:当原始语言编写时,没有java,因此他们不得不用另一种语言创建编译器,实际上,它是用C/C++编写的。请在这里查看:


另外,Java的工作方式,我不知道你是否知道,编译器(
javac
)实际上并不生成机器代码文件,而是创建字节码文件,然后由JVM解释

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

来自:

Sun Microsystems开发的第一个Java编译器是使用C中的一些库用C编写的++

此外,编译后的字节码由C++编写的JVM进行解释。发件人:

Oracle JVM,命名为热点,是用C++语言编写的


一种常见的做法是,一种语言的编译器是用它的语言编写的,以展示它的能力。由于这些原因,很多人不认为VB是一种“真正的”语言。@ AMIT:没有语言可以首先被自己实现。VB也一样。你的PL讲师有偏见,可能他不认为VB适合“真实”的编程任务。尽管如此,它实际上是一种真正的编程语言,人们用它来解决真正的问题(即使你不希望他们这样做)。如果我们真的要变得技术化的话……根据这个定义,x86也是“JIT”,因为真正的处理器将x86指令作为微码序列执行。那么你会调用C编译器“不真实”,因为它们不生成微码吗?@ ChrisJester Young:你说(“引用”):“实际上,我认为JVM运行时的JIT是唯一的”真正的“编译器”。这与“JIT也是编译器”完全不同。如果您要开始区分“编译器”和“真正的编译器”,那么我们将需要两个术语的定义……现代JVM不再进行解释。动态(JIT)编译是标准,应该假设是这样。(您可以指定JVM标志来强制解释,以跟踪是否存在与JIT相关的错误。但是,任何正常部署都不应该使用此类标志。)这是我关于stackoverflow的第一个问题,我没想到这么快就会得到这么多答复。我知道java是如何工作的,我从openjdk下载编译器源代码的原因是我想自己用java语言开发一个java编译器以供学习。谢谢大家。@bobzhou:激动人心,是吗?看着一群编程极客讨论这些细节:P@ChrisJester-Young说“没有现代JVM可以解释了”显然是错误的。举一个随机的例子,HotSpot进行解释。不仅如此,大部分时间都是这样。默认编译阈值是在一段代码被JITted之前对其进行10000次迭代。正如JVM的名字所说,HotSpot将代码中的热点检测为JIT目标,并愉快地解释其余部分。@ChrisJester Young最公平的说法是,随着使用JIT编译器的虚拟机的出现,解释器和编译器之间的区别正在失去其概念基础,应该在讨论中淡化。事实上,维基百科的文章在这一点上是有争议的,因为它说应该有引文或参考文献来证明这一说法是正确的。虽然我不怀疑,但引用可能不是最好的。不过,并非所有的JVM都是用C++编写的。@ NNSONEY在这种情况下,因为编译器被提到,它是C++ + JVM!Java编译器。两段完全独立的代码。@nneonneo当然,我们在这里讨论的是另一段。。。