编译原理实践及应用》第1章编译原理概述

上传人:san****019 文档编号:70536093 上传时间:2019-01-17 格式:PPT 页数:42 大小:1MB
返回 下载 相关 举报
编译原理实践及应用》第1章编译原理概述_第1页
第1页 / 共42页
编译原理实践及应用》第1章编译原理概述_第2页
第2页 / 共42页
编译原理实践及应用》第1章编译原理概述_第3页
第3页 / 共42页
编译原理实践及应用》第1章编译原理概述_第4页
第4页 / 共42页
编译原理实践及应用》第1章编译原理概述_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《编译原理实践及应用》第1章编译原理概述》由会员分享,可在线阅读,更多相关《编译原理实践及应用》第1章编译原理概述(42页珍藏版)》请在金锄头文库上搜索。

1、编译原理实践及应用,主讲人:董明刚 ,13607731976,2019年1月17日星期四,第2页,教材及主要参考资料,教材:编译原理实践及应用,黄贤英,清华大学出版社 主要参考资料: 编译原理,陈火旺,国防工业出版社 编译原理(原书第2版)(龙书) ,ALFRED V.AHO etc著,赵建华 郑滔等译 ,机械工业出版社 ,2008.12 程序设计语言编译方法,肖军模,大连理工大学出版社 编译原理,张素琴,吕映芝,清华大学出版社 更多教材及参考资料参见编译原理精品课程网站。,C语言程序,void main( ) int x,y,z; x=3; y=2; z=x+y; ,序言,在内存中:,?,编

2、译原理概述,第一章,2019年1月17日星期四,第5页,本章要求,主要内容:各种翻译程序的概念,编译过程和阶段划分,编译程序的组成和结构,编译程序的构造方法 重点掌握:编译程序工作的基本过程及其各阶段的基本任务,编译程序总框。,2019年1月17日星期四,第6页,1.1 程序设计语言与翻译程序,机器语言 (machine language) C7 06 0000 0002 汇编语言 (assembler language) MOV X , 2 高级语言 (high-level language) X = 2,为什么要使用编译程序?,2019年1月17日星期四,第7页,机器语言 (machine

3、 language) C7 06 0000 0002 汇编语言 (assembler language) MOV X , 2 高级语言 (high-level language) X = 2,为什么要使用编译程序?,2019年1月17日星期四,第8页,计算机中的语言层次和翻译程序,2019年1月17日星期四,第9页,什么叫翻译程序,翻译程序:能够将某种语言写的程序转换成另一种语言的程序,而且后者与前者在逻辑上是等价的。 编译程序:将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。 解释程序:将高级程序设计语言写的源程序作为输入,边解释边执行源程序本身,而不产

4、生目标程序的翻译程序。,2019年1月17日星期四,第10页,操作系统 汇编语言,翻译程序所处的层次,计算机硬件,2019年1月17日星期四,第11页,编译程序,解释程序,2019年1月17日星期四,第12页,对编译程序的一些说明,编译程序实质上是一个翻译程序,要注意等价变换 本课程的任务就是讲解在这个转换过程中所涉及到的一些理论和方法,最后,使用这些理论和方法,自己编写一个小的编译器 转换是一个总体的功能,要抓住总体结构,逐层细分,写编译器时要体现软件工程中软件设计的原则,自顶向下,逐层分解。 编译器要完成的转换任务相当复杂,实现编译器时必须分步骤分阶段实现。分阶段实现的好处是能够简化程序的

5、设计,当然也可以不分阶段实现。,2019年1月17日星期四,第13页,编译程序的分类,诊断编译程序 优化编译程序 可变目标编译程序 交叉编译程序,2019年1月17日星期四,第14页,编译器的伙伴,编辑器(editor) 预处理器(Preprocessor) 将源程序汇集到一起,宏展开等 汇编程序(assembler) 连接程序(linker) 连接系统函数与系统资源 装入程序(loader) 重定位(relocation) Debugger,Profiler,Project Manager,2019年1月17日星期四,第15页,编译原理是讨论编译程序设计的基本理论、基本概念、基本方法,什么是

6、编译原理,2019年1月17日星期四,第16页,1.2 编译过程概述,1、逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目标代码生成 每个阶段把源程序从一种表示变换成另一种表示,2019年1月17日星期四,第17页,按照词法分析、语法分析、语义分析等这种方式来划分阶段的原因是:每个阶段的复杂程度不同,所依据的理论基础不同,实现时采用的方法也不同。主要是方便理解和实现。 划分阶段的依据是什么?每个阶段所实现的功能相对独立。,用一个例子说明各阶段的功能,2019年1月17日星期四,第18页,/*一个PASCAL语言的源程序*/ program test; /*this i

7、s an example,computing an area*/ var area, length, width: integer; begin length:=5;width:=5; area := 5length *widthlength *width end.,2019年1月17日星期四,第19页,第一阶段:词法分析,任务: 从左到右扫描源程序,识别出每个单词 附加任务:a、滤掉空格 b、去掉注释 单词符号是语言的基本组成成分 词法分析的工作主要依据语言中单词的构成规则 单词的种类: (1) 标识符 (2) 关键字(char、int、if、else、while、for等) (3) 运算符

8、(即运算符号 +、*、/、&等) (4) 界符(常见的有 ; , : ( )等) (5) 常数,2019年1月17日星期四,第20页,begin area:=5length*width length *width end;,例:,2019年1月17日星期四,第21页,第二阶段:语法分析,任务: 在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:程序、语句、表达式)。 确定整个输入串是否构成语法上正确的程序。 根据规则判定:赋值语句:标识符:表达式 表达式:标识符、常数是表达式 表达式的运算也是表达式 例:识别符号串id1:=int1 + id2 * id3 + id2

