2、级语言写的程序能在计算机上执行?编译(compiling):代表从面向人的源语言表示的算法到面向硬件的目标语言表示的算法的一个等价变换.§1.1翻译和解释一.解释器(Interpreter)对于一种程序设计语言PL,可以定义一种抽象机,PL的运算,数据结构和控制结构是这种机器的存储元素和指令.实现这种抽象机的软件称为解释器.解释器对源程序的输入直接执行源程序中说明的操作.(见书P2)二.编译器(compiler)编译器是将源语言程序通过翻译序列(SL,L1),(L1,L2),…,(Lk,TL)变成和源程序等价的目标语言程序的软件.其中SL称为源语言,TL称为目标语言,Li(i
3、=1,2,…,k)称为中间语言.*把高级语言程序翻译成低级目标(机器)语言程序的软件即是编译程序.(见书P2)能够完成一种语言到另一种语言变换的软件称为翻译器.§1.2编译的阶段(Phases)一.编译阶段的划分(见书P5):二.各阶段的功能1.词法分析(LexicalAnalysis)词法分析读源程序的字符序列,识别一个个单词(lexeme),并把它们组成记号(token)流.记号流的每个记号代表逻辑上有内聚力的字符序列;例如:标识符,关键字,标点符号或算符.形成记号的字符序列叫做该记号的单词.例如:(见书P7)*注意:记号是单词在编译程序内部的表示.2.语法分析(Synt
4、axanalysis)语法分析把源程序的记号序列分组成语法短语,它识别记号序列的层次结构.源程序的语法短语常用分析树来表示.例如:(见上例)12011级电子政务编译原理3.语义分析(Semanticanalysis)语义分析阶段检查源程序的语义错误,并为以后的代码生成阶段收集类型信息.它使用语法分析阶段确定的层次结构来标识表达式的算符和运算对象及语句的语义.语义分析所作的检查包括:运算对象类型的相容性,名字是否定义,形参与实参的一致性等.例如:(见上例)4.中间代码生成(Intermediatecodegeneration)将源语言的记号流翻译成某种中间语言形式,这种中间语言
5、程序是某种抽象机的程序.中间语言有两个性质:它容易产生和容易翻译成目标程序.例如:(见上例)5.代码优化(Codeoptimization)代码优化阶段试图改进中间代码,以便产生较快的机器代码.代码优化分为:1.独立于机器的代码优化;和2.依赖于机器的代码优化;例如:(见上例)6.代码生成(Codegeneration)代码生成阶段生成可以重定位的机器代码或汇编码.*在此阶段,为源程序所用的每个变量选择存储单元和分配寄存器,把中间代码翻译成等价的机器指令序列.例如:(见上例)7.符号表管理(Symbol-tablemanagement)记录源程序中使用的标识符和收集每个标识符
6、(identifier)的各种属性(attribute).*这些属性提供标识符的存储分配,类型和作用域信息,如果是过程名标识符,还有参数个数和类型,参数传递方式和返回值类型.符号表管理阶段与上述各阶段交互作用.8.错误诊断和报告(Errordetectionandreport)每个阶段都可能碰到错误.在发现错误后,该阶段必须处理此错误,使得以后的编译可以继续进行,以便进一步察觉源程序的其它错误.§1.3阶段的分组一.前端和后端1.前端(Front-end):是只依赖于源语言,几乎独立于目标机器的阶段或阶段的一部分组成的.通常是:词法分析,语法分析,符号表建立,语义分析和中间代
7、码生成.2.后端(back-end):是指编译器中依赖于目标机器的部分.它们一般独立于源语言而与中间代码有关.通常包括:代码优化,代码生成和出错处理,符号表操作.22011级电子政务编译原理二.遍(pass)编译的几个阶段常用一遍来实现.一遍包括读一个输入文件和写一个输出文件.即扫描一遍被编译的程序.编译的分遍常常因实现的方便和需要而定.例如:把词法分析,语法分析,语义分析和中间代码生成组成一遍.三.减少遍数在实现编译程序时,我们希望尽量减少遍数,因为每遍都要花时间来读写中间文件.但有时由于某种需要必须