编译原理引论_第1页
编译原理引论_第2页
编译原理引论_第3页
编译原理引论_第4页
编译原理引论_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌编译原理编译原理课程简介课程简介 总学时:总学时:64 学时学时 其中含实验:其中含实验:12学时学时 主讲:陈天煌主讲:陈天煌 联系电话:联系电话汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌课程内容课程内容 v详细介绍程序设计语言的编译程序构造的一般详细介绍程序设计语言的编译程序构造的一般原理和基本实现方法原理和基本实现方法v重点介绍形式语言和自动机理论、重点介绍形式语言和自动机理论、 语法分析方法、语法分析方法、 属性文法、属性文法、 语法制导方法等理论知识语法制导方法等理论知识武汉理工大学

2、计算机科学系陈天煌武汉理工大学计算机科学系陈天煌课程要求课程要求v 目标:师生共同努力,学懂弄通目标:师生共同努力,学懂弄通v 本课程自学难度大,讲课进展较快,如果平本课程自学难度大,讲课进展较快,如果平时不复习并加深理解,后面将听不懂,时不复习并加深理解,后面将听不懂,必须必须不缺课不缺课v 作业、上机实验要求独立完成作业、上机实验要求独立完成v 学期总评学期总评 = = 考试成绩占考试成绩占70%70%,平时成绩占,平时成绩占30%30%武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌学习要求学习要求 编译系统是现代计算机系统的基本组成之一,编译系统是现代计算机系统的基本组成之

3、一,编译程序构造的基本原理和实现技术不仅应用于编编译程序构造的基本原理和实现技术不仅应用于编译程序的设计,也广泛应用于一般软件的设计和实译程序的设计,也广泛应用于一般软件的设计和实现。本课程是计算机类专业的一门重要的核心专业现。本课程是计算机类专业的一门重要的核心专业课。课。先修课程:先修课程: 高级程序设计语言、汇编语言、离散数学、高级程序设计语言、汇编语言、离散数学、 数据结构、计算机组成原理数据结构、计算机组成原理要求:要求:提前预习,上课认真听讲;提前预习,上课认真听讲; 课后即时复习,认真完成作业。课后即时复习,认真完成作业。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈

4、天煌学习目标学习目标 通过本课程的学习,旨在使同学们掌握程序设计通过本课程的学习,旨在使同学们掌握程序设计语言的形式化描述和编译的基本理论、原理和技术,语言的形式化描述和编译的基本理论、原理和技术,并对编译程序有较为具体的认识。使同学们能运用所并对编译程序有较为具体的认识。使同学们能运用所学过的基本知识、着手开发系统程序,为今后的工作学过的基本知识、着手开发系统程序,为今后的工作(理论研究和技术开发)打下基础。(理论研究和技术开发)打下基础。具体为:具体为:(1 1)掌握编译)掌握编译( (翻译翻译) )程序基本结构及构造的基本原程序基本结构及构造的基本原理和技术;理和技术;(2 2)掌握文法

5、、形式语言及自动机的基本概念和在)掌握文法、形式语言及自动机的基本概念和在编译程序构造中的应用;编译程序构造中的应用;武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌(3 3)掌握典型的几种语法分析方法的基本原理)掌握典型的几种语法分析方法的基本原理和实现方法;和实现方法;(4 4)掌握属性文法及语法制导方法在语义分析)掌握属性文法及语法制导方法在语义分析中的应用和中间代码生成方法以及计算机程中的应用和中间代码生成方法以及计算机程序的自动构造或生成原理与方法;序的自动构造或生成原理与方法;(5 5)掌握存储分配的基本思想和实现方法;)掌握存储分配的基本思想和实现方法;(6 6)掌握

