编译原理学习笔记(东南大学)(2014年春)
编译原理基础知识

编译原理基础知识编译原理是计算机科学中一门重要的学科,它研究的是将程序源代码转化为可执行代码的过程。
掌握编译原理的基础知识对于理解计算机编程语言的运行原理以及进行高效编程至关重要。
本文将介绍编译原理的基本概念、过程和常用算法。
一、编译原理概述编译器是实现编译原理的工具,它将高级语言代码转化为机器语言代码。
编译器的工作过程可以分为三个主要阶段:词法分析、语法分析和语义分析。
词法分析器主要负责将源代码分解为词法单元,语法分析器则负责将词法单元组织成语法树,而语义分析器则检查语法树的语义错误并进行修正。
二、词法分析词法分析是编译器的第一个阶段,它将源代码分解为词法单元(Token)。
词法单元是程序中的最小可识别单位,如标识符、关键字、运算符等。
词法分析器通常使用有限自动机、正则表达式等方法进行词法单元的识别和分类。
三、语法分析语法分析是编译器的第二个阶段,它将词法单元组织成语法树(Parse Tree)。
语法树是由语法分析器根据源代码的语法规则生成的一棵树状结构。
语法分析器使用上下文无关文法(CFG)来描述语法规则,并通过递归下降、LR分析等算法进行语法单元的解析和组织。
四、语义分析语义分析是编译器的第三个阶段,它主要负责检查语法树的语义错误并进行修正。
语义分析器会检查变量的声明和使用是否一致、类型是否匹配等问题,并生成中间代码或目标代码。
常见的语义分析算法包括类型检查、符号表管理等。
五、代码生成代码生成是编译器的最后一个阶段,它将语义分析阶段生成的中间代码或目标代码转化为可执行代码。
代码生成器会优化代码的执行效率,包括寄存器分配、指令选择、代码重排等。
常用的代码生成算法有静态单赋值(SSA)形式转换、线性扫描代码生成等。
六、总结编译原理是计算机科学中的一门重要学科,它涉及到将源代码转化为可执行代码的过程。
掌握编译原理的基础知识可以帮助我们理解计算机编程语言的运行原理,提高编程效率。
本文介绍了编译原理的概述,包括词法分析、语法分析、语义分析和代码生成等基本概念和过程。
编译原理第一章学习笔记

编译原理第⼀章学习笔记第1章编译程序的基本概念1.1什么是编译程序java中反编译命令:javap汇编语⾔本质上是⼀种助记符编译程序和解释程序两⼤不同:编译程序有⽬标程序⽽解释程序没有⽐如在C语⾔中,.exe就是⽬标程序前者效率⾼⽽后者交互性好1.2 编译程序的逻辑结构编译程序分为五个阶段词法分析结果是⼀个token序列语义分析结果是⼀个语义树语法分析结果是⼀个语法树/中间代码中间代码形式与源语⾔和⽬标语⾔没有关系——————————————————以此为界,上⾯是前端,下⾯是后端优化处理⽬标代码⽣成在编译过程中,编译程序不断地和符号表管理程序和错误处理程序打交道1.3编译程序的实现机制遍:编译程序对源程序或等价程序扫描的遍数在整个编译过程中,看似扫描了五遍,其实只有两遍,分别是对前端和后端进⾏的扫描即第⼀遍:词法分析、语法分析、语义分析。
第⼆遍:代码优化和中间代码⽣成每遍中的各阶段的⼯作是穿插进⾏的,例如下图:其中,语法分析器处于核⼼地位,每当语法分析器需要⼀个完整的语法单位时,便向词法分析器请求⼀个Token。
当接收到所需要的token之后,便调⽤语义分析器⽣成中间代码。
1.4 编译程序的⽣成⽅法涉及三个语⾔:源语⾔、⽬标语⾔和编译程序的实现语⾔编译程序的⽣成⽅法:⽤:利⽤已有的编译器写:⾃⼰动⼿写⼀个半⽤半写:重写现有编译器的后端⾃动⽣成编译程序:词法分析程序⽣成器LEX语法分析程序⽣成器YACC编译程序⽣成器输⼊:词法规则、语法规则和语义解释1.5 编译过程实例分析对如下C语⾔程序进⾏编译:int a,b;b = a + 2*5;1.词法分析:识别单词并分类词法分析的结果是以token的形式传给语法分析2.语法分析:组词成句并进⾏语法错误检查⽣成结果是⼀棵语法树分⽀语句由变量和表达式组成:变量赋值语句(expression)赋值语句可以分成项(item)/项之间的加减项可以分成因式(factor)/因式的乘除因式则可以是具体的常数/变量3.语义分析:分析各种语法成分语义分析需要构建两个东西——标识符的语义辞典(符号表)&语句的语义树(中间语⾔)符号表分为:名字类型,⽐如整型int种类,⽐如变量,常量,函数的名字等等,这⾥是值value地址,是⼀个指针接下来是语义树,和语法树很类似,但是是完全不同的,前者是描述语义信息,⽽后者描述的确实构成。
编译原理复习重点含答案

