编译原理学习笔记(东南大学)(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编译原理知识点全面

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 ⽅法2.1 优先分析法1. 简单优先分析法规范归约:按照⽂法符号之间的优先关系确定当前句型的可归约串。

(划重点意义不⼤,因为它限制了作⽤范围只能是简单优先⽂法。

2. 算符优先分析法算符⽂法:若产⽣式右边任意位置都没有连续两个或以上的⾮终结符出现,则称为算符⽂法。

算符优先⽂法:若算符⽂法G不含有\varepsilon产⽣式,且它的任何两个构成序对的终结符号之间最多有>、<、=三种优先关系中的⼀种成⽴,则称G是⼀个算符优先⽂法。

其实上⾯这些定义并没有什么卵⽤2.2 LR分析⽅法句柄:最左直接短语。

也是分析树最左边的只有⽗⼦两代的⼦树叶结点⾃左⾄右排列形成的符号串。

LR是⼀种规范规约,具体过程如下:1. 把输⼊符号⼀个⼀个地移进栈⾥,直到栈顶的符号串形成⼀个可归约串为⽌。

2. 把栈顶的这个可归约串归约为产⽣式的左部符号,直到栈顶不再有可归约串为⽌。

3. 重复以上移进-归约操作,直到归约到⽂法的开始符号。

2.3 规范规约步骤:先找出当前句型的句柄,然后把句柄归约为相应产⽣式的左部符号,得到⼀个新的句型,重复此过程,最终归约到⽂法的开始符号。

形式定义:假定\alpha是⽂法G的⼀个句⼦,如果右句型序列\alpha_n,\alpha_{n-1},...,\alpha_1,\alpha_0满⾜以下两个条件,则称该序列是\alpha的⼀个规范归约。

1.\alpha_n = \alpha,\alpha_0 = S2.对任何i(0<i\leq n),\alpha_{n-1}是经过把\alpha_i的句柄替换为相应产⽣式的左部符号⽽得到的。

编译原理笔记

编译原理笔记

编程| 编译原理CH1解释程序和编译程序(了解区别)编译程序若源程序是用高级语言书写,经加工后得到目标程序,上述翻译过程称“编译”。

解释程序(类似于口译,不生成目标代码)对源程序进行解释执行的程序。

共同点如果源语言是高级编程语言,目标语言是机器代码和汇编语言这样的低级语言,这类翻译程序就叫做编译程序或解释程序。

区别编译程序会生成目标代码,而解释程序不会。

编译过程(五个阶段,会背,填空题)词法分析语法分析语义分析及中间代码生成代码优化目标代码生成编译的前端和后端编译前端只依赖于源程序,独立于目标计算机。

编译后端编译后端的工作主要是目标代码的生成和优化,独立于源程序,完全依赖于目标机器和中间代码。

CH2单词的类别(五种单词记号)保留字字面量标识符运算符分界符单词输出的形式<单词种别,单词的属性值>该式是一个二元式词法错误校正的常用策略(简答题)(也可以是这种问法,答案是一样的)对词法错误校正的常用策略是修补尝试,一般包括:删除一个多余的字符插入一个遗漏的字符用一个正确的字符替换一个不正确的字符交换两个相邻的字符NFA确定化,需给出每一个子集书上P34页图2.12 ,结果在P37页一般做题的方法和规则找初态一般在最左边的是一个箭头,箭头的那个状态就是初态。

如上图的i就是初态识别空串在进行识别空串的时候,可以识别很多个空串。

比如上面图中,对于初态i来说,识别1个空串的结果是b,两个是2。

再识别空串,发现已经没有了。

所以结果就是{i,1,2}识别后得出的结果,再识别Ia和Ib识别后得出结果,对于Ia的结果是再次识别空串和a刚才的结果是{i,1,2}对这个结果进行Ia,先对i来说,再识别空串,可以是{1,2},而i来说识别不了a,因为它上面没有a。

对于1来说,再识别空串的结果是{2},识别a的结果是{1},对于2来说,不可以再识别空串了,再识别a是{3},把所以得到的结果整合一下,即结果为{1,2,3}。

编译原理笔记1 编译原理入门及引论

编译原理笔记1 编译原理入门及引论

1.编译原理的地位∙计算机专业的专业基础课(今后也许不用,但一定要懂,要知道高级语言如何运行)∙是软件技术基础(想要编好程序,就必须了解程序是如何运行的)∙是计算机专业的必修的一门主干课∙是本学科研究生如何考生的科目2.编译原理的作用:∙是介绍如何将高级程序设计语言变换成计算机硬件所能识别的机器语言,以便计算机进行处理∙他的理论基础坚实,其形式化系统不仅应用于编译技术,还大量应用于人工智能、多媒体技术及数据库领域3.学习任务:∙掌握编译的理论基础和形式化系统∙了解编译的全过程及其具体实现方法4.编译原理引论4.1程序设计语言与编译4.1.1程序设计语言高级语言,汇编语言,机器语言4.1.2在计算上如何执行一个高级语言程序∙把高级语言程序翻译成机器语言程序∙运行所得的机器语言程序求得计算结果注意:翻译:是指能把某种语言的原程序,在不改变语义的条件下,转换成另一种语言程序-目标语言程序编译:专指由高级语言转换为低级语言解释:接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。

4.1.3编译的转换过程两阶段转换:编译-运行∙编译的过程:源程序--经过compire--〉编译程序-->目标代码(0,1代码,exe文件等)∙运行的过程:初始数据+目标代码-->运行子程序目标代码-->计算结果三阶段的转换:编译(后产生汇编语言程序)--经过-->汇编-->运行∙编译时:源程序-->编译程序-->汇编程序∙汇编时:汇编程序-->目标代码∙初始数据+目标代码-->运行子程序目标代码-->计算结果解释:∙以源程序作为输入,不产生目标程序,一边解释一边执行∙优点:直观易懂,结构简单,易于实现人机对话∙缺点:效率低4.2编译程序概述∙先看自然语言的翻译:1)识别出句子中的一个个单词2)分析句子的语法结构3)根据句子的含义进行初步翻译4)对译文进行修饰5)写出最后译文∙编译程序的工作:1)词法分析2)语法分析3)语义分析和中间代码生成4)优化5)目标代码生成。