6、代码优化及代码生成的方法;)掌握代码优化及代码生成的方法;(7 7)强调形式化描述技术)强调形式化描述技术(8 8)强调对编译原理和技术的宏观理解,不把)强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语注意力分散到枝节算法,不偏向于某种源语言或目标机器言或目标机器 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌参考资料参考资料 教材:教材:1 1 编译原理(第编译原理(第2版)版) 主编:张素琴等主编:张素琴等 出版社:清华大学出版社出版社:清华大学出版社 出版时间:出版时间:2012年年7月月参考书:参考书:11程序设计语言编译原理(第程序设计语言编译

7、原理(第3版)版) 主编:陈火旺、刘春林、谭庆平、赵克佳、刘越主编:陈火旺、刘春林、谭庆平、赵克佳、刘越 出版社:国防工业出版社出版社:国防工业出版社 出版时间:出版时间:2014年年1月月22编译程序构造原理和实现技术编译程序构造原理和实现技术 主编:金成植主编:金成植 出版社:高等教育出版社出版社:高等教育出版社 出版时间:出版时间:2011年年6月月33编译原理编译原理(第(第3版)版) 主编:何炎祥主编:何炎祥 出版社:华中科技大学出版社出版社:华中科技大学出版社 出版时间:出版时间:20102010年年8 8月月武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌参考资料参考

8、资料4 4 编译原理技术与工具(英文版)编译原理技术与工具(英文版) Compilers:Principles,Techniques,and Tools 主编:主编:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman 出版社:出版社:机械工业机械工业出版社出版社 出版时间:出版时间:2009年年2月月 5 5 编译原理与技术编译原理与技术(第二版)(第二版) 主编:陈意云主编:陈意云 出版社:中国科学技术大学出版社出版社:中国科学技术大学出版社 出版时间:出版时间:2012年年1月月66编译原理及编译程序构造编译原理及编译程序构造 主编:高仲仪、金茂忠主编:高仲仪

9、、金茂忠 出版社:北京航空航天大学出版社出版社:北京航空航天大学出版社 出版时间:出版时间:20112011年年3 3月月77编译原理实践与指导教程编译原理实践与指导教程 主编:主编:许畅许畅 出版社:出版社:机械工业机械工业出版社出版社 出版时间:出版时间:20152015年年6 6月月武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第第1 1章章 引论引论 本章主要内容:本章主要内容: v什么是编译程序什么是编译程序v编译过程和编译程序的结构编译过程和编译程序的结构v为什么要学习编译程序为什么要学习编译程序 本章的重点:本章的重点: 本章没有难以理解的内容本章没有难以理解的内容

10、, ,主主要是对编译程序的功能和结构做一要是对编译程序的功能和结构做一综合描述综合描述武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌1.1 1.1 什么叫编译程序什么叫编译程序 u 高级语言编译程序是计算机系统软件最重要的组高级语言编译程序是计算机系统软件最重要的组成部分之一,也是用户最直接关心的工具之一。成部分之一,也是用户最直接关心的工具之一。u 要在计算机上执行用高级语言(或汇编语言)编要在计算机上执行用高级语言(或汇编语言)编写的程序,必须通过特定的途径来进行,也就是要通写的程序,必须通过特定的途径来进行,也就是要通过翻译程序把用高级语言(或汇编语言)编写的程序过翻译程序