编译原理复习重点含答案编译原理复习重点编译原理是计算机科学中的一门重要课程,它研究的是如何将高级语言程序转化为机器语言的过程。
在编译原理的学习中,我们需要掌握一些重要的概念和技术,以便能够理解和应用编译器的工作原理。
本文将重点介绍编译原理的几个重要主题,并提供相应的答案供参考。
一、词法分析词法分析是编译器的第一个阶段,它的任务是将输入的字符序列划分为一个个有意义的词素(token)。
词法分析器通常使用有限自动机(DFA)来实现,其工作原理是将输入字符序列逐个读入,并根据事先定义好的词法规则进行匹配和识别。
常见的词法单元包括关键字、标识符、常量、运算符等。
常见的词法规则包括:1. 关键字:例如if、while、for等。
2. 标识符:由字母、数字和下划线组成,且以字母或下划线开头。
3. 常量:包括整数常量、浮点数常量、字符常量和字符串常量等。
4. 运算符:例如加法运算符+、减法运算符-等。
5. 分隔符:例如逗号、分号等。
词法分析的结果是一个个词法单元,每个词法单元包含一个词素和对应的词法单元类型。
例如,对于输入程序"int a = 10;",词法分析的结果可能是[("int", "关键字"), ("a", "标识符"), ("=", "运算符"), ("10", "整数常量"), (";", "分隔符")]。
二、语法分析语法分析是编译器的第二个阶段,它的任务是将词法分析器输出的词法单元序列转化为抽象语法树(AST)。
语法分析器通常使用上下文无关文法(CFG)来描述语言的语法结构,并使用递归下降、LL(1)分析、LR分析等算法进行分析。
常见的语法规则包括:1. 表达式:例如算术表达式、布尔表达式等。
编译原理知识点总结

编译原理知识点总结编译原理是计算机科学中的一个重要领域,它研究的是将高级程序语言转化为可执行目标代码的原理和方法。
在软件开发过程中,编译器起着至关重要的作用,因此了解编译原理的知识点对于理解和优化程序的性能至关重要。
1. 词法分析:词法分析是编译器的第一步,它将源代码划分为一个个的词法单元,如关键字、标识符、运算符等。
词法分析器通过正则表达式和有限自动机来实现,可以有效地将源代码转化为词法单元流。
2. 语法分析:语法分析是编译器的第二步,它通过语法规则将词法单元流转化为抽象语法树(AST)。
语法分析器使用上下文无关文法来描述语言的语法结构,并通过LL(1)分析、LR(1)分析等算法来构建抽象语法树。
3. 语义分析:语义分析是编译器的第三步,它对抽象语法树进行语义检查和类型推断。
语义分析器会检查变量的作用域、类型是否匹配等语义错误,并生成中间代码或目标代码。
4. 中间代码生成:中间代码生成是编译器的一项重要任务,它将抽象语法树转化为中间表示形式,如三地址码、四地址码等。
中间代码是一种抽象的低级语言,便于后续的优化和目标代码生成。
5. 代码优化:代码优化是编译器的关键环节,它通过对中间代码进行分析和优化,提高程序的执行效率和资源利用率。
常见的代码优化技术包括常量折叠、循环优化、函数内联等。
6. 目标代码生成:目标代码生成是编译器的最后一步,它将中间代码转化为目标机器代码。
目标代码生成器根据目标机器的特性和指令集,生成可执行的目标代码。
7. 符号表管理:符号表是编译器中用于管理变量、函数等符号信息的数据结构。
符号表包含了符号的名称、类型、作用域等信息,编译器在词法分析、语法分析和语义分析阶段使用符号表进行符号的查找和管理。
8. 错误处理:错误处理是编译器中一个重要的组成部分,它负责检测和报告源代码中的错误。
编译器需要能够准确地定位错误的位置,并给出有意义的错误信息,帮助程序员快速定位和修复错误。
编译原理涉及的知识点非常广泛,上述仅是其中的一部分。
2014编译原理知识点全面

