**编译器(compiler)**在程序运行之前,一次把整个程序从高级语言翻译成机器码。**解释器(interpreter)**则一次翻译并运行一条语句。考题要你比较两者,常见角度是报错方式、速度或发布方式。
本课接在操作系统与应用软件的角色之后,属于软件与系统模块。
为什么程序需要翻译?
处理器只懂机器码,也就是二进制指令。人们用 Python 这类高级语言写程序,是因为它容易阅读。翻译器填补了这个差距。
你写的程序是源代码(source code)。编译器生成的是目标代码(object code),也就是可执行文件。解释器不会生成独立文件。
两者的行为如何?
| 特点 | 编译器 | 解释器 |
|---|---|---|
| 翻译方式 | 一次翻译整个程序 | 运行时一次翻译一条语句 |
| 输出 | 独立的可执行文件 | 不产生文件 |
| 错误 | 尝试完整个程序后列出错误;修正前什么都不会运行 | 在第一个错误处停止;之前的行已经运行过 |
| 再次运行 | 直接运行可执行文件,不需要翻译器 | 每次都重新翻译 |
| 运行速度 | 较快 | 较慢 |
| 发布 | 用户拿到可执行文件,看不到源代码 | 用户需要解释器和源代码 |
例题详解
下面的短程序在第 4 行有错误,因为输入了 totl 而不是 total。
1 total ← 0
2 OUTPUT "Start"
3 total ← total + 5
4 OUTPUT totl
5 OUTPUT "Done"
解释器,逐步追踪:
| 步骤 | 行 | 发生什么 | 屏幕输出 |
|---|---|---|---|
| 1 | 1 | total 设为 0 | 无 |
| 2 | 2 | 显示 Start | Start |
| 3 | 3 | total 变为 5 | 无 |
| 4 | 4 | totl 未定义:报错,运行停止 | 错误信息 |
| 5 | 5 | 从未执行到 | 无 |
用户会看到”Start”,然后是指向第 4 行的错误信息。
编译器:编译器先读完全部五行,在第 4 行发现未定义的 totl 并报告。不会生成可执行文件,所以完全不会运行任何东西,“Start”也不会显示。修正第 4 行并重新编译后,可执行文件才会运行,依次显示 Start、5、Done。
要留意的错误
错误答案:“编译器一行一行地翻译程序,遇到错误就停止。”
这描述的是解释器。
编译器处理整个程序,通常会把错误一起报告,所以你可以一次修正好几个。用一个问题检验你的答案:**代码是否在翻译的同时运行?**如果是,那就是解释器。
第二个失误是写”解释器更快,因为它立刻运行”。它确实开始得早,但每次运行都比较慢,因为翻译被重复了。
自我检测
1. 一家公司想出售游戏,又不想让买家看到源代码。哪种翻译器合适?为什么?
显示答案
编译器。它生成由机器码组成的可执行文件,公司可以发布该文件而保密源代码。
2. 一位学生在学编程,想一边写一边逐行测试。哪种翻译器合适?为什么?
显示答案
解释器。它立刻运行每条语句,并在第一个错误处停下,学生马上就能看出哪一行有问题。
3. 用上面的程序,把错字改正(OUTPUT total)后,会显示什么?
显示答案
第 2 行显示 Start。第 3 行使 total 等于 0 + 5 = 5。第 4 行显示 5。第 5 行显示 Done。输出:Start、5、Done。
接下来学什么
接下来看程序运行时处理器如何应对事件,见用情境解释中断。想一步一步观察循环的追踪,可以试试受限伪代码追踪训练器。
比较题奖励精确的对比用语,例如”整个程序”和”一次一条语句”。线上一对一计算机科学补习的老师可以帮你把这些措辞打磨得更利落。