1、预处理(prepressing)
· 将"#define","#if"等宏定义,条件编译指令展开
· 删除注释"//"和'/**/'
· 添加行号和文件名标识
· 保留所有"#pragma"编译器指令
· output: *.i
2、编译(compilation) ---- 核心 --- as
· 词法分析
· 语法分析
· 语义分析
· 优化后生产相应的汇编代码
· output: *.s
3、汇编
· 根据汇编指令和机器指令的对照表一一进行翻译
· output: *.o
4、链接
· 链接所有*.o文件,生成可执行文件
· output: *.out
-------------------------------------------------------------------------------------------------
编译过程分为6步:
扫描 - 词法分析 - 语义分析 - 源代码分析 - 代码生成 - 目标代码优化
· 词法分析 --- 使用lex层序实现词法扫描
运用一种类似于有限状态机(Finite State Machine)的算法将源代码的字符序列分割成一系列的记号(token),词法分析产生的几号一般可分为以下几类:关键字,标识符,字面量(包括数字,字符号等)和特殊符号(如加号,等号)
· 语法分析 --- 使用yacc (Yet Another Compiler Compliler)工具
词法分析其(Grammar Parser)将由扫描器产生的记号进行词法分析,从而产生语法书(Synatax Tree),整个过程采用了上下文无关语法。
· 语义分析
编译器所能分析的语义是“静态语义”(Static Sematic),即编译期间即可确定的语义,如声明,类型转换等。
· 中间语言生成
源码级优化器(Source Code Optimizer),将语法树等转换为中间代码(Intermediate Code),如三址码(x = y op z)和p-代码,中间代码使编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换为目标代码。
· 目标代码生成与优化
编译器后端主要包括代码生成器(Code Generator)与目标代码优化器(Target code Optimizer), 代码生成器将中间代码转换为目标机器代码。目标代码优化器对上述代码进行优化(比如选择合适的寻址方式,使用位移代替惩罚,删除多余指令等)。