Java 中的编译过程

Compilation process in Java

编译过程将源代码翻译成机器语言。

到目前为止,我已经提到了 .java 文件(源代码)和 .exe 文件(0s 和 1s ).

So, What is the purpose of .class files that seem to be in the middle of the entire process?

我们已经有来自 java 源代码的可执行文件,它们不依赖于这些 .class 文件。

我知道 .class 文件也是在编译后创建的,但是它们的内容(我不知道)与 .exe 文件不同,因为它们只能 运行 带有 java 编译器而不是像可执行文件那样的独立应用程序。

谢谢!

Java 被创建为独立于平台。 .class 文件包含 JVM(Java 虚拟机)代码,而不是 .exes 中的普通机器代码。 JVM 是理想化的,具有真正处理器实际不具备的功能,但它没有 Java 本身的语言复杂,并且是平台特定硬件之上的抽象层。

当 Java 程序是 运行 时,JVM 解释 Java 字节码,以便它实际上可以 运行 在 CPU 上。初始的 javac 编译使 JVM 不必在执行时编译整个程序并影响性能,而只要安装了 JVM,抽象就可以让代码 运行 随处可见。

这与直接包含平台特定机器代码的 .exe 文件形成对比。 Windows 本身提供了防止破坏的抽象,但是因为代码仍然是特定于平台的,所以它不能在非 Windows 系统上工作,并且有单独的版本用于 32 位和 64 位系统(当然,除非是模拟器)。

与直接加载机器代码的 .exe 文件相比,JVM 所做的字节码解释仍然非常昂贵。因此,如果代码的某些部分被调用得足够多,JIT(即时编译器)将启动并将 JVM 代码直接编译为平台特定的机器代码并将其存储在内存中以提高这些活动区域的性能。如果该代码区域使用得足够多,JIT 也会对该代码进行优化,并且因为它可以 运行 对 运行ning 代码进行分析,所以它可以根据 .exe 编译器无法做出的假设进行优化。这就是为什么许多大型 Java 程序在开始更有效地工作之前都有预热时间。