11、把用高级语言(或汇编语言)编写的程序翻译翻译成为机器语言构成的程序,计算机才能执行。成为机器语言构成的程序,计算机才能执行。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌在计算机上执行一个高级语言程序一在计算机上执行一个高级语言程序一般要分为两步:般要分为两步:第一步,用一个编译程序把高级语言第一步,用一个编译程序把高级语言翻译成机器语言程序;翻译成机器语言程序;第二步,运行所得的机器语言程序求第二步,运行所得的机器语言程序求得计算结果。得计算结果。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌1 1翻译程序(翻译程序(TranslatorTranslator)

12、 通常所说的翻译程序是指这样的一个程序,它通常所说的翻译程序是指这样的一个程序,它能够把某一种语言程序(称为能够把某一种语言程序(称为源语言程序或源程序源语言程序或源程序)转换成另一种语言程序(称为转换成另一种语言程序(称为目标语言程序或目标目标语言程序或目标程序程序),而后者与前者在逻辑上是等价的。),而后者与前者在逻辑上是等价的。 源程序源程序翻译程序翻译程序目标程序目标程序输入输入输出输出图图1.1 翻译程序翻译程序 翻译程序根据所处理的对象和实现的途径不同又分为:翻译程序根据所处理的对象和实现的途径不同又分为:汇编程序、编译程序和解释程序。汇编程序、编译程序和解释程序。 武汉理工大学计

13、算机科学系陈天煌武汉理工大学计算机科学系陈天煌2. 2. 汇编程序(汇编程序(AssemblerAssembler) 如果源语言是某种汇编语言,而目标语言是某种计如果源语言是某种汇编语言,而目标语言是某种计算机的机器语言,这样的一个翻译程序就称为汇编程算机的机器语言,这样的一个翻译程序就称为汇编程序。序。源程序源程序(汇编语言)(汇编语言)翻译程序翻译程序(汇编程序)(汇编程序)目标程序目标程序(机器语言)(机器语言)输入输入输出输出图图1.2 汇编程序汇编程序武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌3. 3. 编译程序(编译程序(CompilerCompiler) 如果源

14、语言是某种高级语言,而目标语言是某种如果源语言是某种高级语言,而目标语言是某种低级语言(汇编语言或机器语言),这样的一个翻译低级语言(汇编语言或机器语言),这样的一个翻译程序就称为编译程序。程序就称为编译程序。 源程序源程序(高级语言)(高级语言)翻译程序翻译程序(编译程序)(编译程序)目标程序目标程序(低级语言)(低级语言)图图1.3 编译程序编译程序输入输入输出输出武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌4. 4. 解释程序(解释程序(Interpreter) 这是另外一种类型的翻译程序,在翻译过程它按这是另外一种类型的翻译程序,在翻译过程它按照高级语言源程序在计算机上

15、执行的动态顺序对源程照高级语言源程序在计算机上执行的动态顺序对源程序的语句逐条翻译(解释),边解释边执行直至结束,序的语句逐条翻译(解释),边解释边执行直至结束,它不产生目标程序,它的工作结果就是源程序的执行它不产生目标程序,它的工作结果就是源程序的执行结果,这样的一个翻译程序就称为解释程序。结果,这样的一个翻译程序就称为解释程序。 源程序源程序(高级语言)(高级语言)翻译程序翻译程序(解释程序)(解释程序)计算结果计算结果输入输入输出输出图图1.4 解释程序解释程序初始数据初始数据武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 本课程将不对解释程序作专门的讨论。实际上,本课程将

16、不对解释程序作专门的讨论。实际上,许多编译程序的构造与实现技术同样适用于解释程序。许多编译程序的构造与实现技术同样适用于解释程序。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 世界上第一个编译程序世界上第一个编译程序FORTRAN编译程序是编译程序是20世纪世纪50年代中期研制成功的。年代中期研制成功的。 本课程主要介绍设计和构造编译程序的基本原理本课程主要介绍设计和构造编译程序的基本原理和方法。我们不想罗列太多细节性的材料,着重讲一和方法。我们不想罗列太多细节性的材料,着重讲一些原理性的东西,但将反映一些最新的进展。些原理性的东西,但将反映一些最新的进展。武汉理工大学计算机

17、科学系陈天煌武汉理工大学计算机科学系陈天煌1.2 1.2 编译过程概述编译过程概述 编译程序的工作,从输入源程序开始到输出目标程编译程序的工作,从输入源程序开始到输出目标程序为止的整个过程,是非常复杂的。但就其过程而言,序为止的整个过程,是非常复杂的。但就其过程而言,它与人们进行自然语言之间的翻译有许多相近之处。它与人们进行自然语言之间的翻译有许多相近之处。当我们把一种文字翻译为另一种文字,例如把一段英当我们把一种文字翻译为另一种文字,例如把一段英文翻译为中文时,通常需经下列步骤:文翻译为中文时,通常需经下列步骤:(1)识别出句子中的一个个单词;)识别出句子中的一个个单词;(2)分析句子的语法

18、结构;)分析句子的语法结构;(3)根据句子的含义进行初步翻译;)根据句子的含义进行初步翻译;(4)对译文进行修饰;)对译文进行修饰;(5)写出最后的译文。)写出最后的译文。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第一阶段,词法分析第一阶段,词法分析 词法分析的任务是词法分析的任务是: 输入源程序,对构成源程序的字符串进行扫描输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词和分解,识别出一个个的单词(亦称单词符号或简(亦称单词符号或简称符号),如基本字(称符号),如基本字(beginbegin、endend、ifif、forfor、whilewhile等)

19、,标识符、常数算符和界符(标点符号、等),标识符、常数算符和界符(标点符号、左右括号等等)。左右括号等等)。 类似地,编译程序的工作过程一般也可以划分类似地,编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析与中为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。间代码产生、优化、目标代码生成。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌例如,对于例如,对于PascalPascal语言语言的循环语句:的循环语句:for I:for I:1 to 100 do A:=A+I1 to 100 do A:=A+I词法分析的结果是识别出如

