0.30 解释型与编译型:代码怎么变成可执行
第〇篇「零基础预科」免费。这一篇讲代码写完后,计算机到底怎么"读懂并运行"它。
一、两种翻译方式
编译型
- 代表:C、C++、Go;
- 流程:源码 → 编译器整体翻译成特定平台的机器码(可执行文件)→ 直接运行;
- 特点:运行快,但产物与平台绑定,改代码要重新编译。
解释型
- 代表:Python、JavaScript;
- 流程:源码由解释器在运行时逐行翻译执行,无需先产出机器码文件;
- 特点:灵活、跨平台、方便调试和快速试错。
二、Java 的中间路线(重要)
Java 两者都不完全是:
- 源码
.java先由javac编译成字节码.class(不是某平台机器码,而是 JVM 的指令); - 运行时由 JVM(Java 虚拟机) 加载字节码,解释执行,并可通过 JIT 把热点代码再编译成机器码提速。
正因为字节码与平台无关、由 JVM 统一执行,才有"一次编写,到处运行"。
三、几个相关概念
- 虚拟机(VM):JVM 执行 Java 字节码;V8 是 Google 的 JS 引擎(也用 JIT);
- 字节码(bytecode):面向虚拟机的指令,比机器码更抽象;
- Python 也有
.pyc字节码和 Python 虚拟机,只是对用户更透明。
四、安全视角
- Java 反序列化操纵的正是 JVM 里的类与对象,
TemplatesImpl能把恶意字节码装进_bytecodes、再由 JVMdefineClass加载执行——不理解字节码/类加载,就只能死记; - 编译型漏洞常涉及内存(缓冲区溢出等),解释型常涉及脚本注入;
- 判断"代码在什么环境、以什么形态运行",是分析漏洞的起点。
五、本篇小结
- 编译型先整体翻译机器码、运行快;解释型运行时逐行翻译、灵活。
- Java 先编译为字节码 .class,再由 JVM 解释/JIT,跨平台。
- 理解字节码、虚拟机、类加载,是理解 Java 反序列化的前提。
- 安全分析要搞清代码的形态和执行位置。
下一篇 0.31 讲一项极其实用的能力:怎么读一段没见过的代码。