1、编译过程概述
- 词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词(也称单词符号,或简称符号)
- 语法分析:在语法分析的基础上将单词序列分解成各类语法短语。
- 语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息。
- 中间代码生成:在语法和语义分析后,将源程序变成一种内部表现形式。
- 代码优化:对前一阶段产生的中间代码进行变换或改造。
- 目标代码生成:将中间代码变换成特定机器上的绝对指令代码或汇编指令代码。
2、什么是解释程序、编译程序
解释程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编语言程序或二进制代码程序,这个二进制代码程序在机器上运行以生成结果。
编译程序是一种翻译程序,它能够把某种语言的程序转换成另一种语言的程序,而后
者与前者在逻辑上是等价的。
3、编译器(编译程序)的组成部分及其任务:
- 词法分析器(扫描器):输入源程序,进行词法分析,输出单词符号;
- 语法分析器(分析器):对单词符号串进行语法分析(根据语法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”;
- 语义分析与中间代码产生器:按照语义规则对语法分析器归约(或推导)出的语法单位进行语义分析并将其翻译成一定形式的中间代码;
- 优化器:对中间代码进行优化处理;
- 目标代码生成器:把中间代码翻译成目标程序;
4、什么是文法, Chomsky 文法分类。
文法 是一个四元组(V N,VT,P,S ),其中 VN为非终结符号集,VT为终结符号集,P 为产生式集,S 为开始符号。按乔姆斯基分类,把文法分成四种类型:0 型(短语文法)1型 (上下文有关文法)2型(上下文无关文法)3型(正规文法)
5、上下文无关文法的组成部分:
- 终结符号:组成语言的不可再分的基本符号;
- 非终结符:代表语法范畴,表示一定符号串的集合(由终结符与非终结符组成的串);
- 开始符号:特殊的非终结符,代表所定义语言的语法范畴(句子);
- 产生式:定义语法范畴的书写规则;
6、语法树
句子的树结构表示法称为 语法树 ( 语法分析树或语法推导树 ) 。给定文法 G=(V N , V T , P , S) ,对于 G 的任何句型都能构造与之关联的 语法树。这棵树具有下列特征:
- 根节点的标记是开始符号 S。
- 每个节点的标记都是 V 中的一个符号。
- 若一棵子树的根节点为 A,且其所有直接子孙的标记从左向右的排列次序为 A1A2…AR,那么 AA1A2…AR 一定是 P 中的一条产生式。
- 若一标记为 A 的节点至少有一个除它以外的子孙,则 AVN。
- 若树的所有叶节点上的标记从左到右排列为字符串 w,则 w 是文法 G 的句型;若 w 中仅含终结符号,则 w 为文法 G 所产生的句子。
7、自底向上语法分析方法的基本思想
对输入符号串 自左向右 进行扫描,并将输入符逐个移入一个后进先出栈中, 边移入边分析 ,一旦栈顶符号串形成某个句型的 句柄 时,就用该产生式的左部非终结符代替相应右部的文法符号串,重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就确认输入串是文法的句子。
8、DFA与NFA的区别是什么?
- NFA允许弧上出现ε
- NFA 在某个状态面临输入符号时他会到达多个状态
- DFA的起始状态是唯一的初始状态,NFA允许有多个初始状态
9、什么是句柄?什么是素短语?
一个句型的 最左直接短语 称为该句型的 句柄 。素短语是这样的一个短语, 它至少 包含一个终结符并且不包含更小的素短语 。
10、LL(1)文法
若文法的任何两个产生式 A | 都满足下面两个条件:( 1)FIRST() FIRST( ) = ;( 2)若* ,那么 FIRST() FOLLOW( A ) = 。我们把满足这两个条件的文法叫做 LL(1)文法 ,其中的第一个 L 代表 从左向右扫描输入 ,第二个 L 表示 产生最左推导 , 1 代表在决定分析器的每步动作时向前看一个输入符号 。除了没有公共左因子外,LL(1) 文法还有一 些明显的性质,它不是二义的,也不含左递归。
11、LR(0)分析器
所谓 LR(0) 分析,是指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看 0 个输入符号,就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作 ( 是移进还是按某一产生式进行归约等) 。
12、符号表的功能,操作
符号表的功能:
- 收集符号属性
- 上下文语义的合法性检查的依据
- 作为目标代码生成 阶段地址分配的依据
符号表上的操作:
(增删查改)查找、插入、删除、修改
13、代码优化、代码优化的主要技术。
优化就是对代码进行等价变换,使得变换后的代码运行把那间与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。优化技术有:删除多余运算、代码外提、强度削弱、变换循环控制条件、合并已知量与复写传播、删除无用赋值。