Java 语言常被描述为“编译与解释并存”,这一说法主要源于其独特的运行机制和编译过程。这种特性使得 Java 程序既能在编译时获得一定的性能优化,又能在运行时保持高度的灵活性和跨平台能力。
我们可以将高级编程语言按照程序的执行方式分为两种:
- 编译型:编译型语言open in new window 会通过编译器open in new window将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
- 解释型:解释型语言open in new window会通过解释器open in new window一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
编译过程
-
源代码编译:首先,Java 源代码(.java 文件)被 Java 编译器(javac)编译成 Java 字节码(.class 文件)。这一步骤是标准的编译过程,它将人类可读的源代码转换成机器(JVM)可读的中间代码。
-
字节码解释执行:编译后的字节码文件并不能直接在硬件上执行,而是由 Java 虚拟机(JVM)中的解释器逐条解释执行。解释器读取字节码,并将其转换成对应平台的机器码执行。这个过程是“解释执行”的部分。
编译与解释并存
然而,Java 的执行机制并不止于此。为了提高执行效率,JVM 还引入了即时编译器(JIT Compiler,Just-In-Time Compiler)。JIT 编译器会在程序运行时监视字节码的执行情况,如果某段代码被频繁执行(即“热点代码”),JIT 编译器就会将这部分字节码编译成与当前平台紧密相关的机器码,并缓存起来供后续直接使用。这个过程称为“即时编译”。
好处
- 编译的好处:编译成字节码的过程使得 Java 程序具有跨平台性,因为字节码是平台无关的,可以在任何安装了 JVM 的平台上运行。
- 解释的好处:解释执行使得 Java 程序具有高度的灵活性,可以在程序运行时动态地加载和解释执行新的代码,无需重新编译整个程序。
- 即时编译的好处:JIT 编译器通过即时编译热点代码,将解释执行和编译执行的优点结合起来,既保持了跨平台性和灵活性,又大大提高了程序的执行效率。
所以为什么说 Java 语言“编译与解释并存”?这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。