Appearance
题目
将高级语言源程序转换为可执行目标文件的主要过程是( )。
错因
B
把"汇编"和"编译"顺序颠倒——把汇编当成"先把源码翻译成机器语言"。但汇编针对的是汇编代码(输入是 .s/.asm 文件),而编译器才是把**高级语言(.c)→ 汇编代码(.s)**的步骤。先编译生成汇编、再汇编生成机器目标文件,这是固定顺序。
C
把链接放在汇编之前。链接的输入是已经汇编完成的多个目标文件(.o)——把它们合并、解析符号、分配地址。如果链接在汇编之前,根本就没 .o 文件可链接。
D
完全乱序:① 汇编先于编译——同 B 的错;② 链接放在了编译前——同 C 的错。
总解析
完整编译链(以 C 语言为例):
| 步骤 | 工具 | 输入 | 输出 | 任务 |
|---|---|---|---|---|
| ① 预处理 | cpp | hello.c | hello.i | 展开宏、#include、#define、条件编译 |
| ② 编译 | cc1 | hello.i | hello.s | 高级语言 → 汇编代码(语法分析、优化、生成目标平台汇编) |
| ③ 汇编 | as | hello.s | hello.o | 汇编代码 → 机器码(可重定位目标文件,含未解析的符号引用) |
| ④ 链接 | ld | hello.o + 库 | hello(可执行) | 合并多个 .o、解析符号、分配运行时地址、生成可执行文件 |
记忆口诀:"先预处理(去掉 # 开头的指令),再编译成汇编,汇编成机器码 .o,最后链接成 .exe / a.out"。
反向核对:每一步的输入必须是上一步的输出 —— 这条规则能瞬间排除任何顺序错误的选项。
最终答案是 A(预处理 → 编译 → 汇编 → 链接)。
易错点:
- 编译 vs 汇编:编译是 C → 汇编代码,汇编才是汇编代码 → 机器码。两者的输入输出必须对得上
- 链接是最后一步——它的输入需要 .o 文件,所以一定排在汇编之后
- 命令行
gcc -E/-S/-c分别对应预处理 / 编译至汇编 / 汇编至 .o,可以亲自跑一遍加深印象