Appearance
题目
将高级语言源程序转换为机器目标代码文件的程序是( )。
错因
A
把"汇编程序"和"编译程序"混了。汇编程序(Assembler)的输入是汇编语言源程序(如 mov ax, bx),输出是机器目标代码——它处理的是"低级语言 → 机器码",不是"高级语言 → 机器码"。题面明说源是高级语言(C / Java / Pascal 等),不归汇编程序管。
B
链接程序(Linker)的输入是若干已经编译好的目标文件(.o / .obj),输出是可执行文件。它做的是"把多个目标模块拼起来 + 解析符号引用",根本不接收高级语言源代码。常被认成"生成可执行文件 = 编译",但链接是编译流水线最后一步,前面还有编译/汇编。
D
解释程序(Interpreter)也吃高级语言源程序,但它边解释边执行——每读一句源代码、立刻翻译并运行,不产生可保存的目标代码文件(如 Python、JavaScript 解释器)。题面要求"转换为机器目标代码文件",强调有持久化的目标文件产物,解释程序不符合。
总解析
核心区分:把"输入是什么、输出是什么、有没有目标文件"三个维度排齐:
| 程序 | 输入 | 输出 | 是否生成目标文件 |
|---|---|---|---|
| 编译程序(Compiler) | 高级语言源程序 | 机器目标代码(.o / .obj) | ✓ |
| 汇编程序(Assembler) | 汇编语言源程序 | 机器目标代码 | ✓ |
| 链接程序(Linker) | 多个目标文件 | 可执行文件 | ✓(但输入不是源代码) |
| 解释程序(Interpreter) | 高级语言源程序 | 直接执行结果 | ✗ |
题目两个关键词:高级语言(排除汇编程序、链接程序)+ 目标代码文件(排除解释程序),交集只剩 编译程序。
最终答案是 C(编译程序)。
典型编译流水线(理解了就再不混淆):
高级语言源程序 (.c)
│ ─── 编译程序 ───▶ 汇编代码 (.s)
│ │ ─── 汇编程序 ───▶ 目标文件 (.o)
│ │ ─── 链接程序 ───▶ 可执行文件 (a.out)