9、 * id3是一个赋值语句( area:=5length*widthlength *width) 而int1 + id2 * id3 + id2 * id3是一个表达式 ( 5length*widthlength *width ),2019年1月17日星期四,第22页,语法分析所依据的是语言的语法规则,id1:=int1 + id2 * id3 + id2 * id3,2019年1月17日星期四,第23页,第三阶段:语义分析和中间代码生成,任务:对语法分析所识别出的各类语法短语分析其含义,进行初步的翻译(翻译成中间代码)。 静态语义审查 变量定义 类型匹配 类型转换 例:C:=A*B (检查C

10、与、类型) 中间代码的翻译 中间代码有多种形式,如: 四元式: (运算符,运算对象1,运算对象2,结果),2019年1月17日星期四,第24页,例:对赋值语句: id1:=int1 + id2 * id3 + id2 * id3 1. 检查area、length、width是否定义、类型 2. 生成中间代码,(运算符,运算对象1,运算对象2,结果) (*, id2, id3, T1) (+, int1, T1, T2) (*, id2, id3, T3) (+, T2, T3, T4) (:=, T4, _, id1),id1:=int1 + id2 * id3 + id2 * id3,201

11、9年1月17日星期四,第25页,第四阶段: 代码优化,任务:对已产生的中间代码进行加工变换,使生成的目标代码更为高效(时间和空间)。 优化方法包括:公共子表达式的提取、循环优化、删除无用代码等。 代码的优化依据的是程序的等价变换规则。,2019年1月17日星期四,第26页,第五阶段:目标代码的生成,任务:把中间代码(或经优化的中间代码)变换成特定机器上的低级语言代码。 依赖于机器的硬件系统结构和机器指令的含义 目标代码可以是:绝对指令代码、可重定位的指令代码、汇编指令代码,2019年1月17日星期四,第27页,1.2编译程序的结构,由左图可以看出,词法分析是实现编译器的基础,语法分析是实现编译

12、器的关键。 因此按照这个顺序来实现编译器 每一步的实现都依赖于一定的理论基础。 数学,尤其是离散数学是程序设计方法学的理论基础,2019年1月17日星期四,第28页,编译阶段的组合,几个概念 遍:对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。 编译前端:主要指与源语言有关,与目标语言无关的部分,通常包括词法分析、语法分析、语义分析和中间代码生成,与机器无关部分的代码优化 编译后端:指与目标机器有关的部分。如与机器有关的优化、目标代码生成,2019年1月17日星期四,第29页,编译阶段的组合,2019年1月17日星期四,第30页,为什么生成中间代码,

13、2019年1月17日星期四,第31页,编译程序中的主要数据结构 (续),临时文件,2019年1月17日星期四,第32页,(1) Token表 当扫描程序将字符收集到一个记号中时,它通常是以符号表示这个记号;这也就是说,作为一个枚举数据类型的值来表示源程序的记号集。 (2) 语法树(syntax tree) 如果分析程序确实生成了语法树,它的构造通常为基于指针的标准结构,在进行分析时动态分配该结构,则整棵树可作为一个指向根节点的单个变量保存。结构中的每一个节点都是一个记录,它的域表示由分析程序和之后的语义分析程序收集的信息。,编译程序中的主要数据结构介绍:,2019年1月17日星期四,第33页,

14、(3) 符号表(symbol table) 这个数据结构中的信息与标识符有关:函数、变量、常量以及数据类型。符号表几乎与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表格中的语义分析程序;语义分析程序将增加数据类型和其他信息;优化阶段和代码生成阶段也将利用由符号表提供的信息选出恰当的代码。因为对符号表的访问如此频繁,所以插入、删除和访问操作都必须比常规操作更有效。尽管可以使用各种树的结构,但杂凑表却是达到这一要求的标准数据结构。有时在一个列表或栈中可使用若干个表格。,2019年1月17日星期四,第34页,(4) 常数表(literal table) 常数表的功能是存放在程序中用到的常

15、量和字符串,因此快速插入和查找在常数表中也十分重要。但是,在其中却无需删除,这是因为它的数据全程应用于程序而且常量或字符串在该表中只出现一次。 (5) 中间代码(intermediate code) 根据中间代码的类型(例如三元式代码)和优化的类型,该代码可以是文本串的数组、临时文本文件或是结构的连接列表。对于进行复杂优化的编译器,应特别注意选择允许简单重组的表示。,2019年1月17日星期四,第35页,(6) 目标代码(intermediate code) 存放最终生成的目标代码,该代码最终是文本形式的文件。 (7) 临时文件(t e m p o r a ry file) 计算机过去一直未能

16、在编译器时将整个程序保留在存储器中。这一问题已经通过使用临时文件来保存翻译时中间步骤的结果或通过“匆忙地”编译(也就是只保留源程序早期部分的足够信息用以处理翻译)解决了。,2019年1月17日星期四,第36页,1.3 编译程序的设计,构造编译程序要掌握以下几方面的内容: 源语言:理解其结构和含义 目标语言:必须清楚硬件的系统结构和指令的格式等 编译方法,2019年1月17日星期四,第37页,1.3 编译程序的构造,一般实现编译程序的方法有: 1.直接用机器语言编写编译程序 2.用汇编语言编写编译程序 注:编译程序核心部分常用汇编语言编写 3.用高级语言编写编译程序 注:这是普遍采用的方法 4.自编译 5.用编译工具自动生成:LEX(词法分析)与YACC(用于自动产生LALR分析表) 6.移植(同种语言的编译程序在不同类型的机器之间移植),2019年1月17日星期四,第38页,本书构成及编译程序框架,2019年1月17日星期四,第

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号