版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ch编译原理引论ch编译原理引论ch编译原理引论为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序设计者与计算机之间的根本界面。通过学习该课程,掌握编译的根本理论、常用的编译技术,了解编译过程及编译系统构造和机理。能运用所学技术解决实际问题,能独立编写一个小型编译系统。此外,通过学习编译原理可以更好地理解程序语言的内部机制,从而更好地理解和运用程序设计语言。能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作。ch编译原理引论ch编译原理引论ch编译原理引论为什么要学习1为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序设计者与计算机之间的根本界面。通过学习该课程,掌握编译的根本理论、常用的编译技术,了解编译过程及编译系统构造和机理。能运用所学技术解决实际问题,能独立编写一个小型编译系统。此外,通过学习编译原理可以更好地理解程序语言的内部机制,从而更好地理解和运用程序设计语言。能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作。为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序2课程内容介绍编译器构造的一般原理和根本实现方法介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等强调形式描述技术和自动生成技术课程简介先行课程高等数学、C、离散数学、汇编语言、数据构造课程内容课程简介先行课程3参考资料国外编译原理领域内的3本权威书籍:当代编译技术三大圣经!1、龙书〔Dragonbook〕参考资料国外编译原理领域内的3本权威书籍:当代编译技术三大42、鲸书〔Whalebook〕
2、鲸书〔Whalebook〕
53、虎书〔Tigerbook〕3、虎书〔Tigerbook〕6国内编译原理领域内的权威书籍:1.陈意云?编译原理?高等教育出版社ch编译原理引论课件72.吕映芝?编译原理?清华大学教育出版社;ch编译原理引论课件83.陈英?编译原理?清华工大学出版社3.陈英?编译原理?清华工大学出版社94.蒋宗礼?编译原理?高等教育出版社ch编译原理引论课件105.刘磊?编译原理及实现?机械工业出版社ch编译原理引论课件11要求及学习方法课程特点:理论性强,算法复杂平时〔20%〕无故旷课:-5一本教材,认真听课:以讲义为主,做适当的笔记认真完成课堂和课后作业期末〔80%〕:闭卷笔试要求及学习方法课程特点:理论性强,算法复杂12第一章编译概述掌握编译程序中所涉及的有关名词术语2.理解编译程序总的框架,明确编译程序工作的根本过程及各阶段的根本任务教学目标第一章编译概述掌握编译程序中所涉及的有关名词术语教学目131.2.编译的过程1.3.编译程序的逻辑构造1.4.编译程序的生成1.5.编译技术的应用及开展教学内容教学内容14
程序的翻译语言和翻译:语言是人类交流思想和信息的工具。如自然语言,世界上存在着许多种语言,各国之间要交流信息,就要有各种语言之间的翻译。计算机语言同样是丰富多彩的。程序的翻译语言和翻译:语言是人类交流思想和信息的工具。如1512/9/2022第16页机器语言(machinelanguage)C70600000002汇编语言(assemblerlanguage)
MOVX,2高级语言(high-levellanguage)
X=2为什么要使用编译程序?12/9/2022第16页机器语言(machinelan16程序语言的分类低级语言〔LowlevelLanguage)机器语言、汇编语言特点:与特定的机器有关,成效高,但使用复杂、繁琐、费时、易出错。高级语言--Fortran、Pascal、C语言等特点:不依赖具体机器,移植性好、对用户要求低、易使用、易维护等。程序语言的分类低级语言〔LowlevelLanguage17计算机硬件只懂自己的指令系统,那么它是如何识别除机器语言以外的另一种语言呢??解决这一问题的方法:翻译程序!!计算机硬件只懂自己的指令系统,那么它是如何识别除机器语言以外18翻译程序翻译程序:能够把某一种语言程序〔称为源语言程序〕转换成另一种语言程序〔称为目标语言程序〕的一个程序,而后者与前者在逻辑上是等价的。程序翻译的方式通常有两种,一种是编译方式,另一种是解释方式。源程序翻译程序目标程序翻译程序翻译程序:能够把某一种语言程序〔称为源语言程序〕转换19编译程序编译程序:如果一个翻译程序的源语言是某种高级语言,其目标语言是相对于某一计算机的汇编语言或机器语言,那么称这种翻译程序为编译程序〔或称为编译器〕。假设编译生成的目标程序不是机器代码,而是汇编语言程序,那么还要增加一个会变程序将其会变为机器代码。源程序(高级语言编写)编译程序目标程序(机器语言或汇编语言编写)编译程序编译程序:如果一个翻译程序的源语言是某种高级语言,其20汇编程序如果一个翻译程序的源语言是某种汇编语言,其目标语言是某一计算机的机器语言,那么称这种翻译程序为汇编程序。源程序(汇编语言编写)汇编程序目标程序(机器语言编写)汇编程序如果一个翻译程序的源语言是某种汇编语言,其目标语言是21解释程序解释程序:是一种语言处理程序,它以源程序作为输入,但不产生目标代码,它将源程序中的语句按动态顺序,逐句翻译成课执行代码,一旦具备执行条件,那么立即执行这一阶段代码得到局部结果。源程序(高级语言编写)解释程序计算结果特点:与编译系统比较,解释系统较简单、可移植性好,易于查错,但速度慢解释程序解释程序:是一种语言处理程序,它以源程序作为输入,22编译和解释程序编译程序的工作相当于载翻译一本原著,计算机运行编译后的目标程序,相当于阅读一本译著;而解释程序的工作相当于在进展同声翻译,计算机运行解释程序,相当于我们直接通过翻译听外宾讲话。编译和解释程序23程序的编译执行:输入数据源程序编译程序运行系统目标程序输入数据源程序编译程序运行系统目标程序24程序的解释执行:如:BASIC、Prolog,问题:效率低下解释程序源程序输入数据计算结果为什么解释运行的工作效率低于编译方式??程序的解释执行:解释程序源程序输入数据计算结果为什么解释运行25编译程序与解释程序的差异根本区别:是否生成目标代码!功能工作结果实现技术上解释程序源程序的一个执行系统源程序的执行结果执行中间代码编译程序源程序的一个转换系统源程序的目标代码把中间代码转换成目标程序编译程序与解释程序的差异根本区别:是否生成目标代码!功能工作26“编译+解释执行〞系统源程序编译程序源程序的中间形式输出数据解释程序输入数据“编译+解释执行〞系统源程序编译程序源程序的中间形式输出数据27例如Java语言.java
java源程序文件.class二进制字节码文件Java虚拟机(JVM)本地计算机系统编译例如Java语言.javajava源程序文件.cl28编译程序在计算机系统中的位置编译程序是一种软件,是系统软件。通常认为系统软件是居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。编译程序在计算机系统中的位置编译程序是一种软件,是系统软件。29翻译程序所处的层次高级语言语言处理程序操作系统汇编语言计算机硬件C编译程序C语言Basic解释程序Basic语言Fortran编译程序Fortran语言............翻译程序所处的层次高语言处理程序操作系统计算机硬件CCBas30几个概念宿主机:运行编译程序的计算机目标机:运行编译程序所产生的目标代码的计算机穿插编译程序:一个编译程序产生不同于其宿主机的机器代码可变目标编译程序:不需要重写编译程序中与机器无关的局部就能改变目标机几个概念宿主机:运行编译程序的计算机31对编译程序的一些说明编译程序实质上是一个翻译程序,要注意等价变换本课程的任务就是讲解在这个转换过程中所涉及到的一些理论和方法,最后,使用这些理论和方法,自己编写一个小的编译器转换是一个总体的功能,要抓住总体构造,逐层细分,写编译器时要表达软件工程中软件设计的原那么,自顶向下,逐层分解。编译器要完成的转换任务相当复杂,实现编译器时必须分步骤分阶段实现。分阶段实现的好处是能够简化程序的设计,当然也可以不分阶段实现。对编译程序的一些说明编译程序实质上是一个翻译程序,要注意等价32编译原理是讨论编译程序设计的根本理论、根本概念、根本方法什么是编译原理编译原理是讨论编译程序设计的根本理论、根本概念3312/9/202234编译器和集成开发环境编译器:即编译程序,把高级语言经分析翻译为低级语言。集成开发环境:简称IDE〔IntegratedDevelopEnvironment〕,是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。背景:早期程序设计的各个阶段都要用不同的软件来进展处理,如先用字处理软件编辑源程序,再用编译程序进展编译,然后用链接程序进展函数、模块连接,开发者必须在几种软件间来回切换操作。人们习惯上经常把IDE称为编译器。12/9/202234编译器和集成开发环境编译器:即编译程序34编译原理引论35常见语言及其IDE语言IDECTC2.0C++C++Builder,VC++6.0,TC3.0C#VS.NETPascalTurboPascalOOPascalDelphiVBVB6.0(解释器)JavaEclipse,JBuilder编译原理引论35常见语言及其IDE语言IDECTC2.0C+351.2编译的过程1.编译程序的工作过程1.2编译的过程1.编译程序的工作过程36编译过程本身是一种语言的翻译过程,类似于外文的翻译。将英文句子“Iwishyousuccess翻译成中文。两阶段完成翻译
分析:分析单词:I,wish,you,success分析语法:主语,谓语,宾语,宾补分析语义:我希望你成功
综合:综合英语的意思、上下文环境和汉语的表达习惯,完成翻译:祝你成功编译过程本身是一种语言的翻译过程,类似于外文的翻译。37翻译外文资料:1、能识别出句子中的一个单词;2、分析句子的语法构造;3、根据句子的含义进展初步翻译;4、对译文进展修饰;5、写出最后的译文。翻译外文资料:38翻译外文资料与编译源程序进展类比翻译外文编译程序分析识别单词分析句子根据语义进行初步翻译词法分析语法分析语义分析、生成中间代码综合修辞加工写出译文代码优化目标代码生成翻译外文资料与编译源程序进展类比翻译外文编译程序识别单词词法39将编译过程划分为5个根本阶段词法分析语法分析语义分析及中间代码生成代码优化目标代码生成将编译过程划分为5个根本阶段词法分析语法分析语义分析及中间代40从概念上来讲,一个编译程序的整个工作过程是划分成阶段进展的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进展的操作在逻辑上是严密连接在一起的。事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。从概念上来讲,一个编译程序的整个工作过程是划分成阶段进展的,411.2编译的过程1.编译程序的工作过程1.2编译的过程1.编译程序的工作过程42(1)词法分析词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进展扫描和分解,根据语言的词法规那么识别出一个个具有独立意义的最小语法单位,即单词。(1)词法分析43根据词法规那么分析和识别单词。把需要存放的单词放到符号表中,如变量名,标号,常量等。工作依据:源语言的构词规那么(即词法),也称为模式(pattern)。标识符的模式是:以字母开头的字母数字序列。根据词法规那么分析和识别单词。44例:sum=(10+20)*(num+square);结果(标识符,sum)(赋值号,=)(左括号,()(整常数,10)(加号,+)(整常数,20)(右括号,))(乘号,*)(左括号,()(标识符,num)(加号,+)(标识符,square)(右括号,))(分号,;)例:结果45词法分析的功能如下:识别出源程序中意义独立的最小词法单位—单词。删除无用的空格、回车和其他与输入介质有关的符号删除程序员为了提高程序可读性所加的注释如果发现错误那么报告出错词法分析的功能如下:46(2)语法分析根据语法规那么〔即语言的文法〕,分析并识别出各种语法成分〔如表达式、语句、函数等〕,并进展语法正确性检查。通常将语法分析的结果表示为语法树。(2)语法分析47sum=(10+20)*(num+square);sum=(10+20)*(num+square);48语法分析的功能是进展层次分析,把源程序的单词序列组成语法短语(表示成语法树)。依据的是语法规那么。C语言的赋值语句的规那么为:
单词序列sum=(10+20)*(num+square);之所以能表示成上图的语法树,依据的是赋值语句和表达式的语法规那么。
<赋值语句>::=<标识符>“=〞<表达式><表达式>::=<表达式>“+〞<表达式>|<表达式>“*〞<表达式><表达式>::=“(〞<表达式>“)〞|<标识符>|<整数>|<实数>语法分析的功能是进展层次分析,把源程序的单词序列组成语法短49(3)语义分析及中间代码生成语义分析阶段的任务是审查源程序有无语义错误。工作依据:源语言的语义规那么一个重要任务:类型检查根据规那么检查每个运算符及其运算对象是否符合要求;数组的下标是否合法;过程调用时,形参与实参个数、类型是否匹配等(3)语义分析及中间代码生成50(3)语义分析及中间代码生成源程序中有些语法成分,按照语法规那么去判断,它是正确的,但它不符合语义规那么。比方使用了没有声明的变量;或者给一个过程名赋值;或者调用函数时参数类型不适宜或者参加运算的两个变量类型不匹配等等。比方下边的程序片段:
intarr[2],c;
c=arr1*10;其中的赋值语句是符合语法规那么的,但是因为没有声明变量arr1,而存在语义错。(3)语义分析及中间代码生成51中间代码生成(可选〕所谓“中间代码〞是一种构造简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原那么为两点:一是容易生成;二是容易将它翻译成目标代码。中间代码的形式: 四元式、三元式、逆波兰表示中间代码生成(可选〕52中间代码(intermediateCode)例:sum=(10+20)*(num+square);后缀表示(逆波兰Anti-PolishNotation)sum1020+numsquare+*=前缀表示(波兰PolishNotation)=sum*+1020+numsquare
四元式表示(三地址码)(+,10,20,T1)(+,num,square,T2)(*,T1,T2,T3)(=,T3,,sum)
三元式表示(+,10,20)(+,num,square)(*,⑴,⑵)(=,sum,⑶)
语法树中间代码(intermediateCode)后缀表示(逆波53(4)中间代码优化(可选〕代码优化阶段的任务是对前阶段产生的中间代码进展变换或进展改造,目的是使生成的目标代码更为高效,即省时间和省空间。(4)中间代码优化(可选〕54例:sum=(10+20)*(num+square)得到的四元式T1=10+20T2=num+squareT3=T1*T2sum=T3优化后T1=num+squareSum=30*T1例:sum=(10+20)*(num+square)得到55这只是优化工作的两个方面,此外诸如公共子表达式的删除、强度削弱、循环优化等优化工作将在后面的章节详细介绍。代码优化工作会降低编译程序的编译速度,因此编译优化阶段常常作为可选择阶段,编译程序具有控制机制以允许用户在编译速度和目标代码的质量间进展权衡。这只是优化工作的两个方面,此外诸如公共子表达式的删除、强度削56思考:代码优化能提高编译程序的运行效率吗?思考:代码优化能提高编译程序的运行效率吗?57(5)目标代码生成目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统构造和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及存放器和后缓存放器的调度等。涉及到的两个重要问题:对程序中使用的每个变量要指定存储单元对变量进展存放器分配(5)目标代码生成58例:sum=(10+20)*(num+square)得到的优化后四元式T1=num+squareSum=30*T1生成如下指令序列:MOVnum,R1MOVsquare,R2ADDR2,R1MUL30,R1MOVR1,sum例:sum=(10+20)*(num+square)得到59目标代码可采用如下三种形式之一:(1)具有绝对地址的机器指令代码。(2)汇编语言形式的目标程序。需要经过汇编程序汇编,以产生机器代码。(3)可重定位的指令代码。多数编译程序所产生的目标代码都是这种类型。目标代码可采用如下三种形式之一:60语句sum=(10+20)*(num+square);的翻译过程语句sum=(10+20)*(num+square);的翻译61编译过程小结目标代码生成程序代码优化程序语义分析生成中间代码语法分析程序词法分析程序S.PO.P编译过程小结目标代码代码优化语义分析语法分析词法分析S.PO62上述编译过程的阶段划分是一种典型的处理模式,事实上并非所有的编译程序都包括这样几个阶段。有些编译程序并不要中间代码,即不存在中间代码生成阶段;有些编译程序不进展优化,优化阶段即可省去;有些最简单的编译程序只有词法分析,语法分析;语义分析和目标代码生成。上述编译过程的阶段划分是一种典型的处理模式,事实上并非所有的631.3编译程序的逻辑构造按逻辑功能不同,可将编译过程划分为五个根本阶段,与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段〔即五个逻辑子过程〕。每个阶段中都要有:符号表管理和错误处理1.3编译程序的逻辑构造按逻辑功能不同,可将编译过程64典型的编译程序具有7个逻辑局部语义分析及生成中间代码程序代码生成程序代码优化程序语法分析程序词法分析程序错误处理符号表管理典型的编译程序具有7个逻辑局部语义分析及生成中间代码程序代码65<1>词法分析:识别单词,至少分以下几大类:关键字〔保存字〕、标识符、字面量、特殊符号;<2>语法分析:得到语言构造并以树的形式表示<3>语义分析:考察构造正确的句子是否语义合法,可修改树构造;<4>中间代码生成〔可选〕:生成一种既接近目标语言,又与具体机器无关的表示,便于优化与代码生成;〔到目前为止,编译器与解释器可以一致〕<1>词法分析:识别单词,至少分以下几大类:关键字〔保存字66<5>中间代码优化〔可选〕:局部优化、循环优化、全局优化等;优化实际上是一个等价变换,变换前后的指令序列完成同样的功能,但是,在占用的空间上和程序执行的时间上都更省、更有效。<6>目标代码生成:不同形式的目标代码-汇编、可重定位、绝对机器指令;<7>符号表管理:合理组织符号,便于各阶段查找、填写等;<8>出错处理:错误的种类-词法错、语法错、静态语义错、动态语义错。<5>中间代码优化〔可选〕:局部优化、循环优化、全局优化67符号表管理编译程序的一项重要工作:记录源程序中使用的标识符收集每个标识符的各种属性信息符号表是由假设干记录组成的数据构造每个标识符在表中有一条记录记录的域是标识符的属性对符号表构造的要求:应允许快速地找到标识符的记录可在其中存取数据标识符的各种属性是在编译的各个不同阶段填入符号表的。符号表管理编译程序的一项重要工作:68声明语句:floattotal,rate;词法分析器:float是关键字total、rate是标识符在符号表中创立这两个标识符的记录语义分析器:total、rate都表示变量float表示这两个变量的类型可以把这两种属性及存储分配信息填入符号表。在语义分析和生成中间代码时,还要在符号表中填入对这个float型变量进展存储分配的信息。声明语句:floattotal,rate;词法分析器:69错误处理在编译的每个阶段都可能检测到源程序中存在的错误词法分析程序可以检测出非法字符错误。语法分析程序能够发现记号流不符合语法规那么的错误。语义分析程序试图检测出具有正确的语法构造,但对所涉及的操作无意义的构造。代码生成程序可能发现目标程序区超出了允许范围的错误。处理与恢复判断位置和性质适当的恢复出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。错误处理在编译的每个阶段都可能检测到源程序中存在的错误70编译有关的其他概念“遍〞前端和后端编译有关的其他概念“遍〞71编译器扫描的遍数遍〔趟〕:是对源程序或源程序的中间结果从头到尾扫描一遍,并作有关加工处理,生成新的中间结果或目标程序。例如:词法分析器对输入源程序进展第一遍扫描,语法分析进展第二遍扫描但一个阶段对应一遍扫描的工作方式是逻辑上的,由于屡次扫描的方式需要大量的存储空间存放中间表示,并且会增加一些不必要的输入输出操作,因此编译器往往把假设干个阶段的工作结合起来,对应一遍扫描,从而减少对程序的扫描遍数。编译器扫描的遍数遍〔趟〕:是对源程序或源程序的中间结果从头到72一个编译程序应分成几遍,如何划分,是与源程序、设计要求、硬件设备等诸因素有关的,因地难于统一划定。在主存可能的前提下,一般遍数尽可能少一点为好。但并不是每种语言都可以用单遍编译程序实现。一个编译程序应分成几遍,如何划分,是与源程序、设计要求、硬件73一遍扫描的编译程序语法分析器取记号词法分析器源程序记号语法成分语义分析及代码生成目标程序返回控制流信息流开场完毕整理目标程序一遍扫描的编译程序语法分析器取记号词法分析器源程序记号语法成74多遍编译程序多遍编译程序75编译阶段的组合在前面所讨论的编译过程中阶段的划分是编译程序的逻辑组织。有时,常常把编译的过程分为前端(frontend)和后端(backend),前端的工作主要依赖于源语言而与目标机无关,后端工作依赖于目标机而一般不依赖源语言。编译阶段的组合在前面所讨论的编译过程中阶段的划分是编译程序的76根据编译程序各局部功能,将编译程序分成前端和后端前端:通常将与源程序有关的编译局部称为前端。 词法分析、语法分析、语义分析、中间代码生成 ---分析局部特点:与源语言有关后端:与目标机有关的局部称为后端。代码优化、代码生成---综合局部特点:与目标机有关编译程序的前端和后端根据编译程序各局部功能,将编译程序分成前端和后端前端:通77编译阶段的组合编译阶段的组合78为什么生成中间代码为什么生成中间代码79.javajava源程序文件.class二进制字节码文件Java虚拟机(JVM)本地计算机系统编译同一前端+不同后端不同机器构成同一语言的编译程序例如Java语言.javajava源程序文件.class二进制80
不同前端+同一后端同一机器生成几个语言的编译程序例如GCC编译程序集合不同前端+同一后端同一机器生成几个语言的编译程序例81编译程序中的主要数据构造(续)Token表符号表常数表错误信息语法树中间代码表临时文件目标代码表编译程序中的主要数据构造(续)Token表语法树中间代码表8212/9/2022第83页1.4编译程序的设计构造编译程序要掌握以下几方面的内容:源语言:理解其构造和含义目标语言:必须清楚硬件的系统构造和指令的格式等编译方法12/9/2022第83页1.4编译程序的设计构造编译程序8312/9/2022第84页1.4编译程序的设计一般实现编译程序的方法有:注:编译程序核心局部常用汇编语言编写注:这是普遍采用的方法5.用编译工具自动生成:LEX(词法分析)与YACC(用于自动产生LALR分析表)6.移植〔同种语言的编译程序在不同类型的机器之间移植〕12/9/2022第84页1.4编译程序的设计一般实现编译841.4编译程序的生成早期人们用汇编语言编写编译程序,但其效率低,实现困难,比方FORTRAN语言编译器18年才完成。专门的编译编译工具,可以支持编译程序某些局部的自动生成。比方:LEX和YACC等。1.4编译程序的生成早期人们用汇编语言编写编译程序,但其85说到一个编译程序,一定要知道它的源语言是什麽,目标语言是什麽,还有它的实现语言是什麽。常使用T型图来表示一个编译程序所涉及的三个语言。
S:源语言O:目标语言T:编译程序实现语言SOT说到一个编译程序,一定要知道它的源语言是什麽,目标语言是什86开发编译程序的途径:自展法工具法自动生成法移植法开发编译程序的途径:87自展法自展法88利用A机器上已有的用A代码编写的L1语言的编译程序,把用L1语言编写的L2语言的编译程序进展编译,得到A机器代码实现的L2语言的编译程序。表示为:L2语言A代码L1语言L1语言A代码A代码L2语言A代码A代码利用A机器上已有的用A代码编写的L1语言的编译程序,把用L189或者表示为:L2语言A代码L1语言L1语言A代码A代码L2语言A代码A代码或者表示为:L2语言A代码L1语言L1语言A代码A代码L2语90问题一:如何直接在一个机器上实现C语言编译器?解决:用汇编语言实现一个C子集的编译程序(P0—人)用汇编程序处理该程序,得到(P2:可直接运行)用C子集编制C语言的编译程序(P3—人)用P2编译P3,得到P4自展问题一:如何直接在一个机器上实现C语言编译器?自展914.用P2编译P3,得到P4C语言机器语言机器语言P4C子集机器语言机器语言P2获得一个工具C子集汇编语言机器语言P01.用汇编语言实现一个C子集的编译程序(P0—人)汇编语言机器语言机器语言C子集机器语言机器语言P1P22.用汇编程序(P1)处理该程序,得到(P2:可直接运行)C语言C子集机器语言P33.用C子集编制C语言的编译程序(P3—人)4.用P2编译P3,得到P4C语言机器语言机器语言P4C子92移植问题二:A机上有一个C语言编译器,是否可利用此编译器实现B机上的C语言编译器?条件:A机有C语言的编译程序目的:实现B机的C语言的编译C语言A机器A机器C语言B机器B机器要完成的任务移植问题二:A机上有一个C语言编译器,是否可利用此编译器实现93C语言C语言B机器C语言A机器B机器C语言B机器B机器C语言C语言B机器C语言A机器A机器C语言A机器B机器需要编写的程序1)问题的分析C语言C语言B机器C语言A机器B机器C语言B机器B机器C语言941.(人)用C语言编制B机的C编译程序P0(C→B)(A机的C编译P1)编译P0,得到在A机上可运行的P2(C→B)C语言C语言B机器C语言A机器A机器C语言A机器B机器P0P1P2获得一个工具2)问题的解决方法1.(人)用C语言编制B机的C编译程序P0(C→B)C语言953.(A机的P2)编译P0,得到在B机上可运行的P3(C→B)P2C语言C语言B机器C语言A机器B机器C语言B机器B机器P0P3C语言C语言B机器C语言A机器A机器C语言A机器B机器P0P1P2获得的工具3.(A机的P2)编译P0,得到在B机上可运行的P3(C→B96编译程序移植:用A机器上的L语言编写能在机器B上运行的L语言的编译程序先用L语言编写出在A机器上运行的产生B机器代码的L编译程序源程序,然后把该程序经过A机器上的L编译程序编译后得到能在A机器上运行的产生B机器代码的编译程序,用这个编译程序再一次编译上述源程序。
编译程序移植:用A机器上的L语言编写能在机器B上运行的L语言97LBLLBLLAALBALBBLBLLBLLAALBALBB98LBLLAALBALBLLBALBBLBLLAALBALBLLBALBB99本机编译器的利用问题三:A机上有一个C语言编译器,现要实现一个新语言NEW的编译器?能利用穿插编译技术么?用C编写NEW的编译,并用C编译器编译它NEW语言C语言A机器C语言A机器A机器NEW语言A机器A机器P0P1P2本机编译器的利用问题三:A机上有一个C语言编译器,现要实现1001.5编译技术的应用及开展应用:大局部软件工具的开发,都要使用编译技术和方法语法制导的构造化编辑器Turbo-Edit、editplus和Ultraedit等程序格式化工具软件测试工具静态分析器:不可能执行的代码、定义后未引用的变量动态测试工具:运行后与期望结果比较程序理解工具:确定调用关系,画出流程图高级语言的翻译工具1.5编译技术的应用及开展应用:大局部软件工具的开发,都101语法制导的构造化编辑器具有通常的正文编辑和修改功能能象编译程序那样对源程序进展分析,把恰当的层次构造加在程序上。可以保证源程序无语法错误有统一的可读性好的程序格式构造化编辑器能够执行一些对编制源程序有用的附加任务,如:检查用户的输入是否正确自动提供关键字从BEGIN或左括号跳到与其相匹配的END或右括号语法制导的构造化编辑器具有通常的正文编辑和修改功能102程序格式化工具读入并分析源程序使程序构造变得清晰可读,如:用缩排方式表示语句的嵌套层次构造用一种专门的字型表示注释等程序格式化工具读入并分析源程序103软件测试工具静态测试动态测试——动态测试器——静态测试器读入源程序在不运行该程序的情况下对其进展分析,以发现程序中潜在的错误或异常。不可能执行到的死代码未定义就引用的变量试图使用一个实型变量作为指针等。利用测试用例实际执行程序记录程序的实际执行路线将实际运行结果与期望结果进展比较,以发现程序中的错误或异常。软件测试工具静态测试——动态测试器——静态测试器读入源程序利104程序理解工具对源程序进展分析确定各模块间的调用关系记录程序数据的静态属性和构造属性画出控制流程图程序理解工具对源程序进展分析105练习1、判断正误(1)编译程序的五个组成局部缺一不可。(2)高级语言程序到低级语言程序的转换是基于语义的等价变换。(3)含有优化局部的编译程序的执行效率高。(4)因为编译程序和解释程序具有不同的功能,所以他们的实现技术也完全不同。(5)编译程序和解释程序的根本区别在于解释程序对源程序并没有真正的进展翻译。(6)无论一遍扫描的编译器还是多遍扫描的编译器都要对源程序扫描一遍。练习1、判断正误106练习2、对以下错误信息,请指出可能是编译的哪个阶段〔词法分析、语法分析、语义分析、代码生成〕报告的。〔1〕else没有匹配的if〔2〕数组下标越界〔3〕使用的函数没有定义〔4〕在数中出现非数字字符〔5〕零作除数练习2、对以下错误信息,请指出可能是编译的哪个阶段〔词法分107 谢谢大家! 谢谢大家!108ch编译原理引论ch编译原理引论ch编译原理引论为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序设计者与计算机之间的根本界面。通过学习该课程,掌握编译的根本理论、常用的编译技术,了解编译过程及编译系统构造和机理。能运用所学技术解决实际问题,能独立编写一个小型编译系统。此外,通过学习编译原理可以更好地理解程序语言的内部机制,从而更好地理解和运用程序设计语言。能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作。ch编译原理引论ch编译原理引论ch编译原理引论为什么要学习109为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序设计者与计算机之间的根本界面。通过学习该课程,掌握编译的根本理论、常用的编译技术,了解编译过程及编译系统构造和机理。能运用所学技术解决实际问题,能独立编写一个小型编译系统。此外,通过学习编译原理可以更好地理解程序语言的内部机制,从而更好地理解和运用程序设计语言。能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作。为什么要学习编译原理必修主干课程,操作系统和编译系统构成程序110课程内容介绍编译器构造的一般原理和根本实现方法介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等强调形式描述技术和自动生成技术课程简介先行课程高等数学、C、离散数学、汇编语言、数据构造课程内容课程简介先行课程111参考资料国外编译原理领域内的3本权威书籍:当代编译技术三大圣经!1、龙书〔Dragonbook〕参考资料国外编译原理领域内的3本权威书籍:当代编译技术三大1122、鲸书〔Whalebook〕
2、鲸书〔Whalebook〕
1133、虎书〔Tigerbook〕3、虎书〔Tigerbook〕114国内编译原理领域内的权威书籍:1.陈意云?编译原理?高等教育出版社ch编译原理引论课件1152.吕映芝?编译原理?清华大学教育出版社;ch编译原理引论课件1163.陈英?编译原理?清华工大学出版社3.陈英?编译原理?清华工大学出版社1174.蒋宗礼?编译原理?高等教育出版社ch编译原理引论课件1185.刘磊?编译原理及实现?机械工业出版社ch编译原理引论课件119要求及学习方法课程特点:理论性强,算法复杂平时〔20%〕无故旷课:-5一本教材,认真听课:以讲义为主,做适当的笔记认真完成课堂和课后作业期末〔80%〕:闭卷笔试要求及学习方法课程特点:理论性强,算法复杂120第一章编译概述掌握编译程序中所涉及的有关名词术语2.理解编译程序总的框架,明确编译程序工作的根本过程及各阶段的根本任务教学目标第一章编译概述掌握编译程序中所涉及的有关名词术语教学目1211.2.编译的过程1.3.编译程序的逻辑构造1.4.编译程序的生成1.5.编译技术的应用及开展教学内容教学内容122
程序的翻译语言和翻译:语言是人类交流思想和信息的工具。如自然语言,世界上存在着许多种语言,各国之间要交流信息,就要有各种语言之间的翻译。计算机语言同样是丰富多彩的。程序的翻译语言和翻译:语言是人类交流思想和信息的工具。如12312/9/2022第124页机器语言(machinelanguage)C70600000002汇编语言(assemblerlanguage)
MOVX,2高级语言(high-levellanguage)
X=2为什么要使用编译程序?12/9/2022第16页机器语言(machinelan124程序语言的分类低级语言〔LowlevelLanguage)机器语言、汇编语言特点:与特定的机器有关,成效高,但使用复杂、繁琐、费时、易出错。高级语言--Fortran、Pascal、C语言等特点:不依赖具体机器,移植性好、对用户要求低、易使用、易维护等。程序语言的分类低级语言〔LowlevelLanguage125计算机硬件只懂自己的指令系统,那么它是如何识别除机器语言以外的另一种语言呢??解决这一问题的方法:翻译程序!!计算机硬件只懂自己的指令系统,那么它是如何识别除机器语言以外126翻译程序翻译程序:能够把某一种语言程序〔称为源语言程序〕转换成另一种语言程序〔称为目标语言程序〕的一个程序,而后者与前者在逻辑上是等价的。程序翻译的方式通常有两种,一种是编译方式,另一种是解释方式。源程序翻译程序目标程序翻译程序翻译程序:能够把某一种语言程序〔称为源语言程序〕转换127编译程序编译程序:如果一个翻译程序的源语言是某种高级语言,其目标语言是相对于某一计算机的汇编语言或机器语言,那么称这种翻译程序为编译程序〔或称为编译器〕。假设编译生成的目标程序不是机器代码,而是汇编语言程序,那么还要增加一个会变程序将其会变为机器代码。源程序(高级语言编写)编译程序目标程序(机器语言或汇编语言编写)编译程序编译程序:如果一个翻译程序的源语言是某种高级语言,其128汇编程序如果一个翻译程序的源语言是某种汇编语言,其目标语言是某一计算机的机器语言,那么称这种翻译程序为汇编程序。源程序(汇编语言编写)汇编程序目标程序(机器语言编写)汇编程序如果一个翻译程序的源语言是某种汇编语言,其目标语言是129解释程序解释程序:是一种语言处理程序,它以源程序作为输入,但不产生目标代码,它将源程序中的语句按动态顺序,逐句翻译成课执行代码,一旦具备执行条件,那么立即执行这一阶段代码得到局部结果。源程序(高级语言编写)解释程序计算结果特点:与编译系统比较,解释系统较简单、可移植性好,易于查错,但速度慢解释程序解释程序:是一种语言处理程序,它以源程序作为输入,130编译和解释程序编译程序的工作相当于载翻译一本原著,计算机运行编译后的目标程序,相当于阅读一本译著;而解释程序的工作相当于在进展同声翻译,计算机运行解释程序,相当于我们直接通过翻译听外宾讲话。编译和解释程序131程序的编译执行:输入数据源程序编译程序运行系统目标程序输入数据源程序编译程序运行系统目标程序132程序的解释执行:如:BASIC、Prolog,问题:效率低下解释程序源程序输入数据计算结果为什么解释运行的工作效率低于编译方式??程序的解释执行:解释程序源程序输入数据计算结果为什么解释运行133编译程序与解释程序的差异根本区别:是否生成目标代码!功能工作结果实现技术上解释程序源程序的一个执行系统源程序的执行结果执行中间代码编译程序源程序的一个转换系统源程序的目标代码把中间代码转换成目标程序编译程序与解释程序的差异根本区别:是否生成目标代码!功能工作134“编译+解释执行〞系统源程序编译程序源程序的中间形式输出数据解释程序输入数据“编译+解释执行〞系统源程序编译程序源程序的中间形式输出数据135例如Java语言.java
java源程序文件.class二进制字节码文件Java虚拟机(JVM)本地计算机系统编译例如Java语言.javajava源程序文件.cl136编译程序在计算机系统中的位置编译程序是一种软件,是系统软件。通常认为系统软件是居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。编译程序在计算机系统中的位置编译程序是一种软件,是系统软件。137翻译程序所处的层次高级语言语言处理程序操作系统汇编语言计算机硬件C编译程序C语言Basic解释程序Basic语言Fortran编译程序Fortran语言............翻译程序所处的层次高语言处理程序操作系统计算机硬件CCBas138几个概念宿主机:运行编译程序的计算机目标机:运行编译程序所产生的目标代码的计算机穿插编译程序:一个编译程序产生不同于其宿主机的机器代码可变目标编译程序:不需要重写编译程序中与机器无关的局部就能改变目标机几个概念宿主机:运行编译程序的计算机139对编译程序的一些说明编译程序实质上是一个翻译程序,要注意等价变换本课程的任务就是讲解在这个转换过程中所涉及到的一些理论和方法,最后,使用这些理论和方法,自己编写一个小的编译器转换是一个总体的功能,要抓住总体构造,逐层细分,写编译器时要表达软件工程中软件设计的原那么,自顶向下,逐层分解。编译器要完成的转换任务相当复杂,实现编译器时必须分步骤分阶段实现。分阶段实现的好处是能够简化程序的设计,当然也可以不分阶段实现。对编译程序的一些说明编译程序实质上是一个翻译程序,要注意等价140编译原理是讨论编译程序设计的根本理论、根本概念、根本方法什么是编译原理编译原理是讨论编译程序设计的根本理论、根本概念14112/9/2022142编译器和集成开发环境编译器:即编译程序,把高级语言经分析翻译为低级语言。集成开发环境:简称IDE〔IntegratedDevelopEnvironment〕,是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。背景:早期程序设计的各个阶段都要用不同的软件来进展处理,如先用字处理软件编辑源程序,再用编译程序进展编译,然后用链接程序进展函数、模块连接,开发者必须在几种软件间来回切换操作。人们习惯上经常把IDE称为编译器。12/9/202234编译器和集成开发环境编译器:即编译程序142编译原理引论143常见语言及其IDE语言IDECTC2.0C++C++Builder,VC++6.0,TC3.0C#VS.NETPascalTurboPascalOOPascalDelphiVBVB6.0(解释器)JavaEclipse,JBuilder编译原理引论35常见语言及其IDE语言IDECTC2.0C+1431.2编译的过程1.编译程序的工作过程1.2编译的过程1.编译程序的工作过程144编译过程本身是一种语言的翻译过程,类似于外文的翻译。将英文句子“Iwishyousuccess翻译成中文。两阶段完成翻译
分析:分析单词:I,wish,you,success分析语法:主语,谓语,宾语,宾补分析语义:我希望你成功
综合:综合英语的意思、上下文环境和汉语的表达习惯,完成翻译:祝你成功编译过程本身是一种语言的翻译过程,类似于外文的翻译。145翻译外文资料:1、能识别出句子中的一个单词;2、分析句子的语法构造;3、根据句子的含义进展初步翻译;4、对译文进展修饰;5、写出最后的译文。翻译外文资料:146翻译外文资料与编译源程序进展类比翻译外文编译程序分析识别单词分析句子根据语义进行初步翻译词法分析语法分析语义分析、生成中间代码综合修辞加工写出译文代码优化目标代码生成翻译外文资料与编译源程序进展类比翻译外文编译程序识别单词词法147将编译过程划分为5个根本阶段词法分析语法分析语义分析及中间代码生成代码优化目标代码生成将编译过程划分为5个根本阶段词法分析语法分析语义分析及中间代148从概念上来讲,一个编译程序的整个工作过程是划分成阶段进展的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进展的操作在逻辑上是严密连接在一起的。事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。从概念上来讲,一个编译程序的整个工作过程是划分成阶段进展的,1491.2编译的过程1.编译程序的工作过程1.2编译的过程1.编译程序的工作过程150(1)词法分析词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进展扫描和分解,根据语言的词法规那么识别出一个个具有独立意义的最小语法单位,即单词。(1)词法分析151根据词法规那么分析和识别单词。把需要存放的单词放到符号表中,如变量名,标号,常量等。工作依据:源语言的构词规那么(即词法),也称为模式(pattern)。标识符的模式是:以字母开头的字母数字序列。根据词法规那么分析和识别单词。152例:sum=(10+20)*(num+square);结果(标识符,sum)(赋值号,=)(左括号,()(整常数,10)(加号,+)(整常数,20)(右括号,))(乘号,*)(左括号,()(标识符,num)(加号,+)(标识符,square)(右括号,))(分号,;)例:结果153词法分析的功能如下:识别出源程序中意义独立的最小词法单位—单词。删除无用的空格、回车和其他与输入介质有关的符号删除程序员为了提高程序可读性所加的注释如果发现错误那么报告出错词法分析的功能如下:154(2)语法分析根据语法规那么〔即语言的文法〕,分析并识别出各种语法成分〔如表达式、语句、函数等〕,并进展语法正确性检查。通常将语法分析的结果表示为语法树。(2)语法分析155sum=(10+20)*(num+square);sum=(10+20)*(num+square);156语法分析的功能是进展层次分析,把源程序的单词序列组成语法短语(表示成语法树)。依据的是语法规那么。C语言的赋值语句的规那么为:
单词序列sum=(10+20)*(num+square);之所以能表示成上图的语法树,依据的是赋值语句和表达式的语法规那么。
<赋值语句>::=<标识符>“=〞<表达式><表达式>::=<表达式>“+〞<表达式>|<表达式>“*〞<表达式><表达式>::=“(〞<表达式>“)〞|<标识符>|<整数>|<实数>语法分析的功能是进展层次分析,把源程序的单词序列组成语法短157(3)语义分析及中间代码生成语义分析阶段的任务是审查源程序有无语义错误。工作依据:源语言的语义规那么一个重要任务:类型检查根据规那么检查每个运算符及其运算对象是否符合要求;数组的下标是否合法;过程调用时,形参与实参个数、类型是否匹配等(3)语义分析及中间代码生成158(3)语义分析及中间代码生成源程序中有些语法成分,按照语法规那么去判断,它是正确的,但它不符合语义规那么。比方使用了没有声明的变量;或者给一个过程名赋值;或者调用函数时参数类型不适宜或者参加运算的两个变量类型不匹配等等。比方下边的程序片段:
intarr[2],c;
c=arr1*10;其中的赋值语句是符合语法规那么的,但是因为没有声明变量arr1,而存在语义错。(3)语义分析及中间代码生成159中间代码生成(可选〕所谓“中间代码〞是一种构造简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原那么为两点:一是容易生成;二是容易将它翻译成目标代码。中间代码的形式: 四元式、三元式、逆波兰表示中间代码生成(可选〕160中间代码(intermediateCode)例:sum=(10+20)*(num+square);后缀表示(逆波兰Anti-PolishNotation)sum1020+numsquare+*=前缀表示(波兰PolishNotation)=sum*+1020+numsquare
四元式表示(三地址码)(+,10,20,T1)(+,num,square,T2)(*,T1,T2,T3)(=,T3,,sum)
三元式表示(+,10,20)(+,num,square)(*,⑴,⑵)(=,sum,⑶)
语法树中间代码(intermediateCode)后缀表示(逆波161(4)中间代码优化(可选〕代码优化阶段的任务是对前阶段产生的中间代码进展变换或进展改造,目的是使生成的目标代码更为高效,即省时间和省空间。(4)中间代码优化(可选〕162例:sum=(10+20)*(num+square)得到的四元式T1=10+20T2=num+squareT3=T1*T2sum=T3优化后T1=num+squareSum=30*T1例:sum=(10+20)*(num+square)得到163这只是优化工作的两个方面,此外诸如公共子表达式的删除、强度削弱、循环优化等优化工作将在后面的章节详细介绍。代码优化工作会降低编译程序的编译速度,因此编译优化阶段常常作为可选择阶段,编译程序具有控制机制以允许用户在编译速度和目标代码的质量间进展权衡。这只是优化工作的两个方面,此外诸如公共子表达式的删除、强度削164思考:代码优化能提高编译程序的运行效率吗?思考:代码优化能提高编译程序的运行效率吗?165(5)目标代码生成目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统构造和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及存放器和后缓存放器的调度等。涉及到的两个重要问题:对程序中使用的每个变量要指定存储单元对变量进展存放器分配(5)目标代码生成166例:sum=(10+20)*(num+square)得到的优化后四元式T1=num+squareSum=30*T1生成如下指令序列:MOVnum,R1MOVsquare,R2ADDR2,R1MUL30,R1MOVR1,sum例:sum=(10+20)*(num+square)得到167目标代码可采用如下三种形式之一:(1)具有绝对地址的机器指令代码。(2)汇编语言形式的目标程序。需要经过汇编程序汇编,以产生机器代码。(3)可重定位的指令代码。多数编译程序所产生的目标代码都是这种类型。目标代码可采用如下三种形式之一:168语句sum=(10+20)*(num+square);的翻译过程语句sum=(10+20)*(num+square);的翻译169编译过程小结目标代码生成程序代码优化程序语义分析生成中间代码语法分析程序词法分析程序S.PO.P编译过程小结目标代码代码优化语义分析语法分析词法分析S.PO170上述编译过程的阶段划分是一种典型的处理模式,事实上并非所有的编译程序都包括这样几个阶段。有些编译程序并不要中间代码,即不存在中间代码生成阶段;有些编译程序不进展优化,优化阶段即可省去;有些最简单的编译程序只有词法分析,语法分析;语义分析和目标代码生成。上述编译过程的阶段划分是一种典型的处理模式,事实上并非所有的1711.3编译程序的逻辑构造按逻辑功能不同,可将编译过程划分为五个根本阶段,与此相对应,我们将实现整个编译过程的编译程序划分为五个逻辑阶段〔即五个逻辑子过程〕。每个阶段中都要有:符号表管理和错误处理1.3编译程序的逻辑构造按逻辑功能不同,可将编译过程172典型的编译程序具有7个逻辑局部语义分析及生成中间代码程序代码生成程序代码优化程序语法分析程序词法分析程序错误处理符号表管理典型的编译程序具有7个逻辑局部语义分析及生成中间代码程序代码173<1>词法分析:识别单词,至少分以下几大类:关键字〔保存字〕、标识符、字面量、特殊符号;<2>语法分析:得到语言构造并以树的形式表示<3>语义分析:考察构造正确的句子是否语义合法,可修改树构造;<4>中间代码生成〔可选〕:生成一种既接近目标语言,又与具体机器无关的表示,便于优化与代码生成;〔到目前为止,编译器与解释器可以一致〕<1>词法分析:识别单词,至少分以下几大类:关键字〔保存字174<5>中间代码优化〔可选〕:局部优化、循环优化、全局优化等;优化实际上是一个等价变换,变换前后的指令序列完成同样的功能,但是,在占用的空间上和程序执行的时间上都更省、更有效。<6>目标代码生成:不同形式的目标代码-汇编、可重定位、绝对机器指令;<7>符号表管理:合理组织符号,便于各阶段查找、填写等;<8>出错处理:错误的种类-词法错、语法错、静态语义错、动态语义错。<5>中间代码优化〔可选〕:局部优化、循环优化、全局优化175符号表管理编译程序的一项重要工作:记录源程序中使用的标识符收集每个标识符的各种属性信息符号表是由假设干记录组成的数据构造每个标识符在表中有一条记录记录的域是标识符的属性对符号表构造的要求:应允许快速地找到标识符的记录可在其中存取数据标识符的各种属性是在编译的各个不同阶段填入符号表的。符号表管理编译程序的一项重要工作:176声明语句:floattotal,rate;词法分析器:float是关键字total、rate是标识符在符号表中创立这两个标识符的记录语义分析器:total、rate都表示变量float表示这两个变量的类型可以把这两种属性及存储分配信息填入符号表。在语义分析和生成中间代码时,还要在符号表中填入对这个float型变量进展存储分配的信息。声明语句:floattotal,rate;词法分析器:177错误处理在编译的每个阶段都可能检测到源程序中存在的错误词法分析程序可以检测出非法字符错误。语法分析程序能够发现记号流不符合语法规那么的错误。语义分析程序试图检测出具有正确的语法构造,但对所涉及的操作无意义的构造。代码生成程序可能发现目标程序区超出了允许范围的错误。处理与恢复判断位置和性质适当的恢复出错处理能力的优劣是衡量编译程序质量好坏的一个重要指标。错误处理在编译的每个阶段都可能检测到源程序中存在的错误178编译有关的其他概念“遍〞前端和后端编译有关的其他概念“遍〞179编译器扫描的遍数遍〔趟〕:是对源程序或源程序的中间结果从头到尾扫描一遍,并作有关加工处理,生成新的中间结果或目标程序。例如:词法分析器对输入源程序进展第一遍扫描,语法分析进展第二遍扫描但一个阶段对应一遍扫描的工作方式是逻辑上的,由于屡次扫描的方式需要大量的存储空间存放中间表示,并且会增加一些不必要的输入输出操作,因此编译器往往把假设干个阶段的工作结合起来,对应一遍扫描,从而减少对程序的扫描遍数。编译器扫描的遍数遍〔趟〕:是对源程序或源程序的中间结果从头到180一个编译程序应分成几遍,如何划分,是与源程序、设计要求、硬件设备等诸因素有关的,因地难于统一划定。在主存可能的前提下,一般遍数尽可能少一点为好。但并不是每种语言都可以用单遍编译程序实现。一个编译程序应分成几遍,如何划分,是与源程序、设计要求、硬件181一遍扫描的编译程序语法分析器取记号词法分析器源程序记号语法成分语义分析及代码生成目标程序返回控制流信息流开场完毕整理目标程序一遍扫描的编译程序语法分析器取记号词法分析器源程序记号语法成182多遍编译程序多遍编译程序183编译阶段的组合在前面所讨论的编译过程中阶段的划分是编译程序的逻辑组织。有时,常常把编译的过程分为前端(frontend)和后端(backend),前端的工作主要依赖于源语言而与目标机无关,后端工作依赖于目标机而一般不依赖源语言。编译阶段的组合在前面所讨论的编译过程中阶段的划分是编译程序的184根据编译程序各局部功能,将编译程序分成前端和后端前端:通常将与源程序有关的编译局部称为前端。 词法分析、语法分析、语义分析、中间代码生成 ---分析局部特点:与源语言有关后端:与目标机有关的局部称为后端。代码优化、代码生成---综合局部特点:与目标机有关编译程序的前端和后端根据编译程序各局部功能,将编译程序分成前端和后端前端:通185编译阶段的组合编译阶段的组合186为什么生成中间代码为什么生成中间代码187.javajava源程序文件.class二进制字节码文件Java虚拟机(JVM)本地计算机系统编译同一前端+不同后端不同机器构成同一语言的编译程序例如Java语言.javajava源程序文件.class二进制188
不同前端+同一后端同一机器生成几个语言的编译程序例如GCC编译程序集合不同前端+同一后端同一机器生成几个语言的编译程序例189编译程序中的主要数据构造(续)Token表符号表常数表错误信息语法树中间代码表临时文件目标代码表编译程序中的主要数据构造(续)Token表语法树中间代码表19012/9/2022第191页1.4编译程序的设计构造编译程序要掌握以下几方面的内容:源语言:理解其构造和含义目标语言:必须清楚硬件的系统构造和指令的格式等编译方法12/9/2022第83页1.4编译程序的设计构造编译程序19112/9/2022第192页1.4编译程序的设计一般实现编译程序的方法有:注:编译程序核心局部常用汇编语言编写注:这是普遍采用的方法5.用编译工具自动生成:LEX(词法分析)与YACC(用于自动产生LALR分析表)6.移植〔同种语言的编译程序在不同类型的机器之间移植〕12/9/2022第84页1.4编译程序的设计一般实现编译1921.4编译程序的生成早期人们用汇编语言编写编译程序,但其效率低,实现困难,比方FORTRAN语言编译器18年才完成。专门的编译编译工具,可以支持编译程序某些局部的自动生成。比方:LEX和YACC等。1.4编译程序的生成早期人们用汇编语言编写编译程序,但其193说到一个编译程序,一定要知道它的源语言是什麽,目标语言是什麽,还有它的实现语言是什麽。常使用T型图来表示一个编译程序所涉及的三个语言。
S:源语言O:目标语言T:编译程序实现语言SOT说到一个编译程序,一定要知道它的源语言是什麽,目标语言是什194开发编译程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论