高校计算机专业编译原理知识点梳理与讲解

高校计算机专业编译原理知识点梳理与讲解

高校计算机专业编译原理知识点梳理与讲解编译原理(Compilers)是计算机科学中一门非常重要的学科,它研究的是如何将一种高级程序语言翻译为计算机可以执行的机器语言。

在高校计算机专业中,学习编译原理是必不可少的一部分。

本文将从以下几个方面对高校计算机专业的编译原理知识点进行梳理与讲解。

一、编译原理概述编译原理是一门跨学科的科学,涉及的领域包括语言学、数学、计算机科学等。

它的主要任务是将高级语言翻译为等价的目标代码,使计算机可以理解并执行。

编译原理主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个阶段。

二、词法分析词法分析是编译原理中的第一步,它的任务是将源程序分解成一个个的单词(Token)。

单词是编程语言中的最小语法单位,包括关键字、标识符、常量等等。

词法分析器通常使用有限自动机(DFA)来实现,通过正则表达式匹配的方法来识别不同的单词。

三、语法分析语法分析是编译原理中的重要环节,它的任务是根据程序的语法规则,将词法分析器输出的单词序列转化为语法树(Parse Tree)。

语法树是用于表示程序语法结构的一种数据结构,可以通过递归下降法、LL(1)分析法或者LR分析法来构建。

四、语义分析语义分析是对程序的语义进行分析与处理,它的任务是根据语法树和符号表,对程序的语义进行检查和翻译。

语义分析阶段主要包括类型检查、作用域分析、中间代码生成等工作。

五、中间代码生成中间代码生成阶段是编译器的重要组成部分,它的任务是将源程序翻译成中间代码。

中间代码是一种抽象的、介于源代码和目标代码之间的代码表示形式,它可以更好地进行代码优化和目标代码生成。

六、代码优化代码优化是提高程序运行效率的关键环节,它的任务是在保持程序功能不变的前提下,尽可能地减少程序的执行时间和所需资源。

代码优化可以通过多种方式实现,如常量折叠、循环优化、死代码消除等等。

七、目标代码生成目标代码生成是编译原理中最后一个阶段,它的任务是将中间代码转化为机器码,以供计算机执行。

编译原理基础知识总结

编译原理基础知识总结

