编译程序:是指这么一种程序,它能够把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标语言程序),而后者与前者在逻辑上
是等价的。
编译过程的五个阶段:词法分析—>语法分析—>语义分析与中间代码生成—>优化—>目标代码生成。如下图所示:http://hi.youkuaiyun.com/space-124596-do-album-picid-497760.html
一、词法分析:从左到右逐个字符地对源程序进行扫描,产生一个单词符号,把作为字符串的源程序发行成单词符号串的中间程序。
单词符号一般可分为五类:
1、关键字:由程序语言定义的具有固定意义的标识符。如when,if,while等。
2、标识符:用来表示各种名字。如变量名,数组名,过程名等。
3、常数:
4、运算符:
5、界符:如逗号,分号,括号,/*,*/等。
词法分析器的功能:输入源程序,输出单词符号。单词符号通常表示成如下的二元式:(单词各别,单词符号的属性值)
例子:(C++代码段)
while ( i >= j ) i -- ;
经词法分析器处理后,输出如下的单词符号序列:
<while,->
<(,->
<id,指向 i 的符号表项的指针>
<>=,->
<id,指向 j 的符号表项的指针>
<),->
<id,指向 i 的符号表项的指针>
<--,->
<;,->
二、语法分析:在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。
预备知识:
文法定义:一个文法是一个四元组:G=(V,T,P,S),其中,
1、V是非终结符(或称变元)的有限集;
2、T是终结符的有限集;
3、P是产生式的有限集,且每个生成式都形如a—>b,而a,b属于(VUT)的闭包,其中a不可为空串;
4、S属于V,称为文法G的开始符号。
上下文无关文法:要求P中每个生成式都具有如下的形式 : A—>b,其中b属于(VUT)的闭包,A属于V
语法分析是编译过程的核心部分,而上下文无关文法是语法分析的基础,因为程序的语法结构是用上下文无关文法描述的。因此,语法分析器
的工作本质上是按文法的产生式,识别输入的符号串是否为一个句子(程序语句)。
语法分析器在编译过程中的地位如下图所示:http://hi.youkuaiyun.com/space-124596-do-album-picid-497781.html
三、语义分析与中间代码生成:紧接在词法分析和语法分析之后,编译程序分析之前所识别出各类语法范畴的含义,并进行初步翻译(产生中间代
码)。首先对每种语法范畴进行静态语义检查,如果语义正确,再进行中间代码的翻译。
静态语义:在编译阶段能检查的语义
动态语义:只有在目标码的运行阶段才能检查的语义
1、类型检查:如果操作符作用于不相容的操作数,编译程序必须报告出错信息。
2、控制流检查:控制流语句必须使控制转移到合法的地方。
3、一致性检查:检查重名或重复定义,如:case语句中的标号不能相同,枚举类型的元素不能重复等。
4、相关名字检查:有时,同一名字必须出现两次或多次,检查是否出现或出现时是否相同。
其它还有名字的作用域分析等也属于静态语义分析的工作。
中间代码是一种含义明确,便于处理,独立于具体硬件的记号系统,常用的中间代码有四元式,三元式,逆波兰记号和树形表示等。
四元式如下图所示:http://hi.youkuaiyun.com/space-124596-do-album-picid-497746.html
四、优化:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
优化的主要方面有: 公共子表达式的提取、循环优化、删除无用代码等等,有时为便于并行计算,也对代码进行并行化处理。
优化时对代码进行的各种变换必须遵守以下原则:
1、等价原则。经过优化后不应改变程序运行的结果。
2、有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
3、合算原则:应尽可能以较低的代价取得较好的优化效果。
代码优化器在编译过程中的地位如下图所示:http://hi.youkuaiyun.com/space-124596-do-album-picid-497755.html
五、目标代码生成:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。
目标代码一般有以下三种形式:
1、能够立即执行的机器语言代码,所有地址均已定位(代真)。
2、待装配的机器语言模块。当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码。
3、汇编语言代码,尚需经过汇编程序汇编,转换成可执行的机器语言代码。
代码生成着重考虑两个直接影响目标代码执行速度的问题:
1、如何使生成的目标代码较短;
2、如何充分利用计算机的寄存器,减少目标中访问存储单元 的次数。