【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 既有编译,也有解释。

相关推荐
colinu9 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu10 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
DongQiShanRen11 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
leisoo809720 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
leisoo809721 小时前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
晒太羊的猫1 天前
jvm面试题
jvm
夜之眷属2 天前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
用户094248568032 天前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
阿俊-全栈开发2 天前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城
Nebula_g2 天前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