我做了一些搜索,试图了解java源文件的执行方式。我找不到一个明确的答案,说明从JRE和JDK术语开始到结束的步骤。所以我在不同的博客上写下我理解的内容,但有些空白确实存在。对我的理解的更正是最受欢迎的。标记为Q1和Q2的两个问题低于第2点。
写一个HellowWorld.java文件
javac HelloWowrld.java提供HelloWorld.class。那就是它给出了一个字节代码的类文件。现在我可以把这个在Mac中生成的字节码转到windows机器并运行它应该可以正常工作。
Q1:现在这个编译为字节代码,这真的是编译还是解释?
Q2:Javac必须是JDK的一部分而不是JRE?
JRE包含JVM和其他库来创建运行时环境。 JVM(它本身是平台相关的)执行字节码到机器代码。即时编译器实际上是JVM的一部分,它将字节码的真正编译部分转换为机器代码,并在必要时加上缓存字节代码。
答案 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文件=字节码形式。