编译过程
按照编译的典型划分方法可把编译划分为六个过程,上一篇里我们已经看到了阶段图,这一篇里开始分述各个过程。
-
词法分析
词法分析是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。
以上为课本原话,简单来说就是将源程序按顺序分解为一个个单词。例如var sum,first,count;sum:=first+count*10.
读取得到序列:1.保留字 var 2.标识符 sum 3.逗号, 4.标识符 first 5.逗号, 6.标识符 count 7.分号;8.标识符sum 9.赋值号:= 10.标识符first 11.加号+ 12.标识符count 13.乘号* 14.整数10 15.界符.
经过词法分析后可知,该赋值语句sum:=first+count*10可表示为id1:=id2+id3*10
id1 2 3表示sum first count这三个标识符的内部形式。 -
语法分析
语法分析是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上将单词分解成各类语法短语,如“程序”,“表达式”,“语句”等。语法分析依据的是语言的语法规则,通过语法分析判断整个输入串是否构成语法正确。
即判断例句讲真的,编译原理,很有趣这句话是否符合语法规则。 -
语义分析
词法分析是审查源程序有无语义错误,为代码生成阶段收集类型信息,有错误时应报告错误。
例如“莉莉柯林斯是英国美女”正确,“英国美女是莉莉柯林斯”就有问题了。 -
中间代码生成
在词法分析和语法分析后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间代码或中间过程。
例如sum:=first+count*10转化为四元式序列如图1.7 -
代码优化
对中间代码进行变换或改造,目的是使生成的目标代码更加高效,即省时间省空间。sum:=first+count*10的优化如图1.8 -
目标代码生成
这一阶段任务是把中间代码变换为特定机器上的绝对指令代码或这重定的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,非常复杂。sum:=first+count*10的目标代码如图1.9