编译原理基础知识总结编译原理是计算机科学中重要的一门学科,它研究的是如何将高级语言程序转换为可执行的机器语言程序的技术和方法。

了解编译原理的基础知识对于理解计算机程序的执行过程以及优化程序性能具有重要意义。

本文将对编译原理的基础知识进行总结,包括编译器的工作流程、词法分析、语法分析、语义分析和代码生成等内容。

一、编译器的工作流程编译器是将高级语言程序转换为机器语言程序的工具,它的工作流程一般包括以下几个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。

其中,词法分析、语法分析和语义分析是编译器的前端部分,中间代码生成、代码优化和目标代码生成是编译器的后端部分。

二、词法分析词法分析是编译器的第一步,它将源代码分解成一个个词法单元。

词法单元是程序的最小语法单位,例如标识符、关键字、运算符等。

词法分析器通过扫描源代码字符流,将输入的字符序列转换为词法单元序列。

常用的词法分析方法有有限自动机、正则表达式和词法规则等。

三、语法分析语法分析是编译器的第二步,它将词法单元序列组织成一棵语法树。

语法树表示了程序的语法结构,其中每个节点代表一个语法单元,而节点之间的关系代表了语法单元之间的关系。

语法分析器通过解析语法规则,将词法单元序列转换为语法树。

常用的语法分析方法有递归下降分析法、LL(1)分析法和LR分析法等。

四、语义分析语义分析是编译器的第三步,它对语法树进行静态语义检查和语义动作。

静态语义检查主要是检查程序中是否存在语义错误,例如类型不匹配、未声明的标识符等。

语义动作主要是对语法树进行翻译和注释,生成语义动作代码或者中间代码。

常用的语义分析方法有符号表管理、类型检查和中间代码生成等。

五、代码生成代码生成是编译器的最后一步,它将中间代码转换为目标机器代码。

代码生成器通过对中间代码进行优化,选择合适的指令序列生成目标代码。

常见的代码生成技术有寄存器分配、指令选择和代码块调度等。

六、总结编译原理是计算机科学中重要的一门学科,它涉及到编译器的各个阶段,包括词法分析、语法分析、语义分析和代码生成等。

《编译原理》重点知识总结

《编译原理》重点知识总结

《编译原理》重点知识总结一、编译器的基本概念1.编译器的定义:编译器是一种将高级语言程序转换为低级语言程序的软件工具。

2.编译器的主要任务:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。

二、词法分析1. 词法分析的任务:将源程序的字符序列转换为有意义的词法单元(token)序列。

2.词法单元的分类:关键字、标识符、运算符、界限符等。

3.词法分析器的实现方法:有限状态自动机(DFA)、正则表达式、词法规则等。

三、语法分析1.语法分析的任务:根据语法规则,将词法单元序列转换为抽象语法树(AST)。

2.语法分析器的实现方法:上下文无关文法(CFG)、递归下降分析、LL(1)分析器、LR分析器等。

四、语义分析1.语义分析的任务:对抽象语法树进行静态语义检查,确定语法结构的含义和约束。

2.语义分析的主要内容:类型检查、作用域分析、常量折叠、中间代码生成等。

五、中间代码生成1.中间代码的定义:介于源程序和目标代码之间的一种抽象表示形式,可以是三地址代码、四元式、虚拟机代码等。

2.中间代码生成的方法:递归下降、语法制导翻译、语法制导的翻译方案等。

六、代码优化1.代码优化的目的:提高程序的执行效率和资源利用率,减小目标代码的体积。

2.常见的代码优化技术:常量传播、代码移动、循环优化、函数内联等。

七、目标代码生成1.目标代码的定义:能够被底层硬件直接执行的机器指令。

2.目标代码生成的方法:模板匹配、基本块划分、寄存器分配等。

八、词法分析器和语法分析器的生成工具1. Flex:用于生成词法分析器的工具。

2. Bison:用于生成语法分析器的工具。

3. Lex:Flex的前身,用于生成词法分析器。

4. Yacc:Bison的前身,用于生成语法分析器。

九、常用的编程语言1. 静态类型语言:C、C++、Java、C#等。

2. 动态类型语言:Python、JavaScript、Ruby等。

3. 函数式编程语言:Lisp、Haskell、Erlang等。

编译原理心得

编译原理心得

