编译器做了什么

编译器做了什么


从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。

编译的过程一般可以分为6步:

  • 扫描(词法分析)
  • 语法分析
  • 语义分析
  • 源代码优化(生成中间语言)
  • 代码生成
  • 目标代码优化

扫描(词法分析)

源代码程序首先被输入到扫描器,进行词法分析,运用一种类似于有限状态机的算法可以将源代码分割成一系列记号(token)。

词法分析产生的记号一般可以分为如下几类:关键字,标识符,字面量(包含数字,字符串等)和特殊符号。在识别记号的同时,扫描器也完成了其他工作。比如将标识符存放到符号表,将字符串和数字等常量存放到文字表等,以备后面的步骤使用。
对于有预处理的语言,比如C语言,一般不归入编译器范畴而交个一个独立的预处理器。

语法分析

语法分析器将对有扫描器产生的记号进行语法分析,从而产生语法树。整个过程采用了上下文无关语法的分析手段。

在语法分析的同时很多符号的优先级和含义也被确定下来,另外有些符号有多重含义也会进行区分,如果出现表达式不合法,比如括号不匹配,缺少操作符,编译器就会报告语法分析阶段的错误。

语义分析

语法分析仅仅是完成了对表达式语法层的分析,但是并不了解这个语句是否真正有意义,比如两个指针做乘法运算时没有意义的,但是在语法上是合法的。编译器所能分析的语义是静态语义,就是编译期可以确定的语义。

静态语义通常包括声明和类型的匹配,类型的转换。经过语义分析阶段后,整个语法树的表达式都被标识了类型,有些需要类型转换的表达式则会在相应的位置插入转换节点。

源代码优化(生成中间语言)

中间代码使编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。

目标代码生成和优化

编译器后端主要包括代码生成器和目标代码优化器。

代码生成器将中间代码转换成目标机器代码,这个过程依赖于目标机器。

目标代码优化器就是对生成的目标代码进行优化,比如选择合适的寻址方式,使用位移来代替乘法,删除多余的指令等。

你可能感兴趣的:(编译器做了什么)