编译原理知识点引论:⏹编译的概念⏹编译过程⏹编译程序的结构⏹编译程序的生成高级语言形式化:⏹上下文无关文法⏹终结符号、非终结符号、产生式⏹推导(最左/右)、归约(规范归约)、语法树⏹句子、句型(规范句型)、短语、直接短语、句柄⏹文法定义的语言⏹文法的二义性(理解)⏹0型、1型、2型、3型文法(前两种了解,后两种要掌握)词法分析:⏹词法分析器的功能⏹状态转换图⏹正规式与正规集⏹DFA、NFA⏹与正规式等价的FA、NFA的确定化、DFA的化简⏹正规文法(左/右线性文法)⏹正规式与正规文法的等价性⏹正规文法与FA的等价性⏹词法分析器自动构造工具LEX(了解)语法分析:⏹自上而下分析:LL(1)分析⏹文法的左递归、回溯⏹LL(1)文法条件(掌握)⏹FIRST集合、FOLLOW集合、SELECT集合⏹递归下降分析法(掌握)⏹预测分析法(掌握)⏹自下而上分析:移进-归约分析⏹算符优先分析法(理解)⏹算符优先文法⏹FIRSTVT集、LASTVT集⏹算符优先关系表⏹算符优先分析算法、素短语、最左素短语⏹LR分析法⏹LR分析算法⏹前缀、活前缀、LR(0)项目集规范族⏹识别活前缀的DFA(掌握)⏹LR(0)分析表、SLR(1)分析表(掌握)⏹LR(1)项目集规范族⏹LR(1)分析表、LALR(1)分析表(了解)⏹出错处理⏹语法分析器自动构造工具YACC(了解)语义分析和中间代码生成:⏹属性文法⏹属性、综合属性、继承属性⏹语义规则⏹翻译模式⏹中间语言(理解)⏹后缀式、三地址代码、抽象语法树、DAG图⏹带注释的语法树⏹一遍扫描的语法制导翻译(理解)⏹LR语法制导翻译技术⏹递归下降语法制导翻译技术符号表的组织与管理(了解)⏹符号表的作用⏹符号表的组织运行时的存储组织与管理(了解)⏹运行时存储器的划分⏹活动记录⏹简单栈式存储分配⏹堆式动态存储分配⏹临时变量的存储分配优化技术:(理解)⏹优化方法概述:⏹局部优化⏹三地址代码的基本块、流图⏹基本块的DAG表示⏹合并已知量、删除公共子表达式、删除无用赋值、交换代码顺序⏹循环优化⏹循环查找⏹代码外提、强度削弱、删除归纳变量⏹窥孔优化⏹冗余存取、删除不可达代码、控制流优化目标代码生成:(了解)⏹目标代码生成器的功能⏹模型机的代码生成算法⏹生成的目标代码较短⏹充分利用寄存器。
编译原理要点整理

