- 一个程序的运行,标准情况下,需要四个步骤:预处理,编译,汇编和链接。
- 预处理阶段:源代码文件和相关的头文件被预编译成扩展名为.i的文件。预编译过程主要处理那些源代码文件中的以“#”开头的预编译指令。
- 编译阶段:编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。细分的化,编译过程一般可以分为6步:扫描,语法分析,语义分析,源代码优化,代码生成和目标代码优化。
- 汇编阶段:将汇编代码转变成机器可以执行的指令(目标文件),每一个汇编语句几乎都对应一条机器指令。
- 链接阶段:将目标文件转变成可执行文件。
- 编译器就是将高级语言翻译成机器语言的一个工具。
- 静态语义:编译器可以确定的语义。
- 动态语义:运行期可以确定的语义。
- 词法分析:源代码程序被输入到扫描器,扫描器运用类似于有限状态机的算法将源代码的字符分割成一系列的记号。
- 语法分析:语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树(以表达式为节点的树),整个分析过程采用了上下文无关的分析手段。
- 语义分析:对语法树进行标识,使其具有意义。
- 源代码优化器在源码级别进行优化。
- 源代码优化器将语法树转化成中间代码。中间代码使得编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码。编译器后端将中间代码转化成目标代码。
- 编译器后端主要包括代码生成器和目标代码优化器。
- 编译器可以将源代码编译成一个未链接的目标文件,然后由连接器最终将这些目标文件链接起来形成可执行文件。
- 重新计算各个目标地址的过程叫做重定位。
- (静态)链接的主要任务就是把各个模块之间的相互引用的部分都处理好,使得各个模块之间能够正确的衔接。链接过程主要包括了地址和空间的分配,符号决议和重定位。
- 静态链接的简单过程是:每个模块的源代码文件经过编译器编译成目标文件(windows下扩展名是.obj,linux下的扩展名是.o),目标文件和库(运行库)一起链接形成可执行文件。
- 运行库支持程序运行的基本函数的集合,是目标文件的集合。