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

Rah*_*arg 187 java jvm javac

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

oxb*_*kes 161

这个问题的精确措辞有点误导:它不是"JVM""编译器",因为有多个JVM供应商(jrockit是一个,IBM另一个)和多个编译器.

  • 太阳JVM 写在C,虽然这不是必须的情况下-因为它运行在您的机器是在JVM 平台相关的可执行文件,因此可能最初被用任何语言编写.例如,最初的IBM JVM是用Smalltalk编写的

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

  • 我相信Sun提供的Java编译器也是用Java编写的.(虽然再次,有多个编译器)

  • 请提供用C编写的Sun JVM的参考. (18认同)
  • HotSpot JVM是用C++编写的 - http://www2.research.att.com/~bs/applications.html (8认同)
  • @devdimi该链接已损坏,现在位于:http://www.stroustrup.com/applications.html (5认同)
  • 祝你好运,cyotee。你的 JVM 会在什么上运行? (2认同)

小智 70

第一个Java编译器是由Sun Microsystems开发的,使用C++中的一些库用C语言编写.今天,Java编译器是用Java编写的,而JRE是用C编写的.

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

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

  • +1用于解释如何用Java编写Java编译器:) (27认同)
  • 这是否也解决了先有鸡还是先有蛋的问题:) (5认同)
  • 仅供参考,通过在更基本的编译器中编译代码来“升级”到新编译器的过程称为“引导”,如“通过引导来拉动自己”,这就是“引导”机器的来源。YouTube 上的 Computerphile 有一个关于此内容和“T 图”的精彩视频 (2认同)
  • 理论上,您甚至不需要引导编译器。您可以参考Java语言规范并手动将Java编译器代码翻译为字节码(类文件),从而进行引导。虽然我只尝试使用 HelloWorld 手动执行此操作。 (2认同)
  • 只是澄清一下,JVM 不能用 Java 编写,因为 Java 需要 JVM 才能运行,所以如果 JVM-version2 是用 Java 编写的,它必须在 JVM-version1 上运行,因此它将是一个运行在 VM 上的 VM。 (2认同)

Sev*_*Sev 63

来自Java Docs

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

  • 什么编译Java?Java的.那么,你如何获得Java?编译它.咦? (8认同)
  • 这真的是一个古老的文件(从事物的外观看> 10年).例如,它说*"Java字节码被动态转换为本机机器指令(解释)并且不存储在任何地方"*这在大约5年内不是真的! (4认同)
  • @user4903 不一定。如果您愿意,可以手动将 Java 代码翻译成字节码。 (3认同)
  • Sun Microsystems 开发的第一个 Java 编译器是使用 C++ 中的一些库用 C 编写的 http://en.wikipedia.org/wiki/Java_compiler (2认同)
  • 好吧,因为什么时候文档真的是最新的,特别是在大的变化之后?:) (2认同)
  • @AwesomeHunter 事实上,第一个编程语言一定是手工用 1 和 0 编码的。很难想象我们已经走了多远。 (2认同)

Urb*_*end 16

实际上Oracle JVM是用C++编写的,而不是C.

在这里查看HotSpot JVM代码:http://openjdk.java.net/groups/hotspot/


mic*_*moo 9

此链接应该回答您的问题

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


djn*_*jna 8

原则上几乎任何东西,通常是C.


Tri*_*ena 8

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

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