在Java中,源代码到字节代码的编译究竟在哪里?

时间:2013-09-25 23:53:13

标签: java compilation

我做了一些搜索,试图了解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中。

2 个答案:

答案 0 :(得分:5)

编译为“字节码”由Java编译器javac完成。 JDK(Java Development Kit)和JRE(Java运行时环境)之间的区别主要在于JDK包含javac,而JRE则不包括javac

编译为字节码形式是一种真正的编译 - 字节码格式根本不像原始源。但必须解释或进一步编译字节码才能在大多数硬件系统上运行。 (已经构建了一些可以直接执行字节码形式的实验硬件系统。)

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

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

答案 1 :(得分:2)

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

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