编译程序工作过程的5个阶段2017-11-10 10:00:12

五个阶段图如下:

  • 词法分析:是编译器最开始的阶段,有三个过程:扫描,识别和翻译。扫描器将源代码逐字符扫描,并且识别,待识别一个词后,再将其翻译为token。扫描只需要读入字符即可,翻译只要识别成功就自然能翻译,所以这一步的核心就是识别器,识别器是使用有限自动机来实现的。通过源源不断的读入字符,使用有限自动机来将字符分割为词,并识别它的类别,一般有数字,关键字,标识符和界符。最后分析的结果是一系列的token序列。

  • 语法分析:在词法分析的基础上识别程序的语法结构,比如表达式,赋值语句等等,检查程序中的语法错误,输出语法树。它是一种层次机构分析,常用的分析方法有自上而下分析法如递归子程序和LL(1),自下而上分析法如LR()等。

  • 语义分析:对语法分析后的语法单位要进行语义分析,包括两个阶段:静态语义审查,生成中间代码。中间代码是高级程序语言中各种语法成分的语义机构表示,它介于源语言和目标语言之间。中间代码设置的目的是为了便于进行与机器无关的代码优化,使编译程序改变到目标机更加容易,使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。验证语法是否正确有类型检查,控制流检查,一致性检查。中间语言有四种表示方法:1、逆波兰式2、四元式3、三元式4、语法树。任何语法都可以用这四种表示方法表示。

  • 代码优化:提高代码的质量,在语义分析的基础上可以将一些不必要的或者可以优化的中间代码进行处理。比如有些编译器支持对递归的优化,提高代码的性能。目的是为了使生成的目标代码更高效,达到节省时间和空间的效果。代码优化主要分为两种,一种是与机器无关的优化,另一种是与机器有关的优化。对机器无关的优化主要是对中间代码的优化,有三种:1、全局优化2、局部优化3、循环优化。与机器有关的优化有对寄存器分配的优化和消除无用代码。常见的局部优化有基于DAG(无环有向图)的局部优化算法。

  • 代码生成:根据被优化后的中间代码,生成目标代码。目标代码一般选择汇编语言。原因是使代码生成阶段变得容易。此外指令集的选择以及指令的执行速度问题都是重要的因素。

将语法分析器处于中心位置,当语法分析需要下一个单词就调用词法分析,一旦识别出语法单位就调用语义分析器生成中间代码。



linweiyu

Something should be here;

3 Thoughts

2017-11-10 18:13:35

h

lin

2017-11-10 18:17:14

reply

2017-11-11 00:29:03

hi

Leave a Thought