繁体   English   中英

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

[英]Where exactly does the compilation of source code to byte code happen in Java?

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM