# 编译器、解释器和汇编器

> CIE A-Level 计算机科学 · 9618 (2022-2024)
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u5-compilers-interpreters-and-assemblers/

本子主题介绍三类核心系统翻译器，讲解每种如何将人类可读的源代码转换为可执行机器码。你将学习它们的功能，比较优缺点，并掌握考试中常考的常见应用场景。

**先修:** [对系统软件的基础理解](https://www.owlsprep.com/zh/study/cie-9618-u5-introduction-to-system-software/); 高级编程语言和低级编程语言的区别

## 学习目标

- 按功能区分编译器、解释器和汇编器
- 解释每种翻译器的核心用途
- 比较每种翻译器的优缺点
- 确定每种翻译器的合适应用场景

## 1. 汇编器：功能和核心性质

**汇编器** — 将低级汇编语言源代码转换为处理器专属机器码的翻译程序。对于目标处理器，每条汇编指令对应恰好一条机器码指令。

*例:* ARM汇编器将ARM汇编助记符转换为可在ARM处理器上原生运行的二进制机器码。

汇编语言为机器指令使用人类可读的助记符（缩写），为内存位置使用符号标签。汇编器在翻译过程中将这些符号解析为实际的二进制内存地址。

**例题:** 解释为什么在树莓派上运行汇编程序需要汇编器。

1. 树莓派的ARM处理器只能执行二进制机器码，不能执行人类可读的汇编助记符。
2. 汇编器将每条汇编指令转换为对应的二进制机器码，并将所有符号标签解析为实际的内存地址。
3. 输出是完全可执行的二进制文件，可以直接加载并在树莓派处理器上运行。

> **考试提示:** 描述汇编器时一定要提到1条汇编指令对应1条机器码指令——这是常见的给分点。

## 2. 编译器：功能、优缺点

**编译器** — 在执行前一次性将整个高级源代码程序转换为独立可执行机器码（或目标代码）的翻译程序。运行编译后的输出不需要原始源代码。

*例:* C编译器将所有`.c`源文件转换为可在Windows上原生运行的独立`.exe`可执行文件。

编译器会执行多个翻译阶段，包括词法分析、语法检查、语义分析、代码生成和优化。优化后的可执行文件可以分发给没有安装编译器的最终用户。

**例题:** 一位开发者想要向10万没有安装编程工具的用户分发一款桌面应用。解释为什么编译器是这里的正确选择。

1. 编译器生成独立可执行文件，不需要原始源代码或任何编程工具即可在用户设备上运行。
2. 编译后的代码直接在处理器上运行，因此比通过解释器运行的代码快得多。
3. 编译器可以在翻译过程中优化代码，生成更小、更快的应用，提升最终用户体验。

## 3. 解释器：功能、优缺点和比较

**解释器** — 在执行过程中逐行读取并执行源代码，而非提前翻译整个程序的翻译程序。不会生成独立可执行文件，因此每次运行程序都需要解释器。

*例:* Python和JavaScript通常在开发和Web应用中通过解释器运行。

解释器遇到某一行的错误就会立即停止执行，因此可以轻松快速识别和修复问题。小幅修改后不需要完全重新翻译，因此可以加快开发和测试的速度。

**例题:** 一位初学编程的开发者在学习时测试小段Python代码，使用的是解释器。解释为什么这很合适。

1. 解释器允许立即运行代码，每次修改后不需要提前完成完整编译步骤。
2. 如果某一行存在错误，解释器会停在该行，方便初学者快速找到并修复错误。
3. 没有编译等待时间意味着程序员可以比编译工作流更快地测试想法、学习知识。

| 特性 | 编译器 | 解释器 | 汇编器 |
| --- | --- | --- | --- |
| 翻译时机 | 执行前完成全部翻译 | 执行过程中逐行翻译 | 执行前完成全部翻译 |
| 输出 | 独立可执行文件 | 无独立可执行文件 | 可执行机器码 |
| 执行速度 | 快 | 慢 | 极快 |
| 错误报告 | 翻译完成后报告所有错误 | 遇到第一个错误就停止 | 汇编完成后报告错误 |
| 主要应用场景 | 分发最终用户应用 | 开发、教学、脚本 | 低级系统编程 |

## 常见错误

- **错误做法:** 声称解释器会在执行前提前将所有源代码翻译为机器码。
  - 原因: 这混淆了编译器和解释器。提前完成完整翻译是编译器的定义性特征。
  - 正确做法: 说明解释器在执行过程中逐行翻译并执行源代码，不会提前完成完整翻译。
- **错误做法:** 声称汇编器将高级语言翻译为机器码。
  - 原因: 汇编器仅翻译低级汇编语言，不翻译高级源代码。
  - 正确做法: 说明汇编器将低级汇编语言转换为处理器专属机器码，一条汇编指令对应一条机器码指令。
- **错误做法:** 声称所有编译后的代码都绑定到单一处理器架构。
  - 原因: 这仅对原生编译的机器码成立。编译后的中间字节码（如Java字节码）可以在任何有合适运行时的架构上运行。
  - 正确做法: 说明原生编译的机器码是架构特定的，而编译后的中间代码是跨平台的。
- **错误做法:** 混淆汇编器输出和编译器输出。
  - 原因: 两者都生成机器码，但它们的输入类型不同，这是阅卷老师寻找的核心区别。
  - 正确做法: 始终说明每种翻译器的输入类型：汇编器 → 汇编语言，编译器 → 高级源代码。

## 速查表

| 翻译器 | 输入 | 核心特征 | 常见应用场景 |
| --- | --- | --- | --- |
| 汇编器 | 低级汇编语言 | 1条指令 → 1条机器码，提前翻译 | 低级固件、驱动开发 |
| 编译器 | 高级源代码 | 提前完成全部翻译，独立输出 | 分发最终用户应用 |
| 解释器 | 高级源代码/字节码 | 执行过程中逐行翻译 | 开发、教学、脚本 |

## 下一步

对于CIE 9618的系统软件和软件开发来说，理解翻译器是所有高级主题的核心基础。这些知识会帮助你学习编译的各个阶段、链接器和加载器如何准备代码执行，以及如何为不同平台构建软件。你在回答试卷1和实践评估中关于编程语言分类和系统架构的问题时，也会用到这些区分。

- [链接器和加载器](https://www.owlsprep.com/zh/study/cie-9618-u5-linkers-and-loaders/)
- [虚拟内存](https://www.owlsprep.com/zh/study/cie-9618-u5-virtual-memory/)
- [文件管理](https://www.owlsprep.com/zh/study/cie-9618-u5-file-management/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u5-compilers-interpreters-and-assemblers/
