编译器做了什么
从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。
编译的过程一般可以分为6步:
- 扫描(词法分析)
- 语法分析
- 语义分析
- 源代码优化(生成中间语言)
- 代码生成
- 目标代码优化
扫描(词法分析)
源代码程序首先被输入到扫描器,进行词法分析,运用一种类似于有限状态机的算法可以将源代码分割成一系列记号(token)。
词法分析产生的记号一般可以分为如下几类:关键字,标识符,字面量(包含数字,字符串等)和特殊符号。在识别记号的同时,扫描器也完成了其他工作。比如将标识符存放到符号表,将字符串和数字等常量存放到文字表等,以备后面的步骤使用。
对于有预处理的语言,比如C语言,一般不归入编译器范畴而交个一个独立的预处理器。
语法分析
语法分析器将对有扫描器产生的记号进行语法分析,从而产生语法树。整个过程采用了上下文无关语法的分析手段。
在语法分析的同时很多符号的优先级和含义也被确定下来,另外有些符号有多重含义也会进行区分,如果出现表达式不合法,比如括号不匹配,缺少操作符,编译器就会报告语法分析阶段的错误。
语义分析
语法分析仅仅是完成了对表达式语法层的分析,但是并不了解这个语句是否真正有意义,比如两个指针做乘法运算时没有意义的,但是在语法上是合法的。编译器所能分析的语义是静态语义,就是编译期可以确定的语义。
静态语义通常包括声明和类型的匹配,类型的转换。经过语义分析阶段后,整个语法树的表达式都被标识了类型,有些需要类型转换的表达式则会在相应的位置插入转换节点。
源代码优化(生成中间语言)
中间代码使编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。
目标代码生成和优化
编译器后端主要包括代码生成器和目标代码优化器。
代码生成器将中间代码转换成目标机器代码,这个过程依赖于目标机器。
目标代码优化器就是对生成的目标代码进行优化,比如选择合适的寻址方式,使用位移来代替乘法,删除多余的指令等。
网友评论