Java编译器和JVM用哪种语言编写?


195

Java 编译器javac),虚拟机(JVM)和java启动器使用哪种语言编写?


23
我在Java上工作,所以我想了解该语言... :)
Rahul Garg,2009年

25
是您的观点。假设您从事某项技术已有20年的历史,而面试官问您使用哪种语言编写或如何使用该语言,那么您可以说您不在乎,这意味着您只想写其他不需要的语言真正了解语言。
拉胡尔·加尔格

21
而且我认为知识永远不会浪费。因此,了解某件事并不是浪费时间。
拉胡尔加尔格

1
...机械工程师或赛车手(以延伸这个比喻)
Epaga

2
@paxdiablo开车是您要做的事情,但不是您的职业。赛车手可能会在乎引擎如何工作。我并不是说所有人都在乎。但是,如果赛车手想了解更多有关引擎在他付钱的汽车上如何工作的信息,您是否认为这不合理?
JD Isaacks 2010年

Answers:


171

这个问题的确切措辞有点误导:它不是“ JVM”“编译器”,因为有多个JVM供应商(jrockit是一个,IBM是另一个)并且那里有多个编译器

  • Sun JVM 用Java 编写的C,尽管并非必须如此-在您的计算机上运行的JVM是平台相关的可执行文件,因此本来可以用任何语言编写。例如,原始的IBM JVM是用Smalltalk编写的

  • Java库(java.langjava.util等等,通常被称为了Java API)本身是用Java编写的,虽然标注为方法native将已经写在CC++

  • 我相信Sun提供的Java编译器也是用Java编写的。(尽管同样,那里有多个编译器)


我认为他的意思是“ java”用于启动JVM的程序。
斯蒂芬·C

1
实际上,Sun的JRE中的一个库是用NetRexx编写的。(它是任意精度数学库之一,BigInteger,BigNum或BigDecimal。我忘了哪一个。)理论上,您可以使用任何语言来实现JRE,只要它可以编译成Java程序可以表示的形式即可。理解。
约尔格W¯¯米塔格

18
请提供一个参照被写入C.太阳JVM
穆罕默德·巴纳


5
@devdimi链接已断开,现在位于:stroustrup.com/applications.html
flup

80

最早的Java编译器由Sun Microsystems开发,并使用C ++中的某些库用C编写。今天,Java编译器是用Java编写的,而JRE是用C编写的。

我们可以想象Java编译器是如何用Java编写的,如下所示:

Java编译器被编写为Java程序,然后使用用C编写的Java编译器(第一个Java编译器)进行编译。因此,我们可以使用新编译的Java编译器(用Java编写)来编译Java程序。


31
+1解释了如何用Java编写Java编译器:)
Eduard Luca

2
通过在更基本的编译器中编译代码来将其“升级”到新编译器的过程称为“引导程序”,如“通过引导程序拉动自己”一样,这是“引导”计算机的来源。YouTube上的Computerphile拥有有关此视频和“ T图表”的精彩视频
iono

这是否也解决了鸡肉和鸡蛋的问题:)
天网

@天网自托管的鸡
sportzpikachu

65

Java Docs

编译器用Java编写,运行时用ANSI C编写


1
Sun Microsystems开发的第一个Java编译器是使用C ++的一些库用C编写的。en.wikipedia.org/wiki/Java_compiler
Rahul Garg,2009年

4
这实际上是一个旧文档(从外观上看已超过10年)。例如,它说“ Java字节码被即时转换为本地机器指令(已解释),并且没有存储在任何地方”,这已经有5年了!
oxbow_lakes

2
好吧,自从什么时候开始真正更新文档,尤其是在进行了较大的更改之后?:)
Esko

好吧-答案不是真的正确;Sun JVM用C编写,Sun Java编译器用Java编写。第一个IBM JVM是用Smalltalk编写的。
oxbow_lakes

8
什么编译Java?Java。好吧,您如何获得Java?编译它。??


9

该链接可以回答您的问题

看来编译器现在是用Java编写的,但是运行时是用ANSI C编写的


8

原则上几乎所有东西,通常是C


3

Jikes RVM是一种广泛用于研究目的的自托管JVM,是用Java编写的。不是一个人在桌面上运行,而是在我的清单上“现在让我们展示这种语言的强大功能”。


乌龟一直降下来吗?它有某种微内核吗?如果是这样,那是用什么语言写的?
Raedwald 2013年


0
  • 当Sun Microsystem引入Java时,java编译器是使用C ++中的某些库以C语言编写的。
  • 由于Compiler Design中有一个称为Bootstapping的概念,因此通常在Compiler Development中使用,Bootstrapping是使用要编译的源编程语言编写编译器(或Assembler)的过程。它用于生成自托管的编译器。用于新编程语言的编译器的开发首先是在现有语言中开发的,然后以新语言重写并由其自身进行编译。 因此,今天的Java编译器是用Java本身编写的
  • Java虚拟机: Java虚拟机是抽象机。就像一台真正的计算机一样,它具有指令集并处理运行时的各种内存区域。通常,JVM将字节码解释为机器码。

(有关更多信息,您可以检查以下链接:https : //docs.oracle.com/javase/specs/jvms/se7/html/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.