大纲
C程序不能直接机器执行,需要被翻译为机器语言才能被执行 。
预处理
计算机将对所有的.c文件进行以下操作:
1.所有的#define定义将会被删除,并且相对应定义的宏将会被替换。
#define P 5
int main(){ int main(){
int a=P; >>>>>>>>预处理后>>>>> int a=5;return 0; return 0;
} }
2.所有的条件编译指令将会被处理,如#if、#ifdef、#elif、#else、#endif 。
3.处理#include预编译指令,将包含的头文件的内容展开并替换到此位置,如果头文件内包含了头文件,则从内而外展开。
4.删除所有的注释。
5.添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
6.或保留所有的#pragma的编译器指令,编译器后续会使⽤。
编译
词法分析
预处理后,计算机内的扫描器将对代码里的各种类型字符进行分类整理生成记号,如:
int arr[20]=6+1;
int:关键字,arr:标识符,[:左方括号,20:数字,]:右方括号,=:赋值,6:数字,+:加号,1:数字。
语法分析
语法分析器对记号进行语法分析,产生语法树,形成直观的语法关系。
语义分析
语义分析器在语法层面上对语句进行分析判断,包括声明,类型的匹配等,例如char*传参给int*。计算机将在此阶段反馈语法错误。
汇编
经过编译会生成汇编代码文件,将汇编代码转化为机器指令,几乎每一个汇编语句都对应一条机器指令,此阶段进行的是翻译工作。
链接
此阶段将会把编译后生成的目标文件(.o)进行地址和空间分配,符号决议和重定位等,如果一个文件中存在调用其他文件内容,如test1.c调用test2.c中的函数(my_num)或全局变量,在编译test1.c阶段编译器无法知道my_num的实际地址,只能先搁置,链接时,链接器将所有的.o文件链接,此刻将会找到my_num真正的地址,这个地址修正的过程也叫做重定位。链接过后,便可完整的执行代码了。
完。