编译原理心得在学习计算机科学的道路上,编译原理无疑是一座巍峨的山峰,需要我们付出大量的精力和时间去攀登。

当我初次接触这门课程时,就被它的复杂性和深度所震撼,但随着学习的深入,我也逐渐领略到了其中的魅力和价值。

编译原理,简单来说,就是研究如何将高级程序设计语言编写的源程序转化为计算机能够理解和执行的目标程序的过程。

这一过程涉及到众多的知识和技术,包括词法分析、语法分析、语义分析、中间代码生成、代码优化以及目标代码生成等。

词法分析是编译过程的第一步,它的任务是将输入的源程序分割成一个个的单词,比如标识符、关键字、常量、运算符等。

这就好像我们在阅读一篇文章时,首先要把一个个的字词识别出来。

在学习词法分析时,我了解到了有限自动机这一重要的概念和工具。

通过构建有限自动机,我们可以有效地识别各种单词,这让我感受到了数学和计算机科学的完美结合。

语法分析则是在词法分析的基础上,根据编程语言的语法规则来确定输入的单词序列是否构成一个合法的句子。

这就好比我们在学习一门语言时,要掌握句子的结构和语法规则。

在语法分析中,常见的方法有自顶向下分析和自底向上分析,而递归下降分析法和 LL(1)分析法给我留下了深刻的印象。

通过亲手编写语法分析程序,我更加深入地理解了语法规则的重要性以及如何正确地运用它们。

语义分析则是对语法分析所产生的语法树进行语义检查和语义处理,以确保程序在语义上是正确的。

这一阶段需要考虑变量的类型检查、作用域、运算符的合法性等问题。

在学习语义分析的过程中,我明白了计算机在执行程序时是如何理解和处理各种语义信息的,这对于写出正确且高效的程序至关重要。

中间代码生成是将源程序的语法结构转换为一种中间表示形式,常见的中间代码形式有三地址码、逆波兰式等。

这一步为后续的代码优化和目标代码生成提供了便利。

通过学习中间代码生成,我学会了如何在不同的表示形式之间进行转换,以及如何选择合适的中间代码形式来提高编译效率。

代码优化是编译过程中的一个重要环节,它的目的是提高目标代码的质量和执行效率。

编译原理学习笔记(一)

编译原理学习笔记(一)

编译原理学习笔记(⼀)
最近开始在学习编译原理。

原因是这么多年以来,⼀直做企业信息应⽤系统⽅⾯的开发。

对于开发具体的业务功能当然早就驾轻就熟,不过当想进⼀步开发相对基础的功能,⽐如报表,模版或者动态表单什么的,就有点⼒不从⼼。

但是,以现在⾏业技术的发展来看,已经不可能再停留在开发业务代码的程度上了。

尤其是近年来,出现了越来越多的所谓⽆代码开发平台,如果不能跟进学习,⾃⼰恐怕也要被淘汰了。

所以,就只能下定决⼼,由基础开始从头学起,算是补上原来的课吧。

我是在极客时间上,跟着宫⽂学⽼师专栏《编译原理之美》学的。

刚开始学,了解了些基本概念。

编译技术分为前端技术和后端技术。

前端技术是指编译器对程序代码的分析和理解过程。

后端技术则是编译器将程序代码⽣成⽬标机器可以执⾏的⽬标代码的过程。

其中前端技术⼜分为三个阶段。

⼀,词法分析。

⼆,语法分析。

三,语义分析。

⼀,词法分析是指将程序代码进⾏分词的过程。

这个⾥⾯涉及到了正则表达式和有限⾃动机的概念。

⼆,语法分析是将词法分析获得的⼀个个单词识别出程序的语法结构,组合抽象语法树(AST)。

涉及到了递归下降算法,⼆元表达式,等概念。

三,语义分析是根据语义规则进⾏分析判断,将分析判断的结果作为属性标注在抽象语法树上。

基本上学完编译原理的前端技术,应该就可以⾃⼰设计⼀个简单的脚本语⾔或者简单的模版引擎了。

希望能坚持学下去,做出⼀个成果出来吧。

编译原理学习笔记--语法分析(一)

编译原理学习笔记--语法分析(一)

编译原理学习笔记--语法分析(⼀)1 ⽬的 语法分析是根据源语⾔的语法规则从源程序记号序列(词法分析阶段的输出)中识别出各种语法成分,同时进⾏语法检查,为语义分析和代码⽣成做准备。

