一个程序的正确执行需要经过4个阶段,分别是预处理(Preprecessing)、编译(Compilation)、汇编(Assenmbly)和链接(Linking)。
1、预编译
预编译过程主要处理那些源代码文件中的以“#”开始的预编译指令。比如,“#include” “#define”等,主要处理规则如下:
①将所有的“#define”删除,并且展开所有的宏定义;
②处理所有条件预编译指令,比如"#if" "#ifdef" "#elif" "#else" "#endif"。
③处理“#include”预编译指令,将被包括的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包括其他文件。
④删除所有的注释“//” “/**/”
⑤添加行号和文件标识,比如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或者警告时能够显示行号;
⑥保留所有#pragma编译指令吗因为编译器要使用它们。
经过预编译后的.i文件不包含任何宏定义,应为所有的宏已经被展开,并且包含的头文件也已经被插入到.i中去。
2、编译
编译的过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。
现在gcc版本把预编译和编译连个步骤合并成一个步骤,使用一个叫ccl的程序来完成这个步骤。
3、汇编
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应于一条机器指令。
汇编过程可以调用汇编器as来完成。
4、链接
这个过程是一个复杂的过程,后续学习中会继续记录
时间: 2024-09-30 19:08:44