06 - 两条路:编译 vs 解释
上一章我们把代码变成了一棵结构清晰的树。现在要让它真正跑起来,历史上分出了两条路:编译和解释。这两个词你肯定听过(「编译型语言」「解释型语言」),这一章把它们彻底讲明白。
一个绝妙的类比:翻译一本外文书
假设你手上有一本英文书,你只会中文。有两种办法让你「读懂」它:
- 办法一(编译):先花几天时间,把整本书从头到尾翻译成中文,印成一本中文书。以后你直接读中文书,飞快。
- 办法二(解释):请一个翻译,你读一句,他现场给你翻一句。省去了提前翻译的功夫,但你每次读都得等他翻。
编程语言让机器执行代码,用的就是这两种思路。
编译型:先全部翻好,再拿去跑
编译型语言(代表:C、C++、Go) 走的是「办法一」:
- 一个叫编译器的程序,把你的整份代码一次性翻译成机器码;
- 生成一个可以直接运行的成品(比如 Windows 上的
.exe文件); - 之后运行的时候,机器直接跑这份机器码,不需要再翻译。
它的特点:
- 跑得快:翻译工作提前一次性做完了,运行时机器直接执行机器码,没有额外开销。
- 启动前要等编译:改一行代码,往往要重新编译一遍才能看到效果。
- 挑平台:翻译出来的机器码是针对特定 CPU / 操作系统的,换个平台常常要重新编译。
解释型:边读边翻边跑
解释型语言(代表:Python、JavaScript) 走的是「办法二」:
- 一个叫解释器的程序,拿着你的代码,从头一句一句地读;
- 读一句,理解一句,立刻执行一句;
- 没有提前生成完整成品,代码就是「现场被翻译着跑」的。
它的特点:
- 改完就能跑:不用等编译,写完直接运行,开发体验轻快,特别适合快速试验。
- 跑得相对慢:每次运行都要现场翻译,天然比「直接跑机器码」多一层开销。
- 跨平台方便:只要目标机器上装了对应的解释器,同一份代码就能跑,不用为每个平台重新翻译。
现实:大多数语言是「混合」的
到这你可能觉得「非黑即白」,但现实更聪明。很多现代语言走的是折中路线,典型代表就是 Java:
- 先把代码编译成一种中间形态——不是最终机器码,而是一种通用的「半成品」,叫字节码;
- 运行时,再由一个叫虚拟机的程序去执行这份字节码。
为什么要多这么一层「字节码」?因为它同时想要两边的好处:
- 字节码是提前编译好的,比纯解释快;
- 字节码不绑定具体 CPU,谁装了虚拟机谁就能跑,保住了跨平台。
这就是那句著名口号「一次编写,到处运行」背后的原理:代码只编译成一份通用字节码,剩下的差异全交给各平台自己的虚拟机去抹平。
更进一步,很多虚拟机还会在运行中把「热门的」字节码临时编译成机器码来提速,这叫 JIT(即时编译)。你现在只要知道有这么个「既想快又想通用」的折中思路就够了。
一张表帮你记住
| 编译型(C) | 解释型(Python) | 混合型(Java) | |
|---|---|---|---|
| 什么时候翻译 | 运行前,一次翻完 | 运行中,边跑边翻 | 先编译成字节码,运行时再执行 |
| 运行速度 | 快 | 相对慢 | 中间,且能越跑越快 |
| 改完能否马上跑 | 要重新编译 | 直接跑 | 要重新编译字节码 |
| 跨平台 | 差(常需重编) | 好(有解释器就行) | 好(有虚拟机就行) |
别去死记「哪个语言属于哪一类」。真正要记住的是那条判断线:翻译这件事,是提前一次做完,还是运行时现场做? 越靠「提前做完」,越快但越死板;越靠「现场做」,越灵活但越慢。
小结
- 让代码跑起来有两条路,本质区别是:提前翻译好,还是边跑边翻。
- 编译型(C):提前一次翻成机器码,跑得快,但改完要重编、挑平台。
- 解释型(Python):边读边翻边跑,改完即跑、跨平台,但相对慢。
- 混合型(Java):先编译成通用「字节码」,再由虚拟机执行,兼顾速度和跨平台。
- 记判断线,别背分类:翻译是「提前做」还是「现场做」。
- 到这里,一门语言从设计到能跑,思路已经完整了。但「能跑」离「好用」还差一截——下一章讲运行时和生态。
上一章 ← 05 - 拆词和搭架子 | 下一章 → 07 - 光有语言还不够:运行时、标准库和生态 | 回到 README 目录