编译原理要点整理//红色字体标注的是重点中的重点,大题的归宿第一章引论1.翻译器,编译器的定义2.编译器工作步骤和流程3.编译器前端后端的概念,理解为什么要有前端后端4.“遍”的概念第二章词法分析1.词法分析器的定义2.词法分析器所要完成的任务3.记号,模式,词法单元概念区分4.串的运算(和,连接,指数,闭包,正闭包)5.正规定义6.转换图(注意开始状态和结束状态以及需要将指针回退的状态)7.不确定的有限自动机(NFA)定义8.确定的有限自动机(DFA)定义9.从正规式到NFA(明确通过正规式如何构造连接运算,和运算,闭包运算的NFA)10.此方法产生的NFA的性质11.从NFA到DFA(子集构造法)12.DFA的化简(合并不可区别状态)13.从语言描述直接到DFA14.了解Lex学完本章:能语言描述改写成正规定义,能将正规定义转化为语言描述,给出一个正规式,能转换成相应的NFA,DFA并化简。
第三章语法分析1.上下文无关文法定义2.区分句子和句型3.最左推导&& 最右推导4.分析树5.文法二义性6.消除左递归&& 提左因子7.了解语言鸟瞰(0型文法:短语文法;1型文法:上下文有关文法;2型文法:上下文无关文法;3型文法:正规式)8.FIRST集合&& FOLLOW集合定义及计算方法9.LL(1)文法定义10.了解自上而下的递归下降的预测分析11.自上而下非递归的预测分析(详细明确预测分析器接受某一输入串时的具体过程,明确栈如何变化,输入输出如何变化)12.预测分析表的构造13.句柄的概念14.自下而上的分析方法:用栈实现移近-归约分析(详细明确预测分析器接受某一输入串时的具体过程,明确栈如何变化,输入输出如何变化)15.LR文法和LR分析算法16.构造SLR分析表(从文法构造识别活前缀的DFA(LR(0)项目集规范族),从DFA构造SLR分析表)17.构造规范的LR分析表(从文法构造识别活前缀的DFA(LR(1)项目集规范族),从DFA构造规范的LR分析表)18.构造LALR分析表(从文法构造识别活前缀的DFA(合并同心的LR(1)项目集),从DFA构造规范的LR分析表)(合并同心项目集可能会引起归约-归约冲突,不会引起新的移进-归约冲突)学完本章:能计算FIRST集合和FOLLOW集合;给定一个文法,能判断是否是LL(1)文法,并为其构造分析表;能构造LR(1)文法的三种预测分析表;明确移近归约分析中的每一个步骤,明确栈如何变化。
最全的编译原理知识点-完美总结

第一章1. 程序设计语言是人与计算机联系的工具,通过程序设计语言指挥计算机按照自己的意志进行运算和操作显示信息和输出运算结果。
2. 最早的计算机程序设计语言是机器语言(指令系统)。
机器语言中的指令都是用二进制代码直接表示的。
3. 机器语言和符号语言以及汇编语言都是低级程序设计语言。
4. 1954年FORTRAN I语言的问世标志计算机高级程序设计语言的诞生。
5. 计算机高级程序设计语言独立于机器,比较接近于自然语言,容易学习掌握,编写程序效率高,编写的程序易读易理解易移植。
6. 翻译程序:将高级语言编写的程序翻译成机器语言。
7. 编译程序的工作过程:编译程序这要功能是将源程序翻译成等价的目标程序,这个翻译过程分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
8. 编译程序的重要意义在于它使高级语言独立于机器语言,使程序员用高级语言编写程序时不必考虑那些直接与机器有关的琐碎的环节,这些细节由编译程序区处理。
9. 编译程序包括:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序以及表格处理程序和出错处理程序。
10.编译程序的组织方式:编译过程分为六个阶段,改划分是编译程序的逻辑组织方式。
编译过程分为前端和后端。
前端包括词法分析、语法分析、语义分析、中间代码生成、代码优化。
后端包括目标代码生成,依赖于计算机的硬件系统和机器指令系统。
这种组织方式便于编译程序的移植,如果移植到不同类型的机器上只需修改编译程序的后端即可。
11.翻译方式:编译方式和解释方式。
12.源程序:用高级语言编写的程序。
源程序是编译程序加工的对象。
13.编译方式:先将源程序翻译成汇编语言程序或机器语言程序(目标程序),然后再执行。
这个翻译程序为编译程序.14.编译方式中源程序的编译和目标程序的运行时分成两个阶段完成的。
编译所的目标程序计算机暂时不能执行,必须由连接装配程序将目标程序和编译程序及系统子程序连接成一个可执行程序,这个可执行程序可直接被计算机执行。
编译原理笔记

