1、2019年2月9日,编 译 原 理,高级语言,汇编语言,SOURCE PROGRAM,Assemble PROGRAM,为什么要学习编译原理,程序设计语言是计算机软件专业的重要核心 学习编程的历程: C语言汇编语言数据结构,2019年2月9日,编 译 原 理,为什么要学习编译原理,必修主干课程,操作系统和编译系统构成程序设计者与计算机之间的基本界面。 通过学习该课程,掌握编译的基本理论、常用的编译技术,了解编译过程及编译系统结构和机理。能运用所学技术解决实际问题,能独立编写一个小型编译系统。 此外,通过学习编译原理可以更好地理解程序语言的内部机制,从而更好地理解和运用程序设计语言。能运用编译程
2、序构造的原理和技术完成相关软件工具的设计和开发工作。,2019年2月9日,编 译 原 理,为什么要学习编译原理,计算机软件学科理论与实践相结合的典范。在学习过程中既要注重该领域在理论上取得的完美结论,也要注重这些理论在实际中的应用。,2019年2月9日,编 译 原 理,先修课程,要求先学习以下课程 1.程序设计语言 2.算法与数据结构:栈分配、堆分配、静态分配等各种存储分配方式。线性表、二叉查找树、哈希表等多种数据结构。 3.离散数学:集合论与数理逻辑是进一步学习形式语言与自动机理论的数学基础。 最好学习过或同时学习以下课程 1.软件工程:掌握大型程序设计以及工程化的软件生产方法。 2.形式语
3、言与自动机:相当于本课程中词法分析与语法分析的理论基础。,2019年2月9日,编 译 原 理,李冬梅,施海虎,编译原理,人民邮电出版社,教材,2019年2月9日,编 译 原 理,要求及学习方法,平时(30%) 无故旷课: 一本教材,认真听课:以讲义为主,板书为辅-做适当的笔记 认真完成课堂和课后作业 完成要求的课外实验内容,期末(70%):闭卷笔试,课程特点:理论性强,算法复杂,2019年2月9日,编 译 原 理,第1章 编译概述,掌握编译程序中所涉及的有关名词术语2.理解编译程序总的框架,明确编译程序工作的基本过程及各阶段的基本任务,教学目标,2019年2月9日,编 译 原 理,1.1.程序
4、的翻译 1.2. 编译程序的组成 1.3. 编译程序构造 1.4. 编译技术的应用及发展,教学内容,2019年2月9日,编 译 原 理,低级语言(Low level Language) 字位码、机器语言、汇编语言 特点:与特定的机器有关,功效高,但使用复杂、繁 琐、费时、易出错 高级语言 - Fortran、Pascal、C 语言等 特点:不依赖具体机器,移植性好、对用户要求低、易使用、易维护等。,1.1 程序的翻译,2019年2月9日,编 译 原 理,源程序用汇编语言或高级语言编写的程序称为源程序目标程序用目标语言所表示的程序目标语言:可以是介于源语言和机器语言之间的“中间语言”,可以是某种
5、机器的机器语言,也可以是某机器的汇编语言。翻译程序将源程序转换为目标程序的程序称为翻译程序。它是指各种语言的翻译器,包括汇编程序和编译程序,是汇编程序、编译程序以及各种变换程序的总称。,2019年2月9日,编 译 原 理,源程序、翻译程序、目标程序 三者关系:,源程序,翻译程序,目标程序,SOURCE PROGRAM,TRANSLATER,OBJECT PROGRAM,即源程序是翻译程序的输入,目标程序是翻译程序的输出,2019年2月9日,编 译 原 理,汇编程序若源程序用汇编语言书写,经过翻译程序得到用机器语言表示的程序,这时的翻译程序就称之为汇编程序,这种翻译过程称为“汇编”(Assemb
6、le)编译程序若源程序是用高级语言书写,经加工后得到目标程序,上述翻译过程称“编译”(Compile),汇编程序与编译程序都是翻译程序,主要区别是加工对象的 不同。由于汇编语言格式简单,常与机器语言之间有一一对 应的关系。汇编程序所要做的翻译工作比编译程序简单的多。,2019年2月9日,编 译 原 理,源程序的编译和运行,编译或汇编阶段运行阶段,源程序,目标程序,编译程序 或汇编程序,输出数据,目标程序 + 运行子程序,输入数据,2019年2月9日,编 译 原 理,工作过程,解释程序(Interpreter)(类似于口译,不生成目标代码)对源程序进行解释执行的程序。,特点:与编译系统比较,解释
7、系统较简单、 可移植性好,易于查错,但速度慢,2019年2月9日,编 译 原 理,“编译-解释执行”系统,源程序,编译程序,源程序的中间形式,输出数据,解释程序,输入数据,2019年2月9日,编 译 原 理,例如Java语言,2019年2月9日,编 译 原 理,所谓编译过程是指将高级语言程序翻译为等价的目标程序的过程。,翻译外文资料: 1、能识别出句子中的一个单词; 2、分析句子的语法结构; 3、根据句子的含义进行初步翻译; 4、对译文进行修饰; 5、写出最后的译文。,1.2 编译程序的组成,2019年2月9日,编 译 原 理,翻译和编译工作的比较,编译过程,2019年2月9日,编 译 原 理
8、,词法分析,语法分析,语义分析及中间代码生成,代码优化,目标代码生成,习惯上是将编译过程划分为5个基本阶段:,编译过程,2019年2月9日,编 译 原 理,单词:是语言的基本语法单位保留字(如:if、else、while)标识符(如:max、min、str)常数 (如:12、6.8、a)分界符(如:+、-、*、/、;、(、) ),字符序列,任务:根据词法规则分析和识别单词,一、词法分析,编码形式,2019年2月9日,编 译 原 理,词法分析程序的结果-二元式,y = x + r * 6,2019年2月9日,编 译 原 理,有关术语,词法分析(lexical analysis or scanni
9、ng) -The stream of characters making up a source program is read from left to right and grouped into tokens,which are sequences of characters that have a collective meaning. 单词-token 保留字-reserved word 标识符 -identifier(user-defined name),2019年2月9日,编 译 原 理,任务:根据语法规则(即语言的文法),分析并识别出各种语法成分(如表达式、语句、函数等),并进
10、行语法正确性检查。,二、语法分析(编译程序的核心),文法 :=“=”:=“+” | “*” :=“(”“)” | | | ,2019年2月9日,编 译 原 理,赋值语句,标识符,标识符,整数,y,x,r,6,:=“=” :=“+” | “*” :=“(”“)” | | | ,y = x + r * 6,2019年2月9日,编 译 原 理,语法分析的结果-语法树,2019年2月9日,编 译 原 理,有关术语,语法分析(syntax analysis or parsing)The purpose of syntax analysis is to determine the source progr
11、ams phrase structure.This process is also called parsing.The source program is parsed to check whether it conforms to the source languages syntax,and to construct a suitable representation of its phrase structure.,2019年2月9日,编 译 原 理,任务:依据语义规则对识别出的各种语法成分析其含义,并进行初步翻译,生成中间代码。,三、语义分析及中间代码生成,静态: 分析语法成份的含义
12、,进行语义上的正确性检查 动态: 根据相应语义,生成中间代码(介于源语言和目标语言之间的中间语言形式),2019年2月9日,编 译 原 理,生成中间代码的目的: 1、利于代码优化 2、利于目标代码的移植,中间代码的形式: 四元式、三元式、逆波兰表示,2019年2月9日,编 译 原 理,四元式,其中t1、t2、t3为编译程序引入的临时工作单元,例:y = x + r * 6,2019年2月9日,编 译 原 理,有关术语,语义分析(semantic analysis)The parsed program is further analyzed to determine whether it con
13、forms to the source languages contextual constraints:scope rules, type rules e.g. To relate each applied occurrence of an identifier in the source program to the corresponding declaration.,2019年2月9日,编 译 原 理,有关术语,中间代码生成(intermediate code generation)This is where the intermediate representation of the
14、 source program is created.We want this representation to be easy to generate,and easy to translate into the target program.The representation can have a variety of forms,but a common one is called three-address code or 4- tuple code.,2019年2月9日,编 译 原 理,任务:对中间代码进行加工变换,以得到高质量的目标代码,四、代码优化,例:y = x + r *
15、 6,2019年2月9日,编 译 原 理,有关术语,代码优化(Intermediate code optimization)The optimizer accepts input in the intermediate representation and output a version still in the intermediate representation .In this phase,the compiler attempts to produce the smallest,fastest and most efficient running result by applyin
16、g various techniques.,2019年2月9日,编 译 原 理,五、目标代码生成,任务:把中间代码变换成特定机器上的低级语言代码,2019年2月9日,编 译 原 理,编译过程小结,2019年2月9日,编 译 原 理,按逻辑功能不同,可将编译过程划分为五个基本阶段,与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段(即五个逻辑子过程)。,每个阶段中都要有: 符号表管理和错误处理,2019年2月9日,编 译 原 理,诊察错误,并能报告用户错误性质和位置 出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。,填表:把源程序中的信息和编译过程中所产生的信息登记在表格中
17、查表:在随后的编译过程中同时又要不断的查找这些表格中的信息,编译程序的逻辑结构,2019年2月9日,编 译 原 理,典型的编译程序具有7个逻辑部分,S.P,O.P,2019年2月9日,编 译 原 理,根据编译程序各部分功能,将编译程序分成前端和后端,前端:通常将与源程序有关的编译部分称为前端。词法分析、语法分析、语义分析、中间代码生成-分析部分特点:与源语言有关后端:与目标机有关的部分称为后端。代码优化、代码生成 -综合部分特点:与目标机有关,编译程序的前端和后端,2019年2月9日,编 译 原 理,同一前端+不同后端 不同机器构成同一语言的编译程序,例如Java语言,2019年2月9日,编
18、译 原 理,同一前端+不同后端 不同机器构成同一语言的编译程序,例如.NET框架,2019年2月9日,编 译 原 理,不同前端+同一后端 同一机器生成几个语言的编译程序,例如GCC,2019年2月9日,编 译 原 理,对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理 ,生成新的源程序中间形式或目标程序,通常称之为一遍。,遍,2019年2月9日,编 译 原 理,一遍扫描即可完成整个编译工作的称为一遍扫描编译程序,遍的划分视具体情况而定(内存的大小、源语言的繁简、目标程序质量的高低),优点: 1、减少对内存容量的要求 2、编译程序结构清晰、各遍功能独立、相互联系简单,缺点: 增加
19、读写中间文件的次数,降低效率,2019年2月9日,编 译 原 理,构造编译程序必须精通: 源 语 言 目标语言 编译方法,1.3 编译程序的构造,2019年2月9日,编 译 原 理,开发编译程序的途径: 自展法 工具法 自动生成法 移植法,2019年2月9日,编 译 原 理,自展法,2019年2月9日,编 译 原 理,应用:大部分软件工具的开发,都要使用编译技术和方法,语法制导的结构化编辑器 程序格式化工具 软件测试工具 静态分析器:不可能执行的代码、定义后未引用的变量 动态测试工具:运行后与期望结果比较 程序理解工具:确定调用关系,画出流程图 高级语言的翻译工具,1.4 编译技术的应用及发展
20、,2019年2月9日,编 译 原 理,其它应用: 文本编辑器 信息检索系统 模式识别器 排版、绘图系统,2019年2月9日,编 译 原 理,并行编译技术 目的:提高并行计算机体系结构的性能,超大规模计算的日益增长的需求 两种实现方法 利用重构技术将串行程序并行化 直接编写并行程序 交叉编译技术,发展,交叉编译器,由于目标机指令系统与宿主机的指令系统不同,编译时将应用程序的源程序在宿主机上生成目标机代码,称为交叉编译。,O,A,B,2019年2月9日,编 译 原 理,语言开发环境中的伙伴程序 编辑器(editor) 预处理器(preprocessor) 连接程序(linker) 装配程序(loa
21、der) 调试程序(debugger),2019年2月9日,编 译 原 理,小结,内容 1 什么是编译程序 2 编译过程和编译程序的结构 3 为什么要学习编译程序 重点 对编译程序的功能和结构做一综述 难点 了解编译程序各个成分在编译阶段的逻辑关系以及他们怎样作为一个整体完成编译任务的,小结,2019年2月9日,编 译 原 理,习题1、2、3,小结,小结,小结,小结,小结,小结,小结,思考题,2019年2月9日,编 译 原 理,1.判断下面的陈述是否正确。 (1)编译程序的五个组成部分缺一不可。 (2)高级语言程序到低级语言程序的转换是基于语义的等价变换。 (3)含有优化部分的编译程序的执行效
22、率高。 (4)因为编译程序和解释程序具有不同的功能,所以它们的实现技术也完全不同。 (5)编译程序和解释程序的根本区别在于解释程序对源程序并没有真正进行翻译。 (6)无论一遍扫描的编译器还是多遍扫描的编译器都要对源程序扫描一遍。,答案:(1) F (2) T (3) F (4) F (5) F (6) T,2019年2月9日,编 译 原 理,2计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?3画出编译程序的总体逻辑结构图,简述各部分的主要功能。,2019年2月9日,编 译 原 理,练 习,请指出下列错误信息是编译的哪个阶段报告的 else没有匹配的if; 使用的函数没有定义; 在数中出现非数字字符。,答案:(1) 语法 (2) 语义 (3) 词法,