目录
- 1 C程序的执行流程
- 2 翻译环境
- 2.1 预编译
- 2.2 编译
- 2.2.1 词法分析
- 2.2.2 语法分析
- 2.2.3 语法分析
- 2.3 汇编
- 2.4 链接
1 C程序的执行流程
用户编写好的C程序不能直接被计算机识别并执行,在执行前,要先将源文件和头文件进行编译,生成目标文件,再将目标文件与链接库进行链接,生成最终的可执行程序,再由计算机执行
其中,将源代码转换成可执行的机器指令的过程被称为 翻译环境
执行代码的过程被称为 执行环境
在这里,主要说明翻译环境所做的事情
2 翻译环境
翻译环境主要有 编译和链接 两个处理过程
编译的过程还可以拆分为 预编译,编译,汇编 三个小的过程
因此,翻译环境的处理过程为 预编译,编译,汇编,链接
2.1 预编译
预编译阶段所做的事情包括:
- 在代码中,将 #define 定义的常量用它的值进行替换
- 将头文件引入至 #include 的位置处
- 处理条件编译指令,比如:#if,#ifdef,#elif等
- 删除程序内的所有注释
- 生成行号和文件名
- 保留 #pragma 的编译器指令
预编译阶段结束后,会产生 .i 后缀的文件
2.2 编译
编译阶段所做的事情包括 词法分析,语法分析,语义分析及优化
编译结束后,会产生 .s后缀的文件,它保存的都是汇编代码
接下来,针对下面这句代码来进行说明
array[index] = (index+4)*(2+6);
2.2.1 词法分析
在词法分析中要做的事情就是分析代码,将代码拆分成符号
上方的这句代码,就可以做这样子的拆分:
2.2.2 语法分析
在语法分析中要做的事情是分析词法分析阶段产生的符号,从而得到语法树
上面这句代码的语法树如下:
2.2.3 语法分析
语法分析要做的事情就是根据语法树来判断正在分析的代码是否有语法错误,因此,如果有语法错误,会在这个阶段报错
2.3 汇编
汇编阶段要做的事情就是将 编译阶段产生的 .s后缀文件进行解析,生成 .o/.obj 后缀的目标文件,在目标文件内,保存了机器指令,机器指令为计算机可以识别并执行的指令
2.4 链接
每一个源文件,在经过了 预编译,编译,汇编 的过程后,都会生成 .o/.obj 后缀的目标文件,在链接的阶段,就会将这些目标文件链接在一起,生成可执行程序
链接主要有 空间分配,符号决议,重定位 这些过程