2 ⽅法 对记号序列⾃左向右扫描,每次读⼀个记号。

⽂法推导是⼀棵分析树,如果匹配成功,终结符是叶⼦结点连起来的输⼊串。

2.1 ⾃顶向下分析:⾯向⽬标分析法就是⽤⽂法硬凑与输⼊符号匹配的句⼦2.1.1 递归下降预测分析(⼀种不确定的,带回溯的预测分析⽅法)⼀种没什么卵⽤的⾼代价穷举试探⽅法,然鹅却和我们的脑回路最接近 下⾯,试图分析输⼊串abbcde是否是以下⽂法的句⼦。

概括⼀下就是从起始符S开始,⾯对⾮终结符要展开的时候,尽可能地凑当前指针所指的输⼊串字符。

这种只顾眼前利益不顾⼦孙后代幸福的⽅法,后⾯⼀定会付出惨痛代价。

显然,很⼤可能后⾯会回溯,代价太⼤。

2.1.2 递归调⽤预测分析(确定的⽆回溯分析) 1 ⽂法要求 当然想确定每次展式,⽂法必须⽆左递归且提取左公因⼦后⽆⼆义性。

这些要求说⽩了就是想让⾮终结符为了最左边(此时的指针位置)与输⼊串匹配成功,选择的推导式是唯⼀的。

严谨⼀点说,就是⽂法中的任意⾮终结符A,定义A的某候选式的开头终结符号集如下:为了不产⽣提取左公因⼦后的⼆义性,要求对于A任意的候选式和,都有:注意:若候选式可以经过有限次推导推出ε,则其FIRST集含ε。

注:对形式语⾔不太熟悉的⼩伙伴,这⾥回顾⼀下消左递归的⽅法(想得美,我才懒得写呢只写核⼼的⼀个变化步骤: 2 状态转换图 1)构造 ⽂法的每个⾮终结符产⽣式对应⼀个⾃动机,由初始状态S出发,寻找状态转移过程,分以下三种情况: 第⼀种容易理解,第⼆种本质上是中间⼀段的序列被A终结符推导匹配,然后回到T。

第三种表⽰如果S⽆法匹配当前a且有空转移,则到T状态进⾏匹配。

2)化简 将输⼊⾃⾝到达的状态可以和初始状态进⾏合并,不同状态在输⼊相同到达状态相同时,也可进⾏合并,还有空转移也需注意。

学习编译原理

学习编译原理

学习编译原理编译原理是计算机科学中的重要学科,它研究的是将高级程序语言转化为可执行的机器语言的过程。

在编译原理中,有许多重要的概念和原理需要学习和理解。

其中一个重要的概念是词法分析。

词法分析的任务是将源代码分成一个个的词素(token)。

词素是程序中具有独立含义的最小单元,如关键字、标识符、运算符等。

词法分析器通常使用正则表达式进行模式匹配来识别不同的词素。

接下来是语法分析。

语法分析的任务是验证词法分析生成的词素序列是否符合给定的语法规则。

语法规则通常使用上下文无关文法(context-free grammar)来描述。

常用的语法分析方法有递归下降法和LR分析法。

语义分析是编译过程中的另一个重要阶段。

它主要负责对语法分析生成的抽象语法树进行语义检查和语义动作。

语义检查包括类型检查、作用域检查等,确保程序在运行过程中不会出现语义错误。

而语义动作则是指在语法分析过程中执行一些动作,如计算表达式的值、生成中间代码等。

代码优化是编译过程中的关键环节。

通过使用各种优化技术和算法,可以对中间代码进行转换和优化,使得生成的目标代码更加高效和紧凑。

常见的代码优化技术包括常量传播、死代码消除、循环展开等。

最后,编译原理中还涉及目标代码生成和目标代码优化。

目标代码生成是将中间代码转换为特定机器上可执行的机器代码的过程。

目标代码优化则是对生成的目标代码进行进一步的优化,以提高程序的执行效率。

通过学习编译原理,可以更好地理解程序设计与执行的过程,并且能够编写高效和可靠的编译器和解释器。

这对于理解计算机科学和算法设计都有很大的帮助。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 所示:
相关文档
最新文档