
一块代码要生成可执行程序需要经过编译(编译器完成)和链接(链接器完成)两个操作。而编译又细分为预处理,编译和汇编(即编译=预处理+编译+汇编)
如下图解:

预处理阶段主要处理那些源⽂件中#开始的预编译指令。⽐如:#include,#define。
处理的规则如下:
编译过程又分为:词法分析、语法分析、语义分析及优化
将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,一一读取代码中的字符中系列的记号(关键字、标识符、字⾯量、特殊字符等),但不会读取 空格,换行,制表符 等等,比如 printf( "%d" , 10 );

因为它会忽略空格,换行,制表符 等等所以下面式子是等价的


甚至可以写成以下形式也是可行的(同样等价)

如果你不想让别人看懂你写的代码你可以这么写。(哈哈开玩笑)
这里这样的写是为了方便大家理解
语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树,这些语法树是以表达式为节点的树,比如语句array[index]=(index+4)*(2+6);生成的语法树

由语义分析器来完成语义分析,即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。

汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。
链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。