编译技术名词解释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本知识
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序
解释程序与编译程序的主要区别是:
*编译程序将源程序翻译成目标程序后再执行目标程序
*解释程序则是逐条读出源程序中的语句并解释执行,即在解释程序的执行过程中并不产生目标程序。
形式化方法是用一整套带有严格规定的符号体系来描述问题的方法。
文法是程序语言的生成系统
自动机是程序语言的识别系统
推导的每一步都是对当前句型中的最右非终结符用相应产生式的右部进行替换,这样的推导称为最右推导(规范推导)
最右推导的逆过程称为最左归约(规范归约)。
符号串集合的正闭包:设A是符号串的集合,
则称A+为符号串集A的正闭包。具体定义如下:
A+=A1∪A2∪A3…
符号串集合的(星)闭包:设A是符号串的集合,则称A*为符号串集A的星闭包。具体定义如下:
A*=A0∪A1∪A2∪A3…
二义性文法:文法G[S]的一个句子如果存在两棵不同的语法树,或者能找到两种不同的最左推导(或最右推导),则称这个文法是二义性的。
先天二义性文法:对于一个二义性文法G[S],如果能找到一个非二义性文法G'[S],使得L(G')=L(G),则该二义性文法的二义性是可以消除的。如果找不到这样的G'[S],则二义性文法描述的语言为先天二义性的。
推导的每一步都是对当前句型中的最右非终结符用相应产生式的右部进行替换,这样的推导称为最右推导(规范推导)
最右推导的逆过程称为最左归约(规范归约)。
符号串长度:|ab|=2,|ε|=0。四元式,逆波兰,划分基本块,作流图
一个句型的最左直接短语称为该句型的句柄。
语法树的某个结点连同它的所有后代组成了一棵子树。
2型文法:文法G的每一个产生式具有下列形式:
A→α
其中,A∈VN,α∈V*,则称文法G为2型文法或上下文无关文法。
3型文法:
文法G的每个产生式具有下列形式:
A→α或A→αB
其中,A、B∈VN,α∈VT*,则文法G称为3型文法、正规文法或右线性文法
在编译方法中:通常用3型文法(正规文法)来描述高级程序语言的词法部分,然后用有限自动机FA来识别高级语言的单词。
利用2型文法(上下文无关文法)来描述高级语言的语法部分,然后用下推自动机PDA来识别高级语言的各种语法成分
编译程序的结构
源程序
一般来说,整个编译过程可以划分成五个阶段,这五个阶段的任务是:
1.词法分析
任务:将源程序的字符串变换成单词符号流
2.语法分析
任务:是在词法分析的基础上,把单词符号流分解成各类语法单位(语法范畴),通过语法分析可以确定整个输入串是否构成一个语法上正确的“程序”。
遵循的是语言的语法规则(文法规则),用上下文无关文法描述。
3.语义分析和中间代码生成
任务:是对各类不同语法范畴按语言的语义进行初步翻译,
4.代码优化
任务:是对前阶段产生的中间代码进行等价变换或改造,以获得更高效(节省时间和空间)的目标代码。
5.目标代码生成
任务:把中间代码(或经优化处理之后)变换成特定机器上的机器语言程序或汇编语言程序,实现最终的翻译工作。此阶段工作十分依赖硬件系统
常用的生成编译程序的方法:
1.自编译:用某种高级语言书写自己的编译程序称为自编译。
2.交叉编译:是指用A机器上的编译程序来产生可在B机器上运行的目标代码。
3.自展:首先确定一个非常简单的核心语言L0,然后用机器语言或汇编语言书写出它的编译程序T0;再把语言L0扩充到L1,并用L0编写L1的编译程序T1(即自编译);然后再把语言L1扩充为L2,并用L1编写L2的编译程序T2;…… 这样不断扩展下去,直到完成所要求的编译程序为止。
4.移植:是指A机器上的某种高级语言的编译程序稍加改动后在B机器上运行。
LL(1)分析法和递归下降分析法属于自上而下语法分析方法,
LR分析法是一种自下而上进行规范归约的语法分析方法
语义检查内容
动态语义检查:运行时进行
静态语义检查:编译时完成,例如以下几方面的检查。
(1) 类型检查,如参与运算的操作数其类型应相容。
(2) 控制流检查,用以保证控制语句有合法的转向点。
(3) 使用性标识符是否被声明。
(4) 一致性检查,如在相同作用域中标识符只能说明一次、case语句的标号不能相同等。
符号表中的每一项包括两个部分:
一部分填入名字(标识符);
另一部分是与此名字有关的信息
请写出7种常用的优化措施,并指出哪几种主要用于循环优化
1.删除公共子表达式公共子表达式:计算结果相同的子表达式。
2.复写传播:尽量不引用值不变只传递信息的变量
3.删除无用赋值
4.代码外提(循环优化):把循环中的不变运算提到循环体前
5.强度削弱(循环优化):执行时间长的运算替换为执行时间短的
6.删除归纳变量 (循环优化):变换循环控制条件
7、合并已知量
在各个基本块范围内进行的优化称为局部优化。
对于编译程序所用的符号表来说,它所涉及的基本操作大致可以归纳为五类:
(1) 判断一个给定的名字是否在表中;
(2) 在表中填入新的名字;
(3) 对给定的名字访问它在表中的有关信息;
(4) 对给定的名字填入或更新它在表中的某些信息;
(5) 从表中删去一个或一组无用的项。
符号表的组织方式一般可分为直接方式和间接方式。
直接方式是指在符号表中直接填入源程序中定义的标识符及相关信息
间接方式是指单独设置一个字符串数组来存放所有的标识符,并在符号表的名字栏中设置两项内容:一是指针,用来指向标识符在数组中的起始位置;二是一整数值,用来表示该标识符的长度。
运行时管理分静态存储管理和动态存储管理,
静态存储分配是一种最简单的存储管理。一般而言,适于静态存储分配的语言必须满足以下条件:
(1) 数组的上下界必须是常数;
(2) 过程调用不允许递归;
(3) 不允许采用动态的数据结构(即在程序运行过程中申请和释放的数据结构)。