【JVM】编译&&解释

可以把这部分理解成一句话:

Java 不是单纯的编译型语言,也不是单纯的解释型语言,而是"先编译,再解释,运行中再可能即时编译"的混合型语言。


1. 什么是编译?

编译就是:在程序运行之前,先把源代码整体翻译成机器能直接执行的代码。

比如 C 语言:

c 复制代码
hello.c  →  编译器编译  →  hello.exe

生成的 hello.exe 就是机器码文件,操作系统可以直接运行。

所以 C 语言通常叫 编译型语言

特点是:

text 复制代码
源代码 → 机器码 → 直接运行

2. 什么是解释?

解释就是:程序运行时,解释器一边读代码,一边翻译,一边执行。

比如 JavaScript、Python 的常见执行方式:

text 复制代码
源代码 → 解释器逐行解释 → 执行

它通常不会提前生成一个真正的机器码可执行文件。

所以解释型语言的特点是:

text 复制代码
边翻译,边执行

3. Java 为什么特殊?

Java 的执行过程不是简单的一步。

它大概分成三步:

text 复制代码
Java 源代码
   ↓ javac 编译
字节码 .class 文件
   ↓ JVM 解释执行
机器执行

比如:

java 复制代码
Hello.java

先通过 javac 编译成:

text 复制代码
Hello.class

但是注意:

.class 文件不是机器码,而是字节码。

机器不能直接执行字节码,必须交给 JVM


4. 字节码是什么?

字节码可以理解成一种 中间代码

它既不是 Java 源代码,也不是最终的机器码。

text 复制代码
Java 源代码:人能看懂
字节码:JVM 能看懂
机器码:CPU 能看懂

Java 这样设计,是为了跨平台。

比如同一份 .class 文件:

text 复制代码
Windows 上的 JVM 可以执行
Linux 上的 JVM 可以执行
Mac 上的 JVM 也可以执行

也就是常说的:

text 复制代码
一次编译,到处运行

准确点说是:

text 复制代码
一次编译成字节码,只要有对应平台的 JVM,就可以运行

5. JVM 怎么执行字节码?

JVM 执行字节码主要有两种方式:

第一种:解释执行

JVM 的解释器一条一条读取字节码,然后翻译成机器指令执行。

类似:

text 复制代码
字节码 → JVM解释器 → 机器码 → CPU执行

这种方式启动快,但是如果某段代码反复执行,每次都解释就比较浪费。


第二种:JIT 即时编译

JVM 在运行过程中会观察代码。

如果发现某个方法或者循环执行得特别频繁,就会认为它是 热点代码

比如:

java 复制代码
for (int i = 0; i < 1000000; i++) {
    sum += i;
}

这种循环执行次数很多,JVM 就可能觉得:

text 复制代码
这段代码太常用了,别每次解释了,直接编译成机器码吧。

于是 JIT 编译器会把这段热点字节码编译成机器码。

之后再执行这段代码时,就可以直接执行机器码了,速度更快。

流程是:

text 复制代码
热点字节码 → JIT编译器 → 机器码 → 直接执行

6. 所以 Java 到底是编译型还是解释型?

严格来说:

Java 同时包含编译和解释。

因为它先有一次编译:

text 复制代码
.java → .class

这是编译。

然后运行时 JVM 解释执行字节码:

text 复制代码
.class → JVM解释执行

这是解释。

运行过程中,热点代码还会被 JIT 编译成机器码:

text 复制代码
热点字节码 → 机器码

这又是编译。

所以 Java 的完整过程可以理解为:

text 复制代码
.java 源文件
   ↓ javac 编译
.class 字节码
   ↓ JVM 解释执行
机器执行

运行过程中:
热点代码
   ↓ JIT 即时编译
机器码
   ↓ 直接执行

7. AOT 又是什么?

AOT 是 Ahead Of Time,提前编译。

它和 JIT 不一样。

JIT 是:

text 复制代码
运行时发现热点代码,再编译成机器码

AOT 是:

text 复制代码
程序运行前,就提前编译成机器码

所以 AOT 更接近传统编译型语言。

比如:

text 复制代码
Java代码/字节码 → AOT编译 → 本地机器码

这样程序启动可能更快,因为不需要运行时再慢慢解释和 JIT 优化。


8. 面试可以怎么说?

可以这样回答:

Java 不能简单地说是编译型语言或者解释型语言,它是编译和解释并存的语言。Java 源代码会先通过 javac 编译成字节码文件,也就是 .class 文件,这一步属于编译。但字节码不是机器码,不能被 CPU 直接执行,需要交给 JVM 解释执行。在程序运行过程中,如果 JVM 发现某些方法或代码块执行得很频繁,就会通过 JIT 即时编译器把这些热点代码编译成本地机器码,提高执行效率。所以 Java 是一种既有编译过程,也有解释执行,同时还支持 JIT 优化的语言。

再简短一点:

Java 是半编译半解释型语言。先通过 javac 编译成字节码,再由 JVM 解释执行;运行过程中热点代码会被 JIT 编译成机器码直接执行,所以 Java 既有编译,也有解释。

相关推荐
J-Tony114 小时前
【JVM】JVM调优经验
jvm·测试工具
weixin_523185327 小时前
Java基础知识总结(二):JVM内存结构与变量生命周期
java·开发语言·jvm
吴声子夜歌11 小时前
JVM——并发容器实现原理
java·jvm·并发容器
J-Tony1112 小时前
【JVM】JIT编译器
jvm
吴声子夜歌13 小时前
JVM——原子操作类实现原理
jvm·原子操作类
且听风吟_xincell14 小时前
从零用 TypeScript 写一个 TCP 聊天室(下)——数据持久化、登录验证与管理指令
jvm·tcp/ip·typescript
J-Tony111 天前
【JVM】根可达算法
jvm·算法
wuminyu1 天前
Java锁机制之Java对象重量级锁源码剖析
java·linux·c语言·jvm·c++
J-Tony111 天前
【JVM】垃圾回收
jvm