更新:2024-1-28
构建:编译、链接合并到一起的过程
一、预处理Prepressing
你们随便找篇博客、找本书吧,都有。查看.i文件,可以检查宏定义、头文件包含是否正确。
- 输入:.c (以C语言为例)
- 输出:.i
- gcc指令:gcc -E main.c -o main.i
二、编译Compilation
词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件
1、扫描(词法分析):源代码输入到扫描器,将代码的字符序列分割成一系列的记号(Token),包括关键字、标识符、字面量(数字、字符串etc)、特殊符号(加号、等号etc)。构建初步的符号表、文字表。
2、语法分析(检查表达式是否合法:括号不匹配,表达式缺少操作符etc)
3、语义分析-判断语句是否真的有意义(两个指针做乘法语法上ok,语义上不行)。此时只能做静态语义分析。(静态语义通常包括声明和类型匹配、类型的转换;动态语义:运行期出现的语义相关问题,比如除0)
4、源代码优化:将语法树转换成中间代码(常见的有三地址码、P-代码)。2 + 6写成8;不用的代码直接删除etc。
5、代码生成:依赖目标机器,将中间代码转换成目标机器代码
6、目标代码优化:eg选择合适的寻址方式、位移代替乘法、删除多余指令等。
- 输入:.c / .i
- 输出:.s
- gcc指令:gcc -S main.c -o main.s / gcc -S main.i -o main.s
三、汇编Assembly
将汇编代码转换成机器可以执行的指令。每一条汇编语句几乎都对应一条机器指令。根据汇编指令和机器指令的对照表一一翻译即可。
- 输入:.c / .s
- 输出:.o
- gcc指令:gcc -c main.c -

最低0.47元/天 解锁文章
348

被折叠的 条评论
为什么被折叠?



