首页 / 知识库 / 进大厂必备计算机基础 / 一门语言是怎么诞生的

06 - 两条路:编译 vs 解释

上一章我们把代码变成了一棵结构清晰的树。现在要让它真正跑起来,历史上分出了两条路:编译解释。这两个词你肯定听过(「编译型语言」「解释型语言」),这一章把它们彻底讲明白。

一个绝妙的类比:翻译一本外文书

假设你手上有一本英文书,你只会中文。有两种办法让你「读懂」它:

  • 办法一(编译):先花几天时间,把整本书从头到尾翻译成中文,印成一本中文书。以后你直接读中文书,飞快。
  • 办法二(解释):请一个翻译,你读一句,他现场给你翻一句。省去了提前翻译的功夫,但你每次读都得等他翻。

编程语言让机器执行代码,用的就是这两种思路。

编译型:先全部翻好,再拿去跑

编译型语言(代表:C、C++、Go) 走的是「办法一」:

  1. 一个叫编译器的程序,把你的整份代码一次性翻译成机器码;
  2. 生成一个可以直接运行的成品(比如 Windows 上的 .exe 文件);
  3. 之后运行的时候,机器直接跑这份机器码,不需要再翻译。

它的特点:

  • 跑得快:翻译工作提前一次性做完了,运行时机器直接执行机器码,没有额外开销。
  • 启动前要等编译:改一行代码,往往要重新编译一遍才能看到效果。
  • 挑平台:翻译出来的机器码是针对特定 CPU / 操作系统的,换个平台常常要重新编译。

解释型:边读边翻边跑

解释型语言(代表:Python、JavaScript) 走的是「办法二」:

  1. 一个叫解释器的程序,拿着你的代码,从头一句一句地读
  2. 读一句,理解一句,立刻执行一句;
  3. 没有提前生成完整成品,代码就是「现场被翻译着跑」的。

它的特点:

  • 改完就能跑:不用等编译,写完直接运行,开发体验轻快,特别适合快速试验。
  • 跑得相对慢:每次运行都要现场翻译,天然比「直接跑机器码」多一层开销。
  • 跨平台方便:只要目标机器上装了对应的解释器,同一份代码就能跑,不用为每个平台重新翻译。

现实:大多数语言是「混合」的

到这你可能觉得「非黑即白」,但现实更聪明。很多现代语言走的是折中路线,典型代表就是 Java

  1. 先把代码编译成一种中间形态——不是最终机器码,而是一种通用的「半成品」,叫字节码
  2. 运行时,再由一个叫虚拟机的程序去执行这份字节码。

为什么要多这么一层「字节码」?因为它同时想要两边的好处:

  • 字节码是提前编译好的,比纯解释快;
  • 字节码不绑定具体 CPU,谁装了虚拟机谁就能跑,保住了跨平台。

这就是那句著名口号「一次编写,到处运行」背后的原理:代码只编译成一份通用字节码,剩下的差异全交给各平台自己的虚拟机去抹平。

更进一步,很多虚拟机还会在运行中把「热门的」字节码临时编译成机器码来提速,这叫 JIT(即时编译)。你现在只要知道有这么个「既想快又想通用」的折中思路就够了。

一张表帮你记住

编译型(C)解释型(Python)混合型(Java)
什么时候翻译运行前,一次翻完运行中,边跑边翻先编译成字节码,运行时再执行
运行速度相对慢中间,且能越跑越快
改完能否马上跑要重新编译直接跑要重新编译字节码
跨平台差(常需重编)好(有解释器就行)好(有虚拟机就行)

别去死记「哪个语言属于哪一类」。真正要记住的是那条判断线:翻译这件事,是提前一次做完,还是运行时现场做? 越靠「提前做完」,越快但越死板;越靠「现场做」,越灵活但越慢。

小结

  • 让代码跑起来有两条路,本质区别是:提前翻译好,还是边跑边翻。
  • 编译型(C):提前一次翻成机器码,跑得快,但改完要重编、挑平台。
  • 解释型(Python):边读边翻边跑,改完即跑、跨平台,但相对慢。
  • 混合型(Java):先编译成通用「字节码」,再由虚拟机执行,兼顾速度和跨平台。
  • 记判断线,别背分类:翻译是「提前做」还是「现场做」。
  • 到这里,一门语言从设计到能跑,思路已经完整了。但「能跑」离「好用」还差一截——下一章讲运行时和生态。

上一章 ← 05 - 拆词和搭架子 | 下一章 → 07 - 光有语言还不够:运行时、标准库和生态 | 回到 README 目录