20、下的单词符号:词法分析的结果是识别出如下的单词符号:基本字基本字 forfor标识符标识符 I I赋值号赋值号 : : = =整常数整常数 1 1基本字基本字 toto整常数整常数 100100基本字基本字 dodo这些单词是组成上述这些单词是组成上述Pascal语句的基本符号。语句的基本符号。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 单词符号是语言的基本组成成分,是人们理单词符号是语言的基本组成成分,是人们理解和编写程序的基本要素。识别和理解这些要解和编写程序的基本要素。识别和理解这些要素无疑也是翻译的基础。素无疑也是翻译的基础。 如同将英文翻译成中文的情形一样,如果你如

21、同将英文翻译成中文的情形一样,如果你对英语单词不理解,那就谈不上进行正确的翻对英语单词不理解,那就谈不上进行正确的翻译。译。 在词法分析阶段的工作中所依循的是语言的在词法分析阶段的工作中所依循的是语言的词法规则(或称构词规则)。描述词法规则的词法规则(或称构词规则)。描述词法规则的有效工具是正规式和有限自动机。有效工具是正规式和有限自动机。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第二阶段,语法分析第二阶段,语法分析 语法分析的任务是:语法分析的任务是: 在词法分析的基础上,根据语言的语法规则,把在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴

22、),如单词符号串分解成各类语法单位(语法范畴),如“短语短语”、“子句子句”、“语句语句”、“程序段程序段”和和“程程序序”等。通过语法分析,等。通过语法分析,确定整个输入串是否构成语确定整个输入串是否构成语法上正确的法上正确的“程序程序”。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌语法分析所依循的是语言的语法规则。语法语法分析所依循的是语言的语法规则。语法规则通常用上下文无关文法描述。词法分析是一规则通常用上下文无关文法描述。词法分析是一种线性分析,而语法分析是一种层次结构分析。种线性分析,而语法分析是一种层次结构分析。例如,在很多语言中,符号串例如,在很多语言中,符号串

23、 z: :=X十十0.618*Y代表一个代表一个“赋值语句赋值语句”,而其中的,而其中的 X0.618*Y代表一个代表一个“算术表达式算术表达式”。因而,语法。因而,语法分析的任务就是识别分析的任务就是识别 X0.618*Y为算术表达式,为算术表达式,同时,识别上述整个符号串属于赋值语句这个范同时,识别上述整个符号串属于赋值语句这个范畴。畴。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第三阶段,语义分析与中间代码产生第三阶段,语义分析与中间代码产生 这一阶段的任务是:这一阶段的任务是: 对语法分析所识别出的各类语法范畴,分析其含对语法分析所识别出的各类语法范畴,分析其含义,并

24、进行初步翻译(产生中间代码)。义,并进行初步翻译(产生中间代码)。 “翻译翻译”仅仅在这里才开始涉及到。所谓仅仅在这里才开始涉及到。所谓“中间中间代码代码”是一种含义明确、便于处理的记号系统,它是一种含义明确、便于处理的记号系统,它通常独立于具体的硬件。这种记号系统或者与现代通常独立于具体的硬件。这种记号系统或者与现代计算机的指令形式有某种程度的接近,或者能够比计算机的指令形式有某种程度的接近,或者能够比较容易地把它变换成现代计算机的机器指令。较容易地把它变换成现代计算机的机器指令。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 例如,许多编译程序采用了一种与例如,许多编译程序

25、采用了一种与“三地址指令三地址指令”非常近似的非常近似的“四元式四元式”作为中间代码。这种四元式作为中间代码。这种四元式的形式是:的形式是: 算符算符 左操作数左操作数 右操作数右操作数 结果结果 它的意义是:对它的意义是:对“左、右操作数左、右操作数”进行某种运进行某种运算(由算(由“算符算符”指明),把运算所得的值作为指明),把运算所得的值作为“结结果果”保留下来。在采用四元式作为中间代码的情形保留下来。在采用四元式作为中间代码的情形下,中间代码产生的任务就是按语言的语义规则把下,中间代码产生的任务就是按语言的语义规则把各类语法成份翻译成四元式序列。各类语法成份翻译成四元式序列。武汉理工大

