天天看点

C++/C从源代码到可执行文件过程

C++语言处理的过程

经历的过程为:

源代码–>编译预处理–>编译–>优化–>汇编–>链接–>可执行文件

具体详细如下:

编译预处理-宏、条件编译指令-头文件指令

读取源程序,对其中的伪指令(以#开头的指令)和特殊符号进行预处理。

  1. 宏定义指令:如#define Name TokenString #undef等。对于#define,预编译所做的就是将程序中的Name全部替换成TokenString。对于后一个,则取消宏定义,使得字符串Name不被替换。
  2. 条件编译指令:#ifdef #ifndef #else #elif #endif等。这些伪指令的引入使得程序员来区区别定义不同的宏来决定编译对哪些代码进行处理。预编译程序根据有关的文件,将哪些不必要编译的代码过滤掉。
  3. 头文件包含指令:#include 。预编译程序将头文件的定义统统加入到它所长生的输出文件中,以供编译文件使用。
  4. 特殊符号:预编译可以识别一些预编译符号。

编译阶段-主要是语法处理

经过预编译处理的输出文件中,将只有常量。如数字、字符串、变量的定义,以及语言的关键字,如main、if、while等。预编译工作是通过词法分析和语法分析,在确认所有的指令都符合语法规则后,将其翻译成等价的中间代码表示或者汇编代码。

优化阶段

优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有关系。优化一部分是对中间代码的优化。这种优化不依赖于计算机。另一种优化则是针对目标代码的生成进行。

  1. 对中间代码的优化:删除公共表达式、循环优化(强度削弱、代码外提、已知代变量合并等)、无用赋值等。
  2. 对目标代码的优化:同机器的硬件结构紧密相关,最主要考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,根据机器硬件执行指令的特点而对指令进行一些调整使目标代码比较简短,执行效率高。

汇编阶段

汇编过程实际上是指吧汇编语言翻译成目标机器指令的过程。

链接程序

由汇编程序生成的目标文件并不能立即被执行。

链接程序是将有关的目标文件批次链接,也即将一个文件中引用的符号同该符号所在的另外一个文件中的定义链接起来,使得所有的这些目标文件成为一个能够操作系统装入执行的统一整体。

  1. 静态链接:函数的代码将从其他静态链接库中拷贝在最终的可执行文件。
  2. 动态链接:函数的代码被放到成为动态链接库或共享对象的某个目标文件中。链接程序只是在最终可执行程序中记录下共享对象的名字以及其他少量登记信息。

继续阅读