编译原理复习清华吕映芝.ppt
《编译原理复习清华吕映芝.ppt》由会员分享,可在线阅读,更多相关《编译原理复习清华吕映芝.ppt(102页珍藏版)》请在三一办公上搜索。
1、编译原理,清华大学计算机科学与技术系 吕映芝 2003.9.9,第1章 编译程序概论,1.1 什么是编译程序1.2 翻译和解释1.3 编译过程和编译程序的结构*1.4 编译程序的实现途径1.5 编译技术在其它软件中的应用 有关学习问题 参考书,1.1 什么是编译程序,语言和翻译:语言是人类交流思想和信息的工具。从自然语言来说,世界上存在着许多种语言,各国之间要交流信息,就要有各种语言之间的翻译。编译程序:编译程序就是一个语言的翻译程序,是把一种语言(称源语言)书写的程序翻译成另一种等价功能语言(称目标语言)的程序。换句话说,编译是指把一种用源语言表示的算法转换到另一种等价的用目标语言表示的算法
2、。,1.1 什么是编译程序,编译程序的必要性:计算机是当代科学发展的重要工具,已渗入到各行各业乃至家庭生活中。所以如何让他为人类工作服务,就必须建立人与计算机之间的信息交流。但计算机只认识由“0”和“1”构成的机器语言,并不认识C、C+、Java、Pascal等高级程序设计语言。每台计算机都有自己独特的指令系统,即机器语言,最早的程序就是用8进制和16进制码的机器语言书写的。,1.1 什么是编译程序,用机器语言书写程序,不仅不易学,而且可调试性、可读性、可维护性和结构性都很差,开发时间也很长。因此,编译程序最初的定义是把一种高级程序设计语言的源程序(面向人的)翻译成另一种等价的低级程序设计语言
3、(面向硬件的)即机器语言或汇编语言。所以,编译程序是人用某种语言书写的某个翻译程序。,1.1 什么是编译程序,编译程序的功能,S:源语言(程序)O:目标语言(程序)I:实现语言,用T型图 表示,1.1 什么是编译程序,随着计算机及其应用的发展,出现了各种应用更方便的高级语言,如:FORTRAN、PL/1、ALGOL 60、COBOL、PASCAL、Ada、LISP、C、C+、JAVA等。早期开发的软件需转换,因此,编译程序不仅是高级语言翻译成机器语言,广泛地讲:编译程序高级语言低级语言 高级语言 高级语言 高级语言 中间语言 中间语言 低级语言,1.1 什么是编译程序,例:高级语言 高级语言
4、FORTRAN PASCAL C JAVA PL/1 C+COBOL,C,Ada,JAVA,1.1 什么是编译程序,逆向工程 低级语言 高级语言例:IBM/4700(汇编语言)C交叉编译 在一个机器上对某种高级语言进行编译,产生的目标语言是另一个机器的汇编语言或机器语言。例:在WAX机上编译Ada语言,产生PC机的汇编语言,这样的目标语言只能在PC机上运行,如嵌入式系统对交叉编译的应用。当功能相同时,不同语言之间的区别,只是语言的词法、语法和语义规则形式不同。运行环境也可能不同。,例:计算园面积,C 程序:function circle();int r;float s;scanf(“%d”,P
5、ascal 程序:procedure circle;var r:integer;s:real;begin read(r);s:=3.1416*r*r;write(s);end;,1.2 翻译和解释,翻译:按源程序的实际输入顺序,处理程 序语句,得到可执行的目标程序。解释:按源语言的定义边解释边执行。解释执行是按照被解释的源程序的逻辑流程进行处理的,不产生目标程序。,解释程序,源程序,输入,输出,解释,解释执行优点:交互方便,节省空间。缺点:效率低。因对源程序的循环语句部分要反复解释执行。共同点:都需进行词法、语法、语义分析。可比喻为:,翻译(编译)-笔译(产生目标程序)解释-口译(不产生目标程
6、序),1.3 编译过程和编译程序结构,编译过程编译程序结构编译的趟(遍)(pass),编译过程,词法分析语法分析语义分析中间代码生成代码优化目标代码生成,词法分析,读字符流的源程序、识别单词例:position:=initial+rate*60;(转换为内部表示,拼标识符、数和复合单词等)单词类型 单词值 标识符(1)position 算符(赋值号):=(复合单词),词法分析,单词类型 单词值 标识符(2)initial 算符(加号)+标识符(3)rate 算符(乘号)*整数 60 界符(分号);,语法分析,功能:层次分析,把源程序的单词组成语法短语(表示成语法树或其它内部码)。现用“巴科斯-
7、瑙尔范式”(EBNF)描述。例:=:=:=+:=*:=“(”“)”:=:=,语法分析(语法树),语义分析,语义审查,静态语义检查上下文相关性如:类型匹配和类型转换,例:Program p();var rate:real;procedure initial;position:=initial+rate*60;/*error*/,类型匹配错误,语义分析,类型转换,中间代码生成,源程序的内部(中间)表示结构简单、含义明确的记号系统,介于高级语言与低级语言之间,与目标机无关,便于优化、移植并容易生成目标代码。通常的中间代码有三元式、四元式、树结构或适合相应语言的中间代码。例:P-Code、C-Code
8、、bytecode等。,中间代码生成(四元式),例:id1:=id2+id3*60;翻译成四元式四元式:3地址(操作符,操作对象1,操作对象2,操作结果)(1)(inttoreal60t1)(2)(*id3t1t2)(3)(+id2t2t3)(4)(:=t3id1),代码优化,代码优化:是对中间代码进行等价变换,以提高目标代码的时、空效率例:上面的4条指令可变成2条,并且节省2 个工作单元。(*id360.0 t1)(+id2t1id1),目标代码生成,(*id360.0t1)(+id2t1id1),movf id3,R2mulf#60.0,R2movf id2,R1addf R2,R1mov
9、f R1,id1,R1、R2是寄存器,符号表管理,记录源程序中使用的名字收集每个名字的各种属性信息类型、作用域、分配存储信息,Const 常量 值:35Var变量 类型:int 层次:2 地址:dx+5,CONST A=35,B=49;VAR C,D,E;PROCEDURE P;VAR G,表格管理(以PL/0为例),名字 类型 层次/值 地址 存储空间,Const(常量)无层次,出错处理,编译的任何时候都可能发现源程序中的错误。检查词法、语法和语义中的错误(静态)。编译程序的处理能力,如存储空间越界(动态)报告出错信息和位置处理和恢复,编译程序结构,词法分析程序语法分析程序语义分析程序中间代
10、码生成程序代码优化程序目标代码生成程序符号表管理程序出错管理程序,出错处理,表格管理,目标代码,源程序,编译的趟(遍)(pass),从头到尾对源程序或各种形式的中间表示 进行扫描,称为一遍编译的前端(front end)中间代码生成后(代码优化后)编译的后端(back end)目标代码生成开始从源程序扫描是第一遍的输入每前一遍的输出是后一遍的输入分遍的原则按实际情况而定,1.4 编译程序的实现途径,应考虑:开发周期、目标程序的效率、可移植性、可调试性、可维护性和可扩充性等。构造方式:手工构造:用机器语言、汇编语言或高级程序设计语言书写。自动构造工具:Lex,Yacc。Lex,Yacc分别 是词
11、法和语法分析器的生成器。移植方式:目标程序用中间语言自展方式:用T型图表示,1.4 编译程序的实现途径,自展方式:步骤 1:,(1),(2),(3),实现目标,注释:PC表示PC机的机器语言或汇编语言 C1、C2是C的子集,C1 C2,自展方式,步骤 2:,步骤 3:,1.5 编译技术在其它软件中的应用,软件测试工具 如:FORTRAN,C的静态和动态测试工具(可测试程序的语句覆盖率,路径覆盖率等)高级程序设计语言的转换网络中的协议数据库系统中各种命令语言的翻译各种软件支持环境,编译程序在系统软件中的所在层,操作系统语言处理系统 应用软件层,应用软件层,复习讨论:,1.编译程序由哪些部分组成?
12、说明每个部分的功能。2.如果在PC机上只有C语言,现在要求实现PASCAL语言,你用什么办法做更好?(最好不用汇编语言编写)3.编译的前端和后端如何划分?4.翻译(编译)和解释的区别是什么?各自的优、缺点是什么?,有关学习问题,教学内容和学习目的学习要求和学习方法,教学内容,(1)编译程序概述(2)PL/0编译程序(读懂文本,扩充功能)(3)语言和文法(4)词法分析和有限自动机(5)自顶向下语法分析方法*(6)自底向上算符优先分析法(7)自底向上LR分析法(8)语法制导翻译和中间代码生成(9)目标程序运行时的存储空间组织*(10)代码优化,学习目的,近年来,信息技术的迅猛发展,对软件技术和软件
13、工具的需求急剧增加,编译技术已大量应用于各种各样软件工具的研制和开发中。从各种语言的结构化编辑器、分析器和语言的解释系统到嵌入式软件,交叉编译器;从传统的强制式的程序设计语言到应用式、面向对象的语言的编译;从一般的批处理环境到交互环境及分布式环境等等;技术需求越来越大,涉及面越来越广。因而,广大从事计算机系统软件和应用软件研制及开发人员对编译技术深入了解的要求越来越高。,学习要求和学习方法,目前,编译系统的构造在理论上有较成熟的体系支持,实现技术也很丰富多样。但要使学生通过该课程的学习从理解原理、掌握技术到自己设计和实现一个完整的编译程序,难度很大,因为课程内容广泛,涉及到数据结构、操作系统、
14、离散数学及语言理论,是综合性很强的一门课程。从抽象形式语言与自动机的概念,到具体构造实现的复杂性,学生都必须理解原理掌握技术。,学习要求和学习方法,学时:课内48,课外80学好原理和构造技术(1)需做相当量作业,巩固课堂知识(2)理论联系实际,做好实验,实验要求,必做题目 65%扩充条件语句条件语句:=IF条件THEN语句ELSE语句 扩充重复语句重复语句:=REPEAT语句;语句UNTIL条件 选做题目用C语言改写PL/0编译程序;80%用Java语言改写PL/0编译程序;80%,实验要求,对PL/0语言扩充整形数组(尽量做此题)。95%讨论:分成3人一组做扩充整形数组,开展讨论、相互学习,
15、培养团队精神。其他选做学完语法分析后可用LL(1)或LR语法分析方法改写PL/0编译程序的某些部分用LEX、YACC编写一个小型的编译器(要求见编译原理实验2)用LEX、YACC改写PL/0编译程序 适当加分,实验要求,实验报告内容:(1)对扩充部分用语法图和EBNF描述;(2)对程序变动部分的说明;(3)所用测试用例;(4)实验体会和建议。,参考书,吕映芝,张素琴,蒋维杜.编译原理.清华大学出版社.1998Tomas Pittmn,The art of Compiler Design theory and Practice,Prentice-Hall 1992Charles N.Fische
16、r,Richard J.Leblanc,Crafting A Compiler,The Benjamin/Cummings Publishing Company 1988ALFRED V.AHO,RAVISETHI,JEFFREY D.ULLMAN,Compilers Principles,Techniques and Tools ADDISSON-WESLEY 1986教材后所列其它参考,第2章 PL/0编译程序的实现,本章目的:以PL/0语言的编译程序为实例,学习一个编译程序实现的基本步骤和相关技术,“PL/0语言的编译程序”是世界著名计算机科学家N.Wirth先生编写的。由于PL/0语言
17、功能简单、结构清晰、可读性强,而又具备了一般高级语言的必须部分,因而PL/0语言的编译程序能充分体现一个高级语言编译程序实现的基本技术和步骤。是一个非常合适的小型编译程序的教学模型。,第2章 PL/0编译程序的实现,通过本章的学习可达到:对编译程序的构造得到一些感性认识和初步了解对编译程序的实现建立起整体概念为系统地学习本课程以下各章节打好基础 为了读者能较好地阅读PL/0语言编译程序文本。本章将对PL/0语言编译程序的实现过程作概括的分析说明。对PL/0语言文法的表示只给出语法图和扩充的巴科斯-瑙尔范式(EBNF)的描述形式,不作文法理论上的讨论。,第2章 PL/0编译程序的实现,功能,PL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 复习 清华 吕映芝

链接地址:https://www.31ppt.com/p-6599815.html