翻译环境和运行环境
首先在执行代码的时候分为两个大部分:翻译环境和运行环境。其中翻译环境又可分为编译和链接两个部分,运行环境又包括可执行程序和输出结果两个部分。画图象如下: 那么下面具体说一下编译和链接的过程
编译
编译又可分为三个部分,分别是:预编译(也叫预处理),编译,汇编。
预编译
#include是预编译指令,概括性的说C语言中 #开头 的指令是预处理指令,#define定义的符号(也可以说是宏)会被替换,这里的替换是将你定义好的预处理指令替换到主函数的代码中,这是就要小心你定义的宏在计算的时候会不会导致计算的结果是否相符,因为这个替换会涉及运算符的优先级,建议多用括号。
编译
这个过程是将C语言代码转换成汇编代码,这个过程包括三个过程:词法分析,语法分析,语义分析。所谓的此法分析就是将你写的代码扫描一遍,比如说计算机扫描到 [ ,这就是一个左方括号,扫描到 index ,会识别这是一个标识符,这就是词法分析。语法分析过程:将对扫描产⽣的记号进语法分析,从⽽产⽣语法树。这些语法树是以表达式为节点的树。看下面的图就能明白。
最后一个是语义分析,即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分
析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。同样观看下图:
上面就是编译的过程。
汇编
这个过程就是将汇编代码转换成二进制指令,因为计算机只能识别二进制指令。
链接
在编译的过程中会产生目标文件,在VS中目标文件是以obj为后缀,而在Linux环境中后缀为o。
其实在编译的过程中每一个步骤都会产生一个文件,在VS中很难观察出来,因为VS这个集成开发环境封装的太好,可以通过Linux观察,在预处理阶段会产生以 i 为后缀的文件,编译阶段会产生以 s 为后缀的文件,在汇编阶段会产生以 o 为后缀的文件,改文件就是目标文件。之后目标文件会通过链接器(link.exe),产生可执行文件(xx.exe)。这就是链接的过程。