IDE一般把编译和链接合并到一起,称为构建(build)。
4个步骤:
- 预处理(Prepressing)
- 编译(Compilation)
- 汇编(Assembly)
- 链接(Linking)
1、预处理
$ gcc -E hello.c -o hello.i
-E表示只进行预处理。
主要处理规则如下:
- 将所有的 #define 删除,并且展开所有宏定义。
- 处理所有条件预编译指令,比如#if,#ifdef,#else,#endif
- 处理 #include,将被包含的文件插入到该预编译指令的位置。这个过程是递归进行的。
- 删除所有的注释 // 和 /**/
- 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
- 保留所有的 #pragma 编译器指令,因为编译器须使用它们。
2、编译
编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析以及优化后产生相应的汇编代码文件。
$ gcc -S hello.i -o hello.s
======================================================================================================================
编译过程:
扫描器(Scanner)
有限状态机(Finite State Machine)
记号(Token)
语法分析器(Grammer Parser)
语法树(Syntax Tree)
语义分析器(Semantic Analyzer)
静态语义(Static Semantic):指在编译期可以确定的语义。
动态语义(Dynamic Semantic):只有在运行期才能确定的语义。
源码优化器(Source Code Optimizer)
中间代码(Intermediate Code)
代码生成器(Code Generator)
目标代码优化器(Target Code Optimizer)
经过这些扫描、语法分析、语义分析、源代码优化、代码生成、目标代码优化、
====================================================================================================================
3、汇编
汇编器就是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
$ gcc -c hello.s -o hello.o
4、链接
链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。
链接的过程主要包括:地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)、重定位(Relocation)