当我们在编译器上写好C代码,提交并运行后,屏幕上将会出现运行结果,在运行过程中,编译器完成了编译和链接(翻译环境),接着完成了代码的执行(执行环境)。接下来,让我们笼统的来聊一聊翻译环境以及翻译环境中的编译和链接。
一、翻译环境
在翻译环境中,源代码经过编译和链接,被转换为可执行的机器指令(即二进制指令)。而编译,又被分为预处理(预编译)、编译、汇编三个过程。
PS:一个C语言程序当中可能会有多个.c文件,每个.c文件都会单独经过编译器处理生成对应的目标文件(.obj文件)。
接着,多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。
1.编译
1.1预处理
在预处理阶段,主要处理以#开头的一些预编译指令,并且经过预处理,源文件(.c)和头文件(.h)会被处理成以.i 为后缀的的文件。主要处理如下:
(1)#define将被删除,并且宏定义将被替换成所代表的数据
(2)所有注释将被删除
(3)将#include包含的头文件内容导入到该指令所在位置
(4)添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等
(5)保留所有的#pragma的编译器指令,编译器后续会使⽤
1.2编译
在汇编阶段,会对预处理的的文件进行一系列操作,如:词法分析、语法分析、语义分析及优化,并生成汇编代码 。
词法分析:即将语句中的字符分割成记号,例如:a+b=6; 这条语句中a被视为标识符,+被视为加号,b被视为标识符,=被视为赋值,6被视为数字。
语法分析:对词法分析产⽣的记号进⾏语法分析,从⽽产⽣语法树。
例如a+b=6,生成语法树如图:
语义分析:即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。
1.3汇编
即将汇编代码转变为机器指令(二进制指令),每一条汇编代码都几乎对应一条机器指令。
2.链接
链接的过程是非常复杂的,候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
二、运行环境
如果大家对运行环境感兴趣可以参考下图:
以上便是翻译环境以及编译链接的全部内容。