四大步骤
上一篇文章中的ndk-build,一条命令就把源代码编译成了可以运行的文件,但这里面包含了非常复杂的过程。这个过程分成四个大的步骤:预处理(Prepressing),编译(Compilation),汇编(Assembly),链接(Linking)。
1.预处理
预处理,主要处理那些以#开头的的预编译指令,比如#include,#define等。
2.编译
把预处理过的文件,进行词法分析,语法分析,语义分析,以及优化,这个过程是最复杂的一个步骤。
3.汇编
汇编就是把汇编代码,一条一条的对应着转变成二进制文件。
4.链接
这个过程是最关键的一个步骤,不仅仅涉及到源码代码文件,而且涉及到编译器,以及操作系统,各种库文件。
编译六个小步骤
1.词法分析
扫描器扫描源代码,生成各种词语:关键字,标识符,字面量,运算符(+-*/等)
2.语法分析
语法分析器,就是生成各种以表达式为节点的语法树。
3.语义分析
经过语义分析后的语法树节点,都被赋予了类型。
4.中间代码生成
直接在语法树上做优化,比较困难,所以一般先生成一种中间代码。比较常见的中间代码有三地址码,P代码。
5.目标代码生成
代码生成器生成目标代码,这个过程依赖具体的机器。不同的机器有不同的字长,寄存器,整数类型,浮点数类型。
6.目标代码优化
优化方法很多,比如选择合适的寻址方式,使用位移代替乘法运算,删除多余的指令等。
经过上面六个步骤,大部分问题都解决了,就剩下一个问题:就是互相引用模块里面的变量及函数的地址的确定。这个问题是正是链接需要解决的问题。
链接
所谓的链接技术,就是多个模块互相访问时,怎么找到对方的地址,实际上早在纸带机时代,我们就用到了链接技术,因为多条纸带机之间也需要互相调用访问。
解决这个问题的方法也很简单,就是用符号代替直接的地址。
链接过程主要包括了:
-地址和空间分配
-符号决议
-重定位
经过这么多步骤,我们终于生成了可执行文件,这个可执行文件里面有什么呢?下一篇文章里面我们一起去探究。
网友评论