编译原理Chapter 1 编译概述1. 编译程序:将高级语言的源程序翻译成等价的机器语言或汇编语言的目标程序2. 编译方式程序运行阶段:编译+运行 or 编译+汇编+运行(编译程序+汇编程序)3. 解释方式只有解释执行阶段,根本区别是不生成目标程序4. 编译程序的构成:词法分析,语法分析,语义分析和中间代码生成,代码优化,目标代码生成,表格管理,出错处理5. 阶段划分是在逻辑结构上,不是实际执行的顺序,可以把几个不同阶段组织为一遍扫描6. 代码优化和中间代码生成不是必需的7. 编译程序与具体的机器和语言有关8. 目标代码需要有运行系统和初始数据才能进行运行计算9. 生成编译程序的方法:自编译 or 移植Chapter 2 文法和语言1. 描述程序设计语言考虑的因素:语法,语义和语用2. 闭包和正闭包的关系:*0{}A AA A ε++== 3. 只含空串的集合和空集:0{}{}A ε=≠Φ=4. 形式语言的描述:有穷时用枚举,无穷时用文法5. 文法:{,,,}N T G V V P S =6. 设计文法时要注意空串是否在形式语言中,以及表达能力是否正确7. 最右推导为规范推导,最左规约为规范规约8. 当一个语言是无穷集合时,定义该语言的文法一定是递归的9. 求短语、直接短语和句柄的格式: 句型...中的子串...是(相对于非终结符...)句型...的短语(且为直接短语/句柄)10. 文法二义性:存在句子有两棵不同的语法树,有两个不同的最右(最左)推导(规约) 语言二义性:不存在无二义性的文法文法二义性可以通过非形式规则或改写消除11. 0型无限制文法,1型上下文有关文法,2型上下文无关文法,3型正规文法12. 多余规则:左部符号不可达 or 无法推出终结符号串Chapter 3 词法分析与有穷自动机1. 词法分析程序:扫描和分解字符串形式的源程序,识别出具有独立意义的单词符号,并以(单词种别,单词自身的值)得形式输出2. 单词符号的两种定义方式:正规文法和正规式3. 正规式与正规集一一对应,描述能力与正规文法等价,无法处理{|1}n na b n ≥等4. 正规文法到正规式:联立解正规式方程组,基本型是A aA b =+和A Aa b =+ 正规式到正规文法:反复添加非终结符,基本型是A ab →和*A a b →5. 单词符号的识别方式:有穷自动机(也可用来描述正规集,能力相同)DFA :{,,,,}M Q f S Z =∑,f 单值函数,初态唯一,终态不唯一NFA :{,,,,}M Q f S Z =∑,f 多值函数且允许ε输入(*∑),初态不唯一6. 正规式到NFA :化简后分段转化FA 到正规式:添加总初态节点X 和总终态节点Y ,逐步消去中间节点NFA 到DFA :1)确定化,(,)[(,)]J A b Closure f A b ε=-;2)最简化,删去多余状态,合并等价(一致性,蔓延性)状态7. 正规文法与有穷自动机的互相转化Chapter 4 语法分析1. 语法分析程序:输入词法分析后的单词符号串,输出句子的语法树或错误表2. 自上而下分析:1)要进行确定分析,则文法必须无左递归和无回溯2)消除左递归:'''|,|A Aa b A bA A aA ε→⇔→→消除回溯:提取公共左因子,判断是否为LL(1)文法3)递归下降分析法:scanner() 和 error() 何时使用,main() 的写法4)预测分析法:预测分析表的构造,反序入栈;分析表无多重定义元素表明LL(1),优点是分析表相对小3. 自下而上分析:1)可规约串在规范规约分析法中是句柄,在算符优先分析法中是最左素短语;2)算符优先分析法算符文法规则右部没有相邻非终结符,算符优先文法非终结符间有唯一优先关系 算符优先关系表的构造:FIRSTVT(A) 和 LASTVT(A)素短语:含终结符的直接短语不考虑非终结符的作用,速度快但可能错误识别文法中不含的句子3)LR 分析法综述对文法要求最少,可处理大部分无二义性上下文无关文法LR 分析表 = 分析动作ACTION 表 + 状态转换GOTO 表四种动作:移近s ,规约r ,接受acc ,报错4)LR(0)分析法LR(0)项目指明对活前缀的识别状态,分为规约、移近、待约和接受项目; DFA 中每个状态对于若干项目的集合LR(0)分析表中没有移近-规约冲突和规约-规约冲突则是LR(0)文法5)SLR(1)分析法在LR(0)分析法基础上向前查看一个输入符号,避免无脑规约6)LR(1)分析法LR(1)项目 = [LR(0)项目,搜索符],规约仅在输入符号是搜索符时进行Chapter 5 语法制导翻译技术和中间代码生成1. 语义分析的任务:静态语义审查,执行真正的翻译(生成中间代码或目标代码)2. 语法制导翻译法不是形式化方法,使用属性文法描述语义3.综合属性自下而上,继承属性自上而下传递信息4.常用中间代码:逆波兰式,三元式,四元式,树形表示5.简单算术表达式到四元式的翻译6.布尔表达式到四元式的翻译Chapter 7 代码优化1.代码优化的目的:生成高效率(存储空间少,运行时间短)的目标代码2.代码优化的分类:是否涉及具体计算机:与机器有关(目标代码级),与机器无关(中间代码级);根据涉及程序范围:局部优化,循环优化,全局优化3.用DAG实现局部优化1)基本块的判断,入口和出口语句的定义2)合并已知量、删除公共子表达式和删除无用赋值3)原基本块—> DAG图—> 优化后的基本块4.从程序流图找出循环,通过代码外提、强度削弱和删除归纳变量进行优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图 1.1 编译程序的工作流程
2、自然语言的翻译步骤: 1) 识别出句子的一个个单词; 2) 分析句子的语法结构; 3) 根据句子的含义进行初步翻译; 4) 对译文进行修饰;
第 2 页 共 10 页
Hale Waihona Puke 5) 写出最后译文。 3、本节中要用到的 C 代码示例 本节用到的 C 代码示例如图 1.2 所示:
第 8 页 共 10 页
6) 对于高级程序设计语言及其编译程序来说,语言的语义分析是很重要的。本章主要介 绍语法结构的形式描述问题,编译原理的主要内容也可以归结为应用形式语言理论, 并将它贯穿于词法分析和语法分析两个阶段; 7) 本章重点讨论正规文法、上下文无关文法及其对应的有限自动机和下推自动机,以及 在构造编译程序时如何应用。 2.1.2 字母表与符号串 1、相关概念: 1) 字母表: 是符号的非空有穷集合; 用Σ、V 表示; 2) 符号:语言中最基本的不可再分的单位; 3) 符号串: 符号串是字母表中符号组成的有穷序列; 空串:不含有任何符号的串,记作:ε 4) 句子:字母表上符合某种规则构成的串; 5) 语言:字母表上句子的集合; 6) 注:约定用 a,b,c...表示符号;用α,β,γ...表示符号串;用 A,B,C...表示其集合。 2、符号串结合的运算: 1) 连接(乘积)运算: 定义:若串集A {1 , 2 ,...},串集B {1 , 2 ,...},则乘积 AB ={ | A and B} 注: 串集的自身乘积称作串集的方幂;
A0
字母表 A 的 n 次方幂是字母表 A 上所有长度为 n 的串集。
图 1.3 最右推导和最左规约的图示
最左推导和最右规约的图示如图 1.4 所示:
图 1.4 最左推导和最右规约的图示
错误语句推导图示如图 1.5 所示:
图 1.5 错误语句推导图示
语法树的表示方法: 如图 1.6 所示:
第 4 页 共 10 页
图 1.6 语法树的分析图示
3) 语义分析和中间代码生产; 任务:对语法分析识别出的各类语法范畴,分析其含义,进行和初步翻译,产生介 于源代码和目标代码之间的一种中间代码。 分为两个阶段: 对每种语法范畴进行静态语义检查; 若语义正确,就进行中间代码的翻译; 中间代码形式:四元式、三元式、逆波兰式; 例如,将 x a b * 50 变成中间代码,如图 1.7 所示:
第 7 页 共 10 页
1.3 本章小结:
1、掌握编译程序与高级程序设计语言之间的关系; 2、掌握编译分为哪几个阶段; 3、了解各个阶段完成的主要功能和采用的主要方法。
2. 编译基础知识
2.1 编译基础知识
2.1.1 高级语言与词法分析、语法分析概述: 1、程序语言是一个记号系统; 1) 语法: 2) 语义: 2、语法: 1) 任何语言程序都可以看成是一定字符集(字母表)上的字符串; 2) 语法使得这串字符形成一个形式上正确的程序; 3) 语法 = 词法规则 + 语法规则; 4) 例如: 0.5 * x1 c ,其中: 语言的单词符号:0.5、x1、c、*、+ 语言的语法单位: 0.5 * x1 c 5) 单词符号:语言中具有独立意义的最基本的结构; 6) 词法规则: 词法规则规定了字母表中哪些字符串是单词符号; 单词符号一般包括:常数、标识符、基本字、算符、界限符等; 我们用正规式和有限自动机理论来描述词法结构和进行词法分析。 7) 语法单位:表达式、子句、语句、函数、过程、程序等; 8) 语法规则: 规定了如何从单词符号来形成语法单位; 现在多数程序语言使用上下文无关文法来描述语法规则; 语言的词法规则和语法规则定义了程序的形式结构, 是判断输入字符串是否形成一 个形式上正确的程序的依据。 3、语义: 1) 对于一个语言来说,不仅要给出它的词法、语法规则,而且要定义它的单词符号和语 法单位的意义; 2) 离开语义,语言只是一堆符号的集合; 3) 各种语言中有形式上完全相同的语法单位,含义却不尽相同; 4) 对某种语言,可以定义一个程序的意义的一组规则称为语义规则; 5) 目前,大多数编译程序使用基本属性文法的语法制导翻译方法来分析语义。
编译原理学习笔记
老师:东南大学计算机院廖力老师主讲 编辑:刘文东 时间:2014 年 5 月 1 日 23:11:58
1. 编译原理课程引论
1.1 课程概述
1.1.1 课程地位 1、计算机专业的专业基础课; 2、软件技术基础; 3、计算机专业学生必修的主干课; 4、研究生入学考试的课程之一。 1.1.2 课程作用 1、编译原理是介绍如何将高级程序设计语言变换成计算机硬件所能识别的机器语言,以便计 算机进行处理。 2、理论基础坚实,其形式化系统不仅应用于编译技术,还大量应用于人工智能,多媒体技术 及数据库等领域。 1.1.3 学习任务 1、掌握编译的理论基础和形式化(数学形式)系统; 2、了解编译的全过程及其具体实现方法,大作业就是做一个简单的编译程序。 1.1.4 学习方法 1、认真听课,认真理解书中的基本概念、基本原理和基本算法; 2、弄懂书中的例题与习题; 3、在看书和理解例题时,一定要画出相应的细节变换过程,通过画图加深理解; 4、在理解的基础上记忆; 5、理论结合实践。 1.1.5 学习要求 1、成绩考核方式:平时 30%+期末考试 70% = 100% 2、平时成绩包括点名、作业和大作业。
图 1.7 中间代码示例
4) 中间代码优化; 任务: 对前面产生的中间代码进行加工变换, 以期在最后阶段能产生更为高效的目 标代码; 原则:等价变换; 主要方面:公共子表达式的提取、合并已知量、删除无用语句(注释等) 、循环优 化(使循环中的内容是必须的)等; 5) 目标代码生成。 任务:将经过优化的中间代码转换成特定机器上的低级语言代码; 目标代码的形式: 绝对指令代码:可立即执行的目标代码,完全有 01 串组成; 汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能执行; 可重定位指令代码:现将各目标模块连接起来,确定变量、常量在主存中的位
1.2 课程引论
1.2.1 程序设计语言与编译 1、程序设计语言:机器语言——>汇编语言——>高级语言; 1) 机器语言:01 串,计算机硬件识别容易,但人理解起来比较困难; 2) 汇编语言:对机器语言的抽象,加入助记符,帮助人们理解; 3) 高级语言:引入编译程序,将高级语言变成计算机可以识别的程序。 2、在计算机上执行一个高级语言程序的步骤: 1) 将高级语言程序翻译成机器语言程序; 2) 运行所得到的机器语言程序求得计算结果。
逻辑错误:在编译阶段不处理。
7、遍 1) 遍:指对源程序或源程序的中间结果从头到尾扫描一遍,并做有关的加工处理,生成 新的中间结果或目标代码;注:遍与阶段的含义毫无关系; 2) 一遍扫描:如图 1.12 所示:
图 1.12 一遍扫描示意图(以语法分析为中心)
3) 多遍扫描: 优点:节省内存空间,提高目标代码质量,使编译的逻辑结构清晰; 缺点:编译时间长; 注:在内存许可的情况下,还是遍数尽可能少些为好。 1.2.3 编译程序生成 1、直接用机器语言编写编译程序; 2、用汇编语言编写编译程序:编译程序的核心部分常用汇编语言编写; 3、用高级语言编写编译程序,这是普遍采用的方法。 4、自编译:先编写编译程序的核心部分,然后再考虑其他部分。 5、编译工具:LEX(词法分析)与 YACC(用于语法分析中自动产生 LALR 分析表) ; 6、移植:同种语言的编译程序在不同类型的机器之间移植 1.2.4 编译程序构造 1、在某机器上为某种语言构造编译程序要掌握以下三方面: 1) 源语言: 2) 目标语言: 3) 编译方法:本门课要讲解的重点!
图 1.2 C 代码示例
4、程序语言的翻译步骤: 1) 词法分析; 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词; 单词:高级语言中有实在意义的最小语法单位,它由字符组成,单词可以分为: 基本字(保留字) :void、int、float、 标示符:a、b、c、d、x、y、jisuan、 整常数:50、 运算符:+、-、*、=、 界定符:{、}、 ; 、 , 、(、)、 功能:词法分析依照语法规则,识别出正确的单词。转换成统一规格; 转换: 对基本字、运算符、界限符的转换; 对标识符的转换,标识符由用户定义,转换比较麻烦,转换后的格式为: (类号,内码) ; 对常数的转换; 转换完成后的格式:类号、内码; 描述词法规则的有效工具:正规式和有限自动机; 2) 语法分析; 任务:在词法分析的基础上,根据语言的语法规则,把单词符号组成各类的语法单 位:短语、子句、语句、过程、程序; 语法规则:又称文法,规定单词如何构成短语、语句、过程和程序。 语法规则的表示: BNF: A :: B | C 赋值语句的语法规则:
第 1 页 共 10 页
3、程序设计语言之间的转换 1) 翻译:指能把某种语言的源程序,在不改变语义的条件下,转换成另外一种语言程序 ——目标语言程序; 2) 编译:专指由高级语言转换为低级语言,对整个源程序全部翻译好后,再执行; 3) 编译的转换过程: 两个阶段转换:编译——>运行,编译后直接产生机器语言目标代码; 编译时:源程序——>编译程序——>目标代码,此时直接产生机器语言; 运行时:初始数据——>运行子程序目标代码——>计算结果; 三个阶段转换:编译——>汇编——>运行,编译后现产生汇编语言,然后汇编后, 转换成机器语言目标代码。 编译时:源程序——>编译程序——>汇编程序; 汇编时:汇编语言——>汇编程序——>目标代码; 运行时:初始数据——>运行子程序目标代码——>计算结果; 4) 解释:接收某种高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这 句的执行结果,然后再接收下一句。如 Basic 语言、Java 语言等。 含义:以源程序作为输入,不产生目标程序,一边解释一边执行; 优点:直观易懂,结构简单,易于实现人机对话; 缺点:效率低,不产生目标程序,每次都有重复的动作。 1.2.2 编译程序概述 1、编译程序的工作 编译程序的工作如图 1.1 所示: