1.GCC 的编译过程
预处理cpp gcc -E hello.c -o hello.i or cpp hello.c > hello.i
主要是展开所有的#define #include,#if 等等
编译
进行编译原理那些(词法分析,语法分析,语义分析,优化等)
gcc -S hello.i -o hello.s
生成的就是汇编代码。
汇编
将汇编器是将汇编代码转变成及其可以执行的指令。
as hello.s -o hello.o
or
gcc -c hello.s -o hello.o
链接
链接器将我们需要的.a库 和生成的.o 链接成可执行的文件。
ld 命令就是用来干这个的。
编译原理:
词法分析:"翻译"源代码,用利用有限状态机的算法来翻译为token。
语法分析:产生语法树,上下文无关文法。
语义分析:静态语义(声明和类型的匹配, 类型的转换),动态语义(?没有找到相应解释 )
中间语言生成
三地址码 和 p-code
目标代码的生成:
源代码优化器中间代码标志着下面都属于编译器后端。编译器后端主要包括代码生成器和目标代码优化器。
代码生成器把中间代码生成为目标代码。
优化过程:选择合适的寻址方式,使用位移来代替乘法运算,删除多余的代码。
2.链接器:
链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。
主要内容:地址和空间的分配,符号决议和重地位。