第四十六章:编译与解释
复习
- 编译、汇编和链接可以把源代码制成可执行文件。
- 可执行文件最终包含目标机器需要的指令和组织信息。
TL;DR
- 编译是在运行前把程序整体翻译为较低层形式。
- 解释是在运行时由解释器读取并执行程序含义。
- 两者之间还有字节码和即时编译等混合做法。
正文
“某语言是编译型还是解释型”是常见说法,但它很容易把过程想得过于简单。我们刚走过的路线是编译:先把一份源程序制成目标机器可执行的结果,之后 CPU 直接执行那份结果。
另一种办法是准备一个解释器。解释器本身是一段已经能运行的程序;它读取另一份程序的语句,理解其含义,再立即执行相应动作。好比有一位现场翻译:原文不必预先全部译成中文,但每一句要使用时都由翻译员处理。
源代码 → 编译器 → 本机机器码 → CPU
源代码 → 解释器 → 执行相应动作
两种方式各有适合的场景。预先编译常能让运行时少做一些翻译工作;解释器则能让程序更容易在不同机器上运行,只要那里有同一种解释器。实际系统经常把两者结合:先把源代码编译成一种中间的字节码,运行时再由虚拟机解释,或把经常使用的部分即时编译为本机机器码。
因此,语言名称并不能单独决定一切。同一种语言可以有不同实现,同一个实现也能在不同阶段采用不同翻译策略。对我们而言,关键不变:无论经过哪条路,真正驱动硬件的最终仍是某种可以落到机器操作上的指令。
到此我们能写程序,也能得到一份待运行的程序。可假如没有操作系统,谁把它放入内存、设定入口地址、接通显示器和键盘?让我们暂时把系统软件全部拿走,看看程序最原始的处境。
思考题
解释器自己为什么仍然需要先被编译或以其他方式做成可运行的程序?
小结
知识点
- 编译把程序预先转换为较低层形式。
- 解释器在运行时读取并执行程序。
- 字节码与即时编译说明两种做法可以组合。
参考资料
- Aho、Lam、Sethi、Ullman,《编译原理》
- Randal Bryant、David O’Hallaron,《深入理解计算机系统》
思考题答案(仅供参考)
解释器也是由 CPU 执行的程序。CPU 不认识“解释”这个概念,因此解释器本身必须先以机器能启动的形式存在。
协议
本文采用 CC BY-NC-SA 4.0 协议发布。