26、学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌例如,下面的赋值句例如,下面的赋值句Z: :(X0.418)*YW可被翻译为如下的四元式序列:可被翻译为如下的四元式序列: 序号序号 算符算符 左操作数左操作数 右操作数右操作数 结果结果 1 十十 X 0.418 T1 2 * T1 Y T2 3 T2 W Z 一般而言,中间代码是一种独立于具体硬件的一般而言,中间代码是一种独立于具体硬件的记号系统。记号系统。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第四阶段,优化第四阶段,优化 优化的任务优化的任务: : 对前述阶段产生的中间代码进行加工变换,以期对前述阶段产生的中间代码进

27、行加工变换,以期在最后代码生成阶段能产生出更为高效(省时间和空在最后代码生成阶段能产生出更为高效(省时间和空间)的目标代码。间)的目标代码。 优化的主要方面有:优化的主要方面有: 公共子表达式提取、循环优化、删除无用代码等公共子表达式提取、循环优化、删除无用代码等等。等。优化所依循的原则优化所依循的原则: : 是程序的等价变换规则。是程序的等价变换规则。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌第第五阶段,目标代码生成五阶段,目标代码生成这一阶段的任务是:这一阶段的任务是: 把中间代码(或经优化处理之后)变换成特定把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。

28、机器上的低级语言代码。 这阶段实现了最后的翻译,它的工作有赖于硬这阶段实现了最后的翻译,它的工作有赖于硬件系统结构和机器指令含义。这阶段工作非常复杂,件系统结构和机器指令含义。这阶段工作非常复杂,涉及到硬件系统功能部件的运用,机器指令的选择,涉及到硬件系统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以及寄存器和后各种数据类型变量的存储空间分配,以及寄存器和后援寄存器的调度,等等。如何产生出足以充分发挥硬援寄存器的调度,等等。如何产生出足以充分发挥硬件效率的目标代码是一件非常不容易的事情。件效率的目标代码是一件非常不容易的事情。 武汉理工大学计算机科学系陈天煌武汉理工大学计算

29、机科学系陈天煌 上述编译过程的五个阶段是一种典型的分法。上述编译过程的五个阶段是一种典型的分法。 事实上,并非所有编译程序都分成这五阶段。事实上,并非所有编译程序都分成这五阶段。 有些编译程序对优化没有什么要求,优化阶段有些编译程序对优化没有什么要求,优化阶段就可省去。在某些情况下,为了加快编译速度,中就可省去。在某些情况下,为了加快编译速度,中间代码产生阶段也可以去掉。间代码产生阶段也可以去掉。 有些最简单的编译程序是在语法分析的同时产有些最简单的编译程序是在语法分析的同时产生目标代码。但是,多数实用编译程序的工作过程生目标代码。但是,多数实用编译程序的工作过程大致都像上面所说的那五个阶段。

30、大致都像上面所说的那五个阶段。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌1.3 1.3 编译程序的结构编译程序的结构 1.3.1 1.3.1 编译程序总框编译程序总框 上述编译过程的五个阶段是编译程序工作时的动上述编译过程的五个阶段是编译程序工作时的动态特征。编译程序的结构可以按照这五阶段的任务分态特征。编译程序的结构可以按照这五阶段的任务分模块进行设计。图模块进行设计。图1.5给出了编译程序总框。给出了编译程序总框。 图图1.5 编译程序总框编译程序总框词法分析器词法分析器语法分析器语法分析器语义分析与中间代码生成器语义分析与中间代码生成器中间代码优化器中间代码优化器目标代

