编译原理知识点总结-哈工程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第一章概论1.什么是编译器?输入输出?编译器是将一种语言翻译为另一种语言的计算机程序。输入:源语言(sourcelanguage)编写的程序输出:目标语言(targetlanguage)编写的程序。2.汇编语言的优缺点优点:汇编语言大大提高了编程的速度和准确度缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。3.什么是解释器?与编译器的区别?解释程序是如同编译器的一种语言翻译程序。与编译器的区别:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。4.乔姆斯基分类结构有几种文法?名称?相互关系?4种名称:0型无限制文法1型上下文相关文法2型上下文无关文法3型正则文法相互关系:其中的每一个都是其前者的专门化。5.什么是扫描器?扫描器的功能是什么?扫描器就是语法分析程序。功能:依据词法规则,分析由字符组成的源程序,把它分割为一个一个具有独立意义的最小语法单位,即单词。6.什么是编辑器?IDE中编辑器的新功能编译器通常接受由任何生成标准文件(例如ASCII文件)的编辑器编写的源程序。IDE中编辑器的新功能:尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。这样的编辑器称为基于结构的,且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序。7.什么是调试器,与编译器的关系调试程序是可在被编译了的程序中判定执行错误的程序。运行一个带有调试程序的程序与直接执行不同,这是因为调试程序保存着所有的或大多数源代码信息(诸如行数、变量名和过程)。它还可以在预先指定的位置(称为断点)暂停执行,并提供有关已调用的函数以及变量的当前值的信息。为了执行这些函数,编译器必须为调试程序提供恰当的符号信息。8.编译器有哪几个功能模块?各模块的功能及输入输出扫描程序记号语法分析程序语法树语义分析程序注释树中间代码生成中间代码源代码优化程序中间代码代码生成器目标代码目标代码优化程序源代码目标代码常量表符号表错误处理器9.编译器有哪几个辅助部件?功能?(1)常量表:存放在程序中用到的常量和字符串(2)符号表:与标识符有关:函数、变量、常量以及数据类型。与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表格中的语义分析程序。(3)错误处理器对源程序中错误的反应。10.分析,综合已将分析源程序以计算其特性的编译器操作归为编译器的分析部分,而将生成翻译代码时所涉及到的操作称作编译器的综合部分。当然,词法分析、语法分析和语义分析均属于分析部分,而代码生成却是综合部分。在优化步骤中,分析和综合都有。分析正趋向于易懂和更具有数学性,而综合则要求更深的专业技术。因此,将分析步骤和综合步骤两者区分开来以便发生变化时互不影响是很有用的。11.前段,后端将编译器分成了只依赖于源语言(前端)的操作和只依赖于目标语言(后端)的操作两部分。12.遍编译器发现,在生成代码之前多次处理整个源程序很方便。这些重复就是遍。13.静态语义?哪几类?程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。这些特征被称作静态语义。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息(诸如数据类型)被称为属性,它们通常是作为注释或“装饰”增加到树中(还可将属性添加到符号表中)。14.编译器中第一个考虑目标机的物理特性的模块是:代码生成器______15.T型图中|ST|S,T,H分别代表什么?|H|语言H(代表宿主语言)编写的编译器将语言S(代表源语言)翻译为语言T(代表目标语言)16.T型图描述自举及移植的过程第二章词法分析正则表达式三种基本操作选择,连结,重复(闭包)有穷自动机的组成元素开始状态,结束状态,状态转换函数正则表达式a.十六进制数字串([0-9]|[A-F])+(x|X)b.包含奇数个a或奇数个b(b*ab*a)*ab*|(a*ba*b)*ba*c.包含偶数个a或偶数个b(a*ba*b)*a*|(b*ab*a)*b*d.a或b必须成对出现(aa|b)*(a|bb)*从正则表达式到NFA(Thompson结构)(1)并置(2)选择(3)重复DFA:构成{S,∑,T,S0,A}S:状态集合∑:字母表T:转换函数S0:初始状态A:接受状态NFA:NFA构成相同,且Σ可以有ε,转入状态可以是多个状态。例:S={x,y,z}∑={a,b,c}T=fS0=xA={y,z}f(x,a)={x,y}f(x,c)={z}f(y,b)={y,z}a*ab*=a+b*a*ab*b=a+b+a*ca+b*|a+b+|a*c=a*(ab|c)第三章上下文无关文法及分析语法分析两类:自顶向下,自底向上。自顶向下两类:递归下降,LL(1)分析。文法的表示用BNF(巴克斯范式)形式表示。二义性文法:每一个字符串产生不同的分析树错只要有一个字符串产生不同的分析树对引起二义性的原因(1)运算的优先级:把具有相同优先权的算符归纳在一组中,并为每一种优先权规定不同的规则。(2)运算的结合行:用基本情况代替递归,强制重复算符匹配一边的递归。(3)else的悬挂问题:最近嵌套规则。出现这三种情况就是二义性文法不是二义性说明原因,是二义性举反例,画出两个不同的分析树。字符串最左推导,不要少步骤(每次只能对一个非终结符进行替换)。最左推导最右推导形成的分析树的特点:最左推导是前序遍历,最右推导是后序遍历的倒序??。最左推导:是指它的每一步中最左的非终结符都要被替换的推导。最右推导:是指它的每一步中最右的非终结符都要被替换的推导。最左推导和与其相关的分析树的内部节点的前序编号相对应;而最右推导则和后序编号相对应。句柄:一个句型的最左直接短语。(第五章,不考)分析程序的功能及输入输出功能:确定程序的语法输入:由扫描程序生成的记号序列输出:语法树二义性文法及解决办法可生成带有两个不同分析树的串的文法称作二义性文法。解决方法:(1)设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。这样的规则称作消除二义性规则。(2)将文法改变成一个强制正确分析树的构造的格式。编译过程中,语法分析器的任务是(1)分析单词串是如何构成语句和说明的(2)分析语句和说明是如何构成程序的(3)分析程序的结构1)终结符集合T。2)非终结符集合N(与T不相交)。3)产生式或文法规则A→α的集合P,其中A是N的一个元素,α是(T∪N)∗中的一个元素(是终结符和非终结符的一个可为空的序列)。4)来自集合N的开始符号。第四章自顶向下的分析LL(1)的命名第1个“L”指的是由左向右地处理输入第2个“L”指的是它为输入串描绘出一个最左推导。括号中的数字1意味着它仅使用输入中的一个符号来预测分析的方向。(先行一个符号)递归下降分析:将一个非终结符A的文法规则看作将识别A的一个过程的定义。消除左递归:(1)简单直接左递归→(2)普遍的直接左递归→提取左因子:→First集定义:令X为一个文法符号(一个终结符或非终结符)或ε,则集合First(X)由终结符组成,此外可能还有ε,它的定义如下:1.若X是终结符或ε,则First(X)={X}。2.若X是非终结符,则对于每个产生式X→X1X2...Xn,First(X)都包含了First(X1)-{ε}。若对于某个in,所有的集合First(X1),...,First(Xi)都包括了ε,则First(X)也包括了First(Xi+1)-{ε}。若所有集合First(X1),...,First(Xn)包括了ε,则First(X)也包括ε。Follow集定义:给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还有$。集合Follow(A)的定义如下:1.若A是开始符号,则$就在Follow(A)中。2.若存在产生式B→αAγ,则First(γ)-{ε}在Follow(A)中。3.若存在产生式B→αAγ,且在First(γ)中,则Follow(A)包括Follow(B)。LL(1)证明定理:1.在每个产生式A→α1|α2|...|αn中,对于所有的i和j:1≤i,j≤n,i≠j,First(αi)∩First(αj)为空。2.若对于每个非终结符A都有First(A)包含了ε,那么First(A)∩Follow(A)为空。自顶向下的基本原理:在最左推导中描述出各个步骤来分析记号串输入。自顶向下的关键问题:(whichrulestouseCh4_2P6)(P114)第六章语义分析语义分析:计算编译过程所需的附加信息。语义分析的分类(1)程序的分析,要求根据编程语言的规则建立其正确性,并保证其正确执行。(2)由编译程序执行的分析,用以提高翻译程序执行的效率。静态语义分析包括(1)执行分析的描述(2)使用合适的算法对分析的实现属性:属性是编程语言结构的任意特性。属性在其包含的信息和复杂性等方面变化很大,特别是当它们能确定时翻译/执行过程的时间。属性的典型例子有:•变量的数据类型。•表达式的值。•存储器中变量的位置。•程序的目标代码。•数的有效位数。联编:属性的计算及将计算值与正在讨论的语言结构联系的过程称作属性的联编。联编时间:联编属性发生时编译/执行过程的时间称作联编时间。执行之前联编的属性是静态的,执行期间联编的属性是动态的。在如C或Pascal这样的静态类型的语言中,变量或表达式的数据类型是一个重要的编译时属性。表达式的值通常是动态的,编译程序要在执行时生成代码来计算这些值。变量的分配可以是静态的也可以是动态的,这依赖于语言和变量自身的特性FORTRAN77中所有的变量都是静态分配。LISP中所有的变量是动态分配的。C和Pascal语言混合了静态和动态的两种变量分配。程序的目标代码无疑是一个静态属性。数的有效位数在编译期间是一个不被明确探讨的属性。属性文法:确定语言实体的属性或特性,它们必须进行计算并写成属性等式或语义规则,并描述这些属性的计算如何与语言的文法规则相关。这样的一组属性和等式称作属性文法。符号表的主要操作:插入,查找,删除。符号表的功能:(1)建立存储信息(2)类型检查(3)数据地址第七章运行时环境运行时环境:目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。几乎所有的程序设计语言都使用运行时环境的3个类型中的某一个,它的主要结构并不依赖于目标机器的特定细节。环境的这3个类型分别是:FORTRAN77的完全静态环境。像C、C++、Pascal以及Ada这些语言的基于栈的环境。像LISP这样的函数语言的完全动态环境。调用序列设计的重要方面有:1)如何在调用程序和被调用程序之间分开调用序列操作(也就是有多少调用序列的代码放在调用点上,多少放在每个过程的代码开头);2)在多大程度上依赖处理器对调用支持而不是为调用序列的每一步生成显式代码。完全静态运行时环境:最简单的运行时环境类型是所有数据都是静态的,且执行程序期间在存储器中保持固定。这样的环境可用来实现没有指针或动态分配,且过程不可递归调用的语言。此类语言的标准例子是FORTRAN77。基于栈运行时环境:在允许递归调用以及每一个调用中都重新分配局部变量的语言中,不能静态地分配活动记录。相反地,必须以一个基于栈的风格来分配活动记录,即当进行一个新的过程调用(活动记录的压入时,每个新的活动记录都分配在栈的顶部,而当调用退出时则再次解除分配。完全动态运行时环境:因为活动记录仅在对它们所有的引用都消失了才再重新分配,而且这又要求活动记录在执行时可动态地释放任意次,所以称这个环境为完全动态的。代码优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。目的:产生高效的目标代码。三中级别:局部优化、循环优化、全局优化。由哈尔滨工程大学姜训智总结

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功