【C语言】C语言编译流程
1. 预处理阶段:
- 移除注释:去除源文件中的注释部分,不会影响程序的执行。
- 处理预处理指令:处理以 # 开头的预处理指令,如宏定义、文件包含等。
- 展开宏定义:将代码中定义的宏展开为实际的代码。
- 文件包含:将 #include 指令指定的文件内容插入到当前文件中。
- 条件编译:根据 #ifdef、#ifndef、#if 等条件指令判断代码段是否应该被编译。
2. 编译 阶段:
- 词法分析:将源代码分解成词法单元,如关键字、标识符、常量等。
- 语法分析:根据语法规则检查词法单元序列是否符合语言语法。
- 语义分析:检查语法正确性以及语义是否合法,生成抽象语法树(AST)。
- 中间代码生成:将抽象语法树翻译成中间代码表示形式,如三地址代码、四元式。
- 优化:对生成的中间代码进行各种优化,如常量传播、死代码消除、循环优化等。
3. 汇编阶段:
- 将中间代码翻译为特定于目标平台的汇编代码。
- 生成目标文件包括目标平台所需的指令、数据段等信息。
4. 链接阶段:
- 符号解析:解析目标文件中的符号引用,确定符号的地址。
- 重定位:将不同目标文件中的相对地址转换为绝对地址,解决地址依赖关系。
- 符号表生成:生成符号表,记录符号的地址信息。
- 库文件链接:将目标文件与系统库文件、用户自定义库文件进行链接。
- 生成可执行文件:生成最终的可执行文件,包括可执行代码段、数据段等信息。