31、码生成器目标代码生成器表表格格管管理理出出错错处处理理目标代码程序目标代码程序源程序源程序单词符号串单词符号串语法单位语法单位中间代码串中间代码串中间代码串中间代码串武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 词法分析器,词法分析器,又称扫描器,输入源程序,进行又称扫描器,输入源程序,进行词法分析,输出单词符号。词法分析,输出单词符号。 语法分析器,语法分析器,简称分析器,对单词符号串进行简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或归约),识别语法分析(根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上出各类语法单位,最终判断输入串

32、是否构成语法上正确的正确的“程序程序”。 语义分析与中间代码产生器,语义分析与中间代码产生器,按照语义规则按照语义规则对语法分析器归约出(或推导出)的语法单位进行对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。语义分析并把它们翻译成一定形式的中间代码。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌中间代码优化器,中间代码优化器,对中间代码进行优化处理。对中间代码进行优化处理。 目标代码生成器,目标代码生成器,把中间代码翻译成目标程序。把中间代码翻译成目标程序。 除了上述五个功能模块外,一个完整的编译程序除了上述五个功能模块外,一个完整的编译

33、程序还应包括还应包括“表格管理表格管理”和和“出错处理出错处理”两部分。两部分。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌1.3.2 1.3.2 表格与表格管理表格与表格管理 编译程序在工作过程中需要保存一系列的表格,编译程序在工作过程中需要保存一系列的表格,以登记源程序的各类信息和编译各阶段的进展状况。以登记源程序的各类信息和编译各阶段的进展状况。 合理地设计和使用表格是编译程序构造的一个重合理地设计和使用表格是编译程序构造的一个重要问题。要问题。 在编译程序使用的表格中,最重要的是符号表。在编译程序使用的表格中,最重要的是符号表。它用来登记源程序中出现的每个名字以及名字的

34、各种它用来登记源程序中出现的每个名字以及名字的各种属性。属性。 例如,一个名字是常量名、还是变量名、是过程例如,一个名字是常量名、还是变量名、是过程名等等;如果是变量名,它的类型是什么、所占内存名等等;如果是变量名,它的类型是什么、所占内存是多大、地址是多少等等。是多大、地址是多少等等。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 通常,编译程序在处理到名字的定义性出现时,通常,编译程序在处理到名字的定义性出现时,要把名字的各种属性填入到符号表中;当处理到名要把名字的各种属性填入到符号表中;当处理到名字的使用性出现时,要对名字的属性进行查证。字的使用性出现时,要对名字的属性进

35、行查证。 当扫描器识别出一个名字(标识符)后,它把当扫描器识别出一个名字(标识符)后,它把该名字填入到符号表中。但这时不能完全确定名字该名字填入到符号表中。但这时不能完全确定名字的属性,它的各种属性要在后续的各阶段才能填入。的属性,它的各种属性要在后续的各阶段才能填入。例如,名字的类型等要在语义分析时才能确定,例如,名字的类型等要在语义分析时才能确定,而名字的地址可能要到目标代码生成才能确定。而名字的地址可能要到目标代码生成才能确定。由此可见,编译各阶段都涉及到构造、查找或由此可见,编译各阶段都涉及到构造、查找或更新有关的表格。更新有关的表格。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机

36、科学系陈天煌1.3.3 1.3.3 出错处理出错处理 一个编译程序不仅应能对书写正确的程序进行翻一个编译程序不仅应能对书写正确的程序进行翻译,而且应能对出现在源程序中的错误进行处理。译,而且应能对出现在源程序中的错误进行处理。 如果源程序有错误,编译程序应设法发现错误,如果源程序有错误,编译程序应设法发现错误,把有关错误信息报告给用户。这部分工作是由专门的把有关错误信息报告给用户。这部分工作是由专门的一组程序(叫做出错处理程序)完成的。一组程序(叫做出错处理程序)完成的。 一个好的编译程序应能最大限度地发现源程序中一个好的编译程序应能最大限度地发现源程序中的各种错误,准确地指出错误的性质和发生

37、错误的地的各种错误,准确地指出错误的性质和发生错误的地点,并且能将错误所造成的影响限制在尽可能小的范点,并且能将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,以围内,使得源程序的其余部分能继续被编译下去,以便进一步发现其它可能的错误。便进一步发现其它可能的错误。 如果不仅能够发现错误,而且还能自动校正错误,如果不仅能够发现错误,而且还能自动校正错误,那当然就更好了。但是,自动校正错误的代价是非常那当然就更好了。但是,自动校正错误的代价是非常高的。高的。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 编译过程的每一阶段都可能检测出错误,其中,编译过

38、程的每一阶段都可能检测出错误,其中,绝大多数错误可以在编译的前三阶段检测出来。绝大多数错误可以在编译的前三阶段检测出来。 源程序中的错误通常分为语法错误和语义错误两源程序中的错误通常分为语法错误和语义错误两大类。大类。 语法错误语法错误是指源程序中不符合语法(或词法)规是指源程序中不符合语法(或词法)规则的错误,它们可在词法分析或语法分析时检测出来。则的错误,它们可在词法分析或语法分析时检测出来。 例如,词法分析阶段能够检测出例如,词法分析阶段能够检测出“非法字符非法字符”之之类的错误;语法分析阶段能够检测出诸如类的错误;语法分析阶段能够检测出诸如“括号不匹括号不匹配配”、“缺少;缺少;”之类

39、的错误。之类的错误。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌语义错误语义错误是指源程序中不符合语义规是指源程序中不符合语义规则的错误,这些错误一般在语义分析时检则的错误,这些错误一般在语义分析时检测出来,有的语义错误要在运行时才能检测出来,有的语义错误要在运行时才能检测出来。测出来。语义错误通常包括:说明错误、作用语义错误通常包括:说明错误、作用域错误、数组元素越界、类型不一致等等。域错误、数组元素越界、类型不一致等等。关于错误检测和处理方法,我们将穿插在关于错误检测和处理方法,我们将穿插在有关章节介绍。有关章节介绍。武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系

40、陈天煌1.3.4 1.3.4 遍遍 前面介绍的编译过程的五个阶段仅仅是逻辑功能上前面介绍的编译过程的五个阶段仅仅是逻辑功能上的一种划分。具体实现时,受不同源语言、设计要求、的一种划分。具体实现时,受不同源语言、设计要求、使用对象和计算机条件(如主存容量)的限制,往往将使用对象和计算机条件(如主存容量)的限制,往往将编译程序组织为若干编译程序组织为若干遍(遍(Pass)。 所谓所谓“遍遍”就是对源程序或源程序的中间结果从就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。结果或目标程序。 通常,每遍的工作

41、由从外存上获得的前一遍的中间通常,每遍的工作由从外存上获得的前一遍的中间结果开始(对于第一遍而言,从外存上获得源程序),结果开始(对于第一遍而言,从外存上获得源程序),完成它所含的有关工作之后,再把结果记录于外存。完成它所含的有关工作之后,再把结果记录于外存。 既可以将几个不同阶段合为一遍,也可以把一个阶既可以将几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。段的工作分为若干遍。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌 当一遍中包含若干阶段时,各阶段的工作是穿插当一遍中包含若干阶段时,各阶段的工作是穿插进行的。例如,我们可以把词法分析、语法分析及语进行的。例如,我

42、们可以把词法分析、语法分析及语义分析与中间代码产生这三阶段安排成一遍。义分析与中间代码产生这三阶段安排成一遍。 这时,语法分析器处于核心位置,当它在识别语这时,语法分析器处于核心位置,当它在识别语法结构而需要下一单词符号时,它就调用词法分析器,法结构而需要下一单词符号时,它就调用词法分析器,一旦识别出一个语法单位时,它就调用中间代码产生一旦识别出一个语法单位时,它就调用中间代码产生器,完成相应的语义分析并产生相应的中间代码。器,完成相应的语义分析并产生相应的中间代码。 武汉理工大学计算机科学系陈天煌武汉理工大学计算机科学系陈天煌一个编译程序究竟应分成几遍,如何划分,一个编译程序究竟应分成几遍,如何划分,是与源语言、设计要求。硬件设备等诸因素有关是与源语言、设计要求。硬件设备等诸因素有关的,因此难于统一划定。的,因此难于统一划定。遍数多一点有个好处,即整个编译程序的遍数多一点有个好处,即整个编译程序的逻辑结构可能清晰一点。但遍数多势必增加输入逻辑结构可能清晰一点。但遍数多势必增加输入输出所消耗的时间。因此,在主存可能的前提输出所消耗的时间。因此,在主存可能的前提下,一般还是遍数尽可能少一点为好。应当注意下,一般还是遍数尽可能少一点为好。应当注意的是,并不是每种语言都可以用单遍编译程序实的是,并不是每种语言都可以用单遍编

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论