5

我做了一些搜索,试图了解 java 源文件是如何执行的。我找不到明确的答案来说明 JRE 和 JDK 行话中从头到尾的步骤。所以我正在写我从不同博客中理解的内容,但确实存在一些空白。非常欢迎对我的理解进行更正。标有 Q1 和 Q2 的两个问题在第 2 点下方。

  1. 编写一个 HellowWorld.java 文件

  2. javac HelloWowrld.java 给出了HelloWorld.class。那就是它给出了一个字节码的类文件。现在我可以获取在 Mac 中生成的这个字节码并转到 Windows 机器并运行它应该可以正常工作。
    Q1:现在这个编译成字节码,这真的是编译还是解释?
    Q2:Javac 必须是 JDK 而不是 JRE 的一部分?

  3. JRE 包含用于创建运行时环境的 JVM 和其他库。JVM(它本身依赖于平台)将字节码执行为机器码。即时编译器实际上是 JVM 的一部分,将字节码的真正编译部分转换为机器码,并在必要时缓存字节码。

  4. 垃圾收集包含在 JRE 中。
4

2 回答 2

5

“字节码”的编译由javacJava 编译器完成。而JDK(Java Development Kit)和JRE(Java Runtime Environment)的区别本质上是JDK包含javac,而JRE没有。

字节码形式的编译是真正的编译——字节码格式与原始源代码完全不同。但是字节码必须被解释或进一步编译才能在大多数硬件系统上运行。(已经建立了一些可以直接执行某种形式的字节码的实验性硬件系统。)

在大多数系统上,字节码开始被解释(通过,duh,“Java 解释器”,它是 JRE 的一部分)。当代码执行时,字节码的“热”部分由“即时编译器”(JITC - 也是 JRE 的一部分)编译,然后以与 C++ 或其他“直接”基本相同的效率执行编译”的语言。

需要注意的是,字节码格式与许多传统“两阶段”/“优化”编译器使用的“中间语言”格式非常相似。从这个意义上说javac是传统编译器的前半部分。

于 2013-09-26T01:08:49.317 回答
2

您的类文件是 byte-codes。这些代码对于所有 Java 虚拟机都是相同的。这就是重点,标准库/运行时环境必须在某种程度上特定于平台(因为它弥合了这些差异),您不必担心。Java 编译器生成字节码,它不是运行时环境的一部分。出于同样的原因,您的类等不是编译器的一部分,它只是读取它们。

所以是的 .class 文件 = 字节码形式。

于 2013-09-25T23:57:03.683 回答