电脑所能识别的语言为二进制指令,而我们所写的C语言代码是文本信息。为了能使计算机识别并执行C语言代码,就需要翻译环境,使C语言代码翻译为二进制的指令。
1.按下编译按钮的幕后 - 程序的翻译环境
从C语言源代码到计算机可识别的二进制文件,每当我们按下编译按钮时,在编译器背后究竟悄悄地发生了什么?
下图是这背后的大概流程:
从图中的各个流程具体来说,翻译环境包含以下两大各阶段,共四个步骤:
1.编译:
预处理(Preprocessing):在编译之前,源代码会经过预处理器处理。预处理器指令如#include和#define会在此阶段展开,及将包含头文件到目标文件和将define的符号进行替换,并且会删除注释等不必要的内容。
编译(Compilation):在编译阶段,预处理后的源代码会被编译器翻译成汇编语言。汇编语言是与特定硬件架构相关的低级代码。
这个阶段包括语法分析,词法分析,语义分析,符号汇总。它们确保语法的正确性并对代码做出优化,提高程序运行效率。- 汇编(Assembly):汇编器将汇编语言转换成机器语言,即由二进制指令组成的程序。此形成符号表,得到到目标文件。
2.链接:
- 链接(Linking):在链接阶段,编译器将各个目标文件中的代码和数据段合并成一个可执行文件。这就是合并段表。段表包含了关于每个段(例如代码段、数据段)的信息,如起始地址、大小等。它们在这一阶段被整合到一个统一的表格中,以确保最终生成的可执行文件正确地加载和执行各个模块的代码和数据。
在解析重复符号后,编译器会将这些符号按照一定的规则合并成一个符号表。这个过程涉及到符号解析、地址重定位等操作,确保最终生成的可执行文件中每个符号都有唯一的地址。最后,编译器将合并后的符号表与其他段(如代码段、数据段等)一起生成最终的可执行文件。
2.预处理详解
2.1预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIM