编译原理知识点总结 哈工程.docx
《编译原理知识点总结 哈工程.docx》由会员分享,可在线阅读,更多相关《编译原理知识点总结 哈工程.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理知识点总结哈工程
第一章概论
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.编译器中第一个考虑目的机的物理特性的模块是:
代码生成器
______
型图中|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*c
a+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)-{ε}。
假设对于某个i假设所有集合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。
基于栈运行时环境:
在允许递归调用以及每一个调用中都重新分配部分变量的语言中,不能静态地分配活动记录。
相反地,必须以一个基于栈的风格来分配活动记录,即当进展一个新的过程调用(活动记录的压入时,每个新的活动记录都分配在栈的顶部,而当调用退出时那么再次解除分配。
完全动态运行时环境:
因为活动记录仅在对它们所有的引用都消失了才再重新分配,而且这又要求活动记录在执行时可动态地释放任意次,所以称这个环境为完全动态的。
代码优化:
对程序进展各种等价变换,使得从变换后的程序出发,能产生更有效的目的代码。
目的:
产生高效的目的代码。
三中级别:
部分优化、循环优化、全局优化。
由哈尔滨工程大学姜训智总结