1、1. 编译程序(Compiler) 编译程序是一种翻译程序,它将不能被计算机识别的某种高级语言翻译成计算机能够识别的低级语言。一般编译程序分成五个逻辑模块:词法分析、语法分析、语义分析和中间代码生成、中间代码优化、目标代码生成。2. 解释程序(Intepretter)解释程序是一种翻译程序,它将不能被计算机识别的某种高级语言翻译成计算机能够识别的低级语言。它是逐个语句翻译的,边翻译边执行,不生成目标代码。3 源语言(Source language )和源程序(Source program) 被编译程序翻译的程序称为源程序,书写该程序的语言称为源语言。4 目标语言(Object language
2、 or Target language)和目标程序(Object program or Target program ) 编译程序翻译源程序而得到的结果程序称为目标程序, 书写该程序的语言称为目标语言.5 词法分析(Lexical analysis 或 Scanning)和词法分析程序(Lexical analyzer 或 Scanner) 词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号) 。词法分析程序实现这个任务。词法分析程序可以使用 lex 等工具自动生成。 6语法分析(
3、Syntax analysis 或 Parsing)和语法分析程序(Parser) 语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序 ”,“语句”,“ 表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述. 7语义分析(Syntax analysis) 语义分析是编译过程的一个逻辑阶段. 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查.例如一个 C 程序片断:int arr2,b;b = arr * 10; 源程序的结构是正确的. 语义分析将审查类型并报告错误:不能在表达式
4、中使用一个数组变量,赋值语句的右端和左端的类型不匹配. 8 中间代码生成(Intermediate Code Generation)在进行了语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间表示或中间代码。9中间代码优化(Intermediate Code Optimization )所谓代码优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。10目标代码生成(Object Code Generation )将优化后的中间代码转化成等价的目标代码。目标代码主要
5、有机器语言和汇编语言。11. Lex 一个词法分析程序的自动生成工具。它输入描述构词规则的一系列正规式,然后构建有穷自动机和这个有穷自动机的一个驱动程序,进而生成一个词法分析程序.12. Yacc 一个语法分析程序的自动生成工具。它接受语言的文法,构造一个 LALR(1)分析程序.因为它采用语法制导翻译的思想,还可以接受用 C 语言描述的语义动作,从而构造一个编译程序 . Yacc 是 Yet another compiler compiler 的缩写.13文法(Grammars) 文法是用于描述语言的语法结构的形式规则。文法 G 定义为四元组 ( , , , )。其中为非终结符号(或语法实体
6、,或变量) 集; 为终结符号集; 为产生式(也称规则)的集合;产生式(规则)是形如 或 a :=b 的(a , b)有序对,其中 ( ) 且至少含有一个非终结符,而( ) 。 , 和 是非空有穷集。 称作识别符号或开始符号,它是一个非终结符,至少要在一条规则中作为左部出现。 一个文法的例子: G=( =A,R, =0,1 , =A0R,A01,RA1, =A) 14文法分类(A hierarchy of Grammars) 著名语言学家 Noam Chomsky 定义了四类文法和四种形式语言类,文法的四种类型分别是 0 型、1 型、2 型和 3 型。几类文法的差别在于对产生式施加不同的限制。
7、15 0 型文法(短语结构文法)(phrase structure grammars) 设 G=( , , , ),如果它的每个产生式 是这样一种结构 : ( ) 且至少含有一个非终结符,而 ( ) ,则 G 是一个 0 型文法。0 型文法产生的语言称为 0 型语言。16 1 型文法(上下文有关文法)(context-sensitive grammars) 设 G=( , , , )为一文法,若 中的每一个产生式 均满足| ,仅仅除外,则文法 G 是 1 型或上下文有关的。1 型文法产生的语言称为 1 型语言,也称作上下文有关语言。17 2 型文法(上下文无关文法)(context-free
8、grammars) 设 G=( , , , ),若 P 中的每一个产生式 满足: 是一非终结符,( ) 则此文法称为 2 型的或上下文无关的。2 型文法产生的语言称为 2 型语言,也称作上下文无关语言。18 3 型文法(正规文法)(regular grammars): 设 G=( , , , ),若 中的每一个产生式的形式都是 AaB 或 Aa,其中 A 和 B 都是非终结符,a 是终结符,则 G 是 3 型文法或正规文法。 3 型文法产生的语言称为 3 型语言,也称作正规语言。19句型(Sententialform)设 GS是一文法,如果符号串 x 是从识别符号推导出来的,即有 S x,则称
9、 x 是文法GS 的句型。20句子(Sentence )设 GS 是一文法,如果符号串 x 是从识别符号推导出来的,即有 S x,若 x 仅由终结符号组成,即 S x,x ,则称 x 为 GS 的句子。21语言(Language)文法 G 所产生的语言定义为集合xS x,其中 S 为文法识别符号,且 x 。可用 L(G) 或L(GS)表示该集合。 22. 推导(Derive )推导的概念:分别定义 V*中的符号之间的关系直接推导 、长度为 n(n 1)的推导 和长度为n(n 0)的推导 : (1)如 是文法 G=( , , , )的规则(或说是 P 中的一个产生式), 和 是 V*中的任意符号
10、,若有符号串 v,w 满足: v ,w 则说 v(应用规则 )直接产生 w,或说,w 是 v 的直接推导, 或说,w 直接归约到 v,记做v w。 (2)如果存在直接推导的序列: v w0 w1 w2 wn w,(n0) 则称 v 推导出(产生)w(推导长度为 n),或称 w 归约到 v。记作 v w。 (3)若有 v w,或 vw,则记作 。 23. 语法树(Parse tree)语法树(推导树)的概念:给定文法 G=( , , , ),对于 G 的任何句型都能构造与之关联的语法树(推导树)。这棵树满足下列 4 个条件: 每个结点都有一个标记,此标记是 V 的一个符号。 根的标记是 S。 若
11、一个结点 n 至少有一个它自己除外的子孙,并且有标记 A,则 A 肯定在 中。 如果结点 n 的直接子孙,从左到右的次序是结点 n1,n 2, , nk,其标记分别为A1,A 2,A k,那么 A A1A2,A k 一定是 P 中的一个产生式。 24二义文法(Ambiguous grammer )如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。或者说,若一个文法中存在某个句子,它有两个不同的最左(最右) 推导,则这个文法是二义的。 25短语 (phrase )令 G 是一文法,S 是文法的开始符号, 是文法 G 的一个句型。如果有: 且则称 是句型 相对与非终结符 A 的短
12、语。特别,如有 则称 是句型 相对于规则 的直接短语 (也称简单短语) 。一个句型的最左直接短语称为该句型的句柄。 26句柄 ( sentence handle)令 G 是一文法,S 是文法的开始符号, 是文法 G 的一个句型。如果有: 且则称 是句型 相对与非终结符 A 的短语。特别,如有 则称 是句型 相对于规则 的直接短语 (也称简单短语 )。一个句型的最左直接短语称为该句型的句柄。27正规式(regular expression)和它所表示的正规集( regular set)设字母表为 ,辅助字母表 = , ,.,*,(,)。1. 和 都是 上的正规式,它们所表示的正规集分别为 和 ;
13、 2.任何 a ,a 是 上的一个正规式,它所表示的正规集为a; 3.假定 和 都是 上的正规式,它们所表示的正规集分别为 L( )和 L( ),那么,( ), , 和 也都是正规式,它们所表示的正规集分别为 L( ),L( )L( ),L( )L( )和(L() 。4.仅由有限次使用上述三步骤而定义的表达式才是 上的正规式,仅由这些正规式所表示的字集才是上的正规集。 28确定的有穷状态自动机 DFA(deterministic finite automaton)我们这里是把 DFA 和 NFA 作为正规集的识别工具而介绍的。DFA 定义如下:一个确定的有穷自动机(DFA)M 是一个五元组:M
14、=(K, ,f,S,Z)其中 (1). K 是一个有穷集,它的每个元素称为一个状态;(2). 是一个有穷字母表,它的每个元素称为一个输入字符,所以也称 为输入符号字母表:(3). f 是转换函数,是在 K K 上的映像,即,如 f( ,a)= ( K, K)就意味着,当前状态为 ,输入字符为 a 时,将转换到下一状态 ,我们把 称作 的一个后继状态;(4). SK 是唯一的一个初态;(5). Z K,是一个终态集,终态也称可接受状态或结束状态。29不确定的有穷状态自动机 NFA(nondeterministic finite automaton)NFA 定义如下;一个不确定的有穷自动机(NFA
15、)M 是一个五元组,M=(K, ,f,S,Z)其中 (1). K 是一个有穷集,它的每个元素称为一个状态;(2). 是一个有穷字母表,它的每个元素称为一个输入字符; (3). f 是一个从 K 到 K 的子集的映像 .(4). S K,是一个非空初态集;(5). Z K,是一个终态集。 DFA 和 NFA 的等价定理:对于每个 NFA M,存在一个 DFA M,使得 L(M)L(M),即 M 和M是等价的。 30最小状态 DFA(reduced DFA or minimum DFA) 我们说一个确定的有穷自动机是化简了的,即是说,它没有多余状态并且它的状态中没有两个是互相等价的,这种 DFA
16、也叫做最小状态 DFA。一个 DFA 可以通过消除多余状态和合并等价状态而转换成一个与之等价的最小状态 DFA。 31Token 具有集合意义的字符序列。是词法分析的输出. Token 一般分为标识符,常数(常量),关键字,运算符及界符。32FIRST 集设 G=( , , , )是上下文无关文法 FIRST( )=a ,a , , 若 ,则规定 FIRST( )。 33FOLLOW 集设 G=( , , , )是上下文无关文法,A ,是开始符号FOLLOW(A)=a 且 a ,a FIRST( ), , 若 ,且 ,则#FOLLOW(A)。也可定义为:FOLLOW(A)=a| Aa,a 若有
17、 A,则规定#FOLLOW(A) 这里我们用作为输入串的结束符,或称为句子括号,如:输入串。 34SELECT 集给定上下文无关文法的产生式 A A , ,若 ,则 SELECT(A )= FIRST( ) 如果 ,则 SELECT(A )=FIRST( ) FOLLOW(A)。 35左递归文法(Left recursive grammar) 一个文法含有下列形式的产生式时。 a) AA A , b) AB B A,B , 、 在 a)中也可称为含有左递归的规则或称直接左递归,在 b)中为 A 称文法中含有左递归或间接左递归,文法中只要含有 a)或含有 b)或二者皆有均认为文法是左递归的。 3
18、6LL(1)文法 满足如下条件的上下文无关文法称为 LL(1)文法:对每个非终结符 A 的两个不同产生式, A ,A ,满足 SELECT(A ) SELECT(A ) 其中 、 不同时能 。 LL ( 1)文法的含义是:第一个 L 表明自顶向下分析是从左向右扫描输入串,第二个 L 表明分析过程中将用最左推导,1 表明只需向右看一个符号便可决定如何推导即选择哪个产生式(规则)进行推导,类似也可以有 LL( K)文法,也就是需向前查看 K 个符号才可确定选用哪个产生式。通常采用 K1,个别情况采用 K2。 37递归下降法(Recursive-descent) 递归下降法是 LL(1)文法的分析程
19、序的一种实现方法。它对应文法中每个非终结符编写一个递归过程,这种分析程序由这一系列递归过程的相互调用来完成语法分析工作。 38移进归约分析(shiftreduce analysis) 自底向上分析方法,也称移进归约分析法,它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产生式的右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约栈中只剩文法的开始符号时则为分析成功,也就确认输入串是文法的句子。 39算法优先文法(Operator Precedence Gr
20、ammar) 设有一不含 产生式的算法文法 G,如果对任意两个终结符对 a,b 之间至多只有、和 三种关系的一种成立,则称 G 是一个算符优先文法(Operator Precedence Grammar),即 OPG 文法。 40最左素短语(Most left prime phrase) 设有文法 GS,其句型的素短语是一个短语 ,它至少包含一个终结符,并除自身外不包含其它素短语,句型的最左边的素短语称最左素短语。 41LR 分析 是一种自底向上的语法分析技术,通常称为 LR(K).L 是说从左至右扫描输入串,R 是说分析过程所形成的推导是最右推导,K 是指在做分析决策时向前察看 K 个输入符
21、号.LR 分析可用于一大类上下文无关文法,是一种最常用的无回朔的移进归约分析。42LR(0)项目 ( LR(0) items )文法 G 的产生式的右部适当位置添加有一个圆点则称为一个 LR(0)项目。 43LR(0)项目集规范族( canonical collection of sets of LR(0) items)构成识别一个文法活前缀的 DFA 项目集( 状态)的全体称为这个文法的 LR(0)项目集规范族。44活前缀(viable prefixes) 若 是文法 G 中的一个规范推导。如果符号串 是 的前缀,则称 是 G 的一个活前缀。也就是说 是规范句型 的前缀,但它的右端不超过该句
22、型句柄的末端。这里 S 为对原文法 G 加了产生式 S,S 为原文法 G 的开始符号,S为拓广后文法 G的开始符号。 45属性文法(Attribute grammar) 形式上讲,一个属性文法是一个三元组,(,),一个上下文无关文法;一个属性的有穷集和关于属性的断言或谓词的有穷集。每个属性与文法的某个非终结符或终结符相联。每个断言与文法的某产生式相联。如果对中的某一输入串而言(句子),中的所有断言对该输入串的语法树结点的属性全为真,则该串也是语言中的句子。编译程序的静态语义审查工作就是验证关于所编译的程序的断言是否全部为真。 46语法制导翻译(Syntax-directed translati
23、on) 在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译的办法称作语法制导翻译。47中间语言(中间表示)(Intermediate language(representation)) 在进行了语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间表示或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。另外,还可以在中间代码一级进行与机器无关的优化。48数组内情向量(array dope vector
24、) 一般编译程序对数组说明的处理是把数组的有关信息汇集在一个叫做“内情向量”或“信息向量” 的表格中,以便以后计算数组元素的地址时引用这些信息。每个数组有一个内情向量。其中的信息包括,数组的类型,维数,各维的上、下界,以及数组的首地址。编译程序处理数组说明的主要工作是把内情向量登录在符号表中,这些属性信息是确定存储分配时数组所占空间的大小和数组元素位置的依据。 49符号表(symbol table)在编译程序中符号表用来存放源程序中出现的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性,为进行上下文语义审查和进一步的翻译使用。 50静态存储分配(Static storage all
25、ocation)如果在编译时能确定目标程序运行中所需的全部数据空间的大小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存储位置,称这种分配策略为静态存储分配。51动态存储分配(Dynamic storage allocation)如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。因为对于这种程序在编译时无法知道它在运行时需要多大的存储空间,它所需要的数据空间的大小需待程序运行时动态地确定。有两种动态存储分配方式:栈式(stack)和堆式(heap )。52过程的活动记录 AR(Activation Record)过程的活动
26、记录是一段连续的存储区,用以存放过程的一次执行所需要的信息,一般有如下信息:1 临时工作单元,比如计算表达式过程中需存放中间结果用的临时值单元。2 局部变量,一个过程的局部变量。3 保存机器状态,容纳该过程执行前关于机器状态的信息,诸如程序计数器、寄存器的值,这些值都需要在控制从该过程返回时给予恢复。4 存取链,用以存取非局部变量,这些变量存放于其它过程活动记录中。并不是所有语言需要该信息。5 控制链,指向调用该过程的那个过程的活动记录,这也不是所有语言都需要的。6 实参,也称形式单元,由调用过程向该被调过程提供实参的值(或地址)。当然在实际编译程序中,也常常使用机器寄存器传递实参。7 返回地
27、址,保存该被调过程返回后的地址。 53Display 表 为能存取非局部变量而纪录外包过程的活动记录地址的数组。即每进入一个过程后,在建立它的活动记录的同时建立一张嵌套层次显示表 display。这里所提到的“嵌套层次 ”,是指过程定义的层数,始终假定主程序的层数为 0,因此主程序称为 0 层过程。如某过程 p 是在层次为 i 的过程 q 内定义的,并且 q 是包围 p 的直接外层,那么 p 的过程层数为 i+1。display 是一个指针数组 d,也可看做是一个小栈,自顶向下每个单元依次存放着现行层,直接外层,直至最外层(0 层,主程序层)等每一层过程的最新活动记录的地址。 54基本块(Ba
28、sic block)所谓基本块,是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句。执行时只能从其入口语句进入,从其出口语句退出。 55无循环有向图 DAG(Directed Acyclic Graph)如果有向图中任一通路都不是环路,则称该有向图为无环路有向图,简称。基本块的 DAG表示可用于代码优化。56控制流程图(流图)(Control flow graph)一个控制流程图就是具有唯一首结点的有向图。所谓首结点,就是从它开始到控制流程图中任何结点都有一条通路的结点。 我们可以把一个控制流程图表示成一个三元组(, ),其中,代表图中所有结点集,代表图中所有有向边集, 代表首
29、结点。控制流程图简称为流图。 57循环(Loop ) 在程序流图中,称具有下列性质的结点序列为一个循环: 它们是强连通的。也即,其中任意两个结点之间,必有一条通路,而且该通路上各结 点都属于该结点序列。如果序列只包含一个结点,则必有一有向边从该结点引到其自身。 它们中间有且只有一个是入口结点。因此,我们定义的循环就是程序流图中具有唯一入口结点的强连通子图,从循环外要进入循 环,必须首先经过循环的入口结点。所谓入口结点,是指序列中具有下述性质的结点:从序列外某结点,有一有向边引到它,或者它就是程序流图的首结点。 58必经结点(dominators)和必经结点集(dominators set)在程
30、序流图中,对任意两个结点 m 和 n,如果从流图的首结点出发,到达 n 的任一通路都要经过 m,则称 m 是 n 的必经结点,记为 m DOM n。流图中结点的所有必经结点的集合,称为结点 n 的必经结点集,记为 D(n)。59回边(back edge)假设 ab 是流图中的一条有向边,如果 b DOM a,则称 ab 是流图中的一条回边。60T 型图(T diagram) 一个编译程序涉及到三个方面的语言,即源语言、目标语言和编译程序的书写语言。为了描述方便通常用 T 型图来表示一个编译程序所涉及到的这三个方面的语言。T 型图的左上角表示源语言,右上角表示目标语言,底部表示书写语言(实现语言
31、 )。 58自展(bootstrap)自展的思想是先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言,实现源语言的编译程序,如果把这个过程根据情况分成若干步,像滚雪球一样直到生成预计源语言的编译程序为止,我们把这样的实现方式称为自展技术。 61交叉编译(Cross compile ) 所谓交叉编译是指把一个源语言在一个机器(称为宿主机) 上编译产生另一个机器 (称为目标机)的汇编语言或机器语言。62. 前端(Frontend)有时,常常把编译的过程分为前端(front end) 和后端(back end),前端由那样一些阶段组成:这些阶段的工作主要依赖于
32、源语言而与目标机无关。通常这些阶段包括词法分析、语法分析、语义分析和中间代码生成,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理工作。 63. 后端(Back end )有时,常常把编译的过程分为前端(front end) 和后端(back end),后端工作指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 64四元式(quadruples) 四元式是一种中间代码的形式,是一个有四个域的纪录结构: 四个域分别称为 op,arg1,arg2 和 result 即操作符,运算对象 1, 运算对象 2 和运
33、算结果. 一个例子:( + ,a, b, c) 65传值(Callbyvalue)是调用过程向被调用过程参数传递的两种方法. 传值也称值调用,即将实参计算处它的值,然后把它传给被调过程。具体如下:形式参数当作过程的局部变量处理,即在被调过程的活动记录中开辟了形参的存储空间,这些存储位置即是我们所说的实参或形式单元。调用过程计算实参的值,并将它们的右值(rvalue)放在为形式单元开辟的空间中。被调用过程执行时,就像使用局部变量一样使用这些形式单元。传值或值调用的重要特点是对形式参数的任何运算不影响调用过程的活动记录中实参的值。66传地址(Callbyreference)当参数通过引用传递时,也
34、称作传地址,或引用调用。调用过程传给被调过程的是指针,指向实参存储位置的指针。如实参是一个名字或是具有左值的表达式,则左值本身传递过去。67前缀 prefix 68 后缀 suffix 69 中缀 infix 70终结符 terminal 71终态 terminal state 72初态 first state 73优化程序 optimizer 74自上而下 top-down 75连接 catenation 76自下而上 bottom-up 77规则式 formula 78根结点 root node 79子树 subtree 80 路径 path 81字母表 alphabet 82符号 symbol 83 串 string 84 长度 length 85 集合 gather 86 乘积 product 87 空集 empty set 88 递归 recursion 89巴科斯范式 Backus-Normal Form 90化简 predigest 91符号集 symbol set 92方幂 power 93闭包 closure 94产生 generating 95执行 executing 96程序 program 97逻辑结构 logic structure 98定义 definition 99等价 equivalence 100运算符 operater