【问题标题】:In which language are the Java compiler and JVM written?Java 编译器和 JVM 是用哪种语言编写的?
【发布时间】:2010-11-16 07:04:29
【问题描述】:

Java编译器 (javac)、虚拟机(JVM) 和java starter 是用哪些语言编写的?

【问题讨论】:

  • 我在 Java 上工作,所以我想了解该语言...:)
  • 这是你的观点。假设你在某些技术上工作了 20 年,面试官问你它是用什么语言编写的或者它是如何工作的,那么你可以说你不在乎它意味着你只是想用不想真正理解的语言写if else。
  • 我认为知识永远不会被浪费。所以知道一些事情并不是浪费时间。
  • ...机械工程师或赛车手(延伸比喻)
  • @paxdiablo 开车是你的工作,但不是你的职业。赛车手可能会关心发动机的工作方式。我并不是说他们都在乎……但如果一位赛车手想更多地了解引擎是如何在他付钱驾驶的汽车上工作的,你会认为这是不合理的吗?

标签: java jvm javac


【解决方案1】:

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

  • Sun JVM 是用C 编写的,尽管不必如此 - 在您的机器上运行的 JVM 是一个平台相关的 可执行,因此可以最初是用任何语言编写的。例如,最初的 IBM JVM 是用 Smalltalk

  • 编写的
  • Java 库(java.langjava.util 等,通常称为 Java API)本身是用 Java 编写的,尽管标记为 native写在CC++

  • 相信Sun提供的Java编译器也是用Java编写的。 (虽然同样有多个编译器)

【讨论】:

  • 实际上,Sun 的 JRE 中的 一个 库是用 NetRexx 编写的。 (它是任意精度数学库之一,BigInteger、BigNum 或 BigDecimal。我忘了是哪个。)理论上,您可以使用任何语言来实现 JRE,只要它可以编译为 Java 程序可以编译的表示形式明白。
  • 请提供使用 C 语言编写的 Sun JVM 的参考。
  • HotSpot JVM 是用 C++ 编写的 - www2.research.att.com/~bs/applications.html
  • @devdimi 链接已损坏,现在位于:stroustrup.com/applications.html
  • 祝你好运,cyotee。你的 JVM 会在什么平台上运行?
【解决方案2】:

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

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

Java 编译器是作为 Java 程序编写的,然后使用用 C 编写的 Java 编译器(第一个 Java 编译器)进行编译。这样我们就可以使用新编译的Java编译器(Java编写的)来编译Java程序了。

【讨论】:

  • +1 用于解释如何用 Java 编写 Java 编译器 :)
  • 仅供参考,通过在更基本的编译器中编译代码来“升级”到新编译器的过程称为“引导”,如“通过引导程序将自己拉起来”,这是“引导”一个机器来自。 YouTube 上的 Computerphile 有一个关于这个和“T 图”的精彩视频
  • 这是否也回答了鸡和蛋的问题:)
  • @天网自管鸡
  • 理论上,你甚至不需要引导编译器。您可以参考 Java 语言规范并手动将 Java 编译器代码转换为字节码(类文件),从而进行引导。虽然我只尝试使用 HelloWorld 手动执行此操作。
【解决方案3】:

来自Java Docs

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

【讨论】:

  • Sun Microsystems 开发的第一个 Java 编译器是用 C 语言编写的,使用 C++ 中的一些库en.wikipedia.org/wiki/Java_compiler
  • 这确实是一份相当古老的文件(从表面上看已经超过 10 年了)。例如,它说“Java 字节码被即时翻译成本地机器指令(解释),并且不存储在任何地方”,这已经有 5 年的时间了!
  • 好吧,从什么时候起文档才真正更新,尤其是在大更改之后? :)
  • 什么编译Java?爪哇。那么,你如何获得Java?编译它。嗯?
  • @user4903 不一定。如果您愿意,可以手动将 Java 代码翻译成字节码。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      This link 应该回答你的问题

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

      【讨论】:

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

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

        【讨论】:

        • 感谢分享你的答案,最清晰的答案
        • 太棒了。尤其是第二个要点。
        • JVM 可能是一个执行 Java 字节码的虚拟机,但在某个地方,它本身必须被编码。
        【解决方案8】:

        Jikes RVM,一个广泛用于研究目的的自托管 JVM,是用 Java 编写的。它不是人们在他们的桌面上运行的,但它在我的“现在让我们展示一下语言的一般力量”的列表中位居前列。

        【讨论】:

        • 是乌龟一直向下?它有某种微内核吗?如果是,那是用什么语言写的?
        【解决方案9】:

        假设您在谈论 Hotspot JVM,它是 Sun 提供的 iirc,它是用 C++ 编写的。有关 Java 的各种虚拟机的更多信息,您可以查看此linkjavac 和大多数 Java 编译器一样,是用 Java 编写的。

        【讨论】:

          猜你喜欢
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 2018-12-26
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          相关资源
          最近更新 更多