第1章编译原理概述剖析
编译原理第一章课件计算机编译原理
• 编译原理概述 • 语言基础知识 • 编译技术与方法 • 编译器构造实践 • 编译器的优化与改进 • 计算机编译原理的应用领域
01
编译原理概述
编译器的定义与作用
编译器定义
编译器是一种将高级语言程序翻译成机器语言程序的软件工 具。
编译器作用
将人类可读的源代码转换为计算机可执行的机器代码,实现 程序的运行。
语义分析技术
01
语义规则定义
定义程序语言的语义规则,包括类型检查、控制流分析、 数据流分析等。
02 03
语义分析算法
根据定义的语义规则,采用相应的语义分析算法对语法分 析得到的语法树进行语义分析,如类型检查算法、控制流 分析算法等。
语义错误处理
在语义分析过程中,对于不符合语义规则的输入,需要进 行错误处理,如报告语义错误信息或进行错误恢复。同时 ,还需要考虑如何处理程序中的异常情况,如异常捕获、 异常处理等。
执行效率。
THANKS
感谢观看
03
编译技术与方法
词法分析技术
词汇识别
将输入的字符流按照某种规则划 分成一个个的单词或符号,即词 法单元。
词法单元分类
将识别出的词法单元按照其性质 和作用进行分类,如关键字、标 识符、运算符、分隔符等。
错误处理
在词法分析过程中,对于不符合 词法规则的输入,需要进行错误 处理,如报告错误信息或进行错 误恢复。
死代码删除
识别和删除永远不会被执行的代码段,以减 小程序体积和提高执行效率。
编译器性能评估
编译速度
衡量编译器将源代码转换为目标代码所需的时间。
代码质量
评估编译器生成的目标代码在运行时所占用的内存和执行效率。
编译原理-陈火旺版-第一章
编译器的作用与重要性
01
编译器是将高级语言程序翻译成机器语言程序的软件工具,是 软件开发的基础设施之一。
02
编译器可以提高程序的执行效率,使得程序能够在各种计算机
上运行。
编译器还可以对程序进行优化,提程简介
01
02
03
词法分析
将输入的源程序分解成一 个个的单词符号,即词法 单元。
词法分析器的构造
构造原理
根据词法规则构造出识别相应单 词符号的有限自动机,然后将有 限自动机转换为对应的程序代码
构造方法
手工构造法、自动生成法
注意事项
处理好单词符号的二义性问题; 识别出源程序中的错误并进行适 当的处理。
04
语法分析
语法分析概述
语法分析的任务
根据语言的语法规则,对输 入的符号序列进行合法性检 查,并构造出相应的语法结
中间代码的形式
常见的中间代码形式有三地址码、四元式、树形表示等。
中间代码生成算法
根据源程序的语法结构和语义规则,生成相应的中间代码序列。
符号表管理
符号表的作用
符号表用于记录源程序中各种标识符的属性信息,如类型、作用域 和存储地址等。
符号表的组织方式
常见的符号表组织方式有线性表、散列表和树形结构等。
循环优化
通过循环展开、循环合并、循环交换等技术来改进循环的性能。
目标代码生成方法
机器无关代码生成
机器相关代码生成
生成与特定机器无关的中间代码,然后在 运行时将其转换为特定机器上的目标代码 。
直接生成特定机器上的目标代码,这需要 考虑机器的指令集、寄存器分配、内存访 问等因素。
汇编语言代码生成
高级语言虚拟机代码生成
编译原理课件1剖析
主 要
编译程序的结构与编译过程
内
容
语言开发环境中的伙伴程序
编译程序结构的实例模型
编译程序的构造与实现
1.1 编译器概述 1.1.1 编译程序鸟瞰
为什么要使用编译器?
机器语言 (machine language) C7 06 0000 0002
汇编语言 (assembler language) MOV X , 2
用源语言写的程序称为源程序 目标语言 (target language)
目标程序的描述语言称为目标语言
1.1 编译器概述 目标程序:(target program)
源程序经过编译后生成的程序称之为目标程序 宿主语言(实现语言):
编译程序的实现语言 宿主机(目标机):
编译程序的运行环境
1.1 编译器概述
课程内容
❖第1章 编译引论 ❖第2章 形式语言与自动机理论 ❖第3章 词法分析 ❖第4章 语法分析——自上而下分析 ❖第5章语法分析——自下而上分析 ❖第6章 语义分析与中间代码生成 ❖第7章 运行环境 ❖第8章 代码优化 ❖第9章 代码生成
第1章 编译引论
程序设计语言与编译程序
编译程序的表示与分类
《编译原理》课程简介
–学习意义 –对编程语言的设计和实现有深刻的理解,对和编程语
言有关的理论有所了解,对宏观上把握编程语言来说, 起一个奠基的作用。 –从软件工程看,编译器是一个很好的实例,所介绍的 概念和技术能应用到一般的软件设计之中。 –编译技术的应用和编译技术的发展
高级语言设计、计算机体系结构的优化(并行、内存 分层)、新型计算机体系结构设计、程序翻译、提高 软件开发效率的工具 、高可信软件。
教材
编译原理
编译原理概念总结
第一章 引论• 为什么要用编译器 • 与编译器相关的程序 • 翻译步骤• 编译器中的主要数据结构1、语言处理器 1、简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成一个等价的、用另一种语言(目标语言)编写的程序。
2、编译器的重要任务之一就是报告它在翻译过程中发现的源程序中的错误。
3、使用编译器是为了提高编程的速度和准确度。
4、与编译器相关的程序:解释程序(interpreter )、汇编程序(assembler )、连接程序(linker )、装入程序(loader )、预处理器(preprocessor )、编辑器(editor )、调试程序(debugger )、描述器(profiler )、项目管理程序(project manager )。
5、解释器是另一种常见的语言处理器。
它并不通过翻译的方法生成目标程序。
从用户的角度来看,解释器直接利用用户提供的输入执行源程序中指定的操作。
6、一个源程序可能被分割成多个模块,并存放于独立的文件中。
把源程序聚合在一起的任务有时会由一个被称为预处理器(preprocessor )的程序独立完成。
预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。
7、连接器(linker )能够解决外部内存地址的问题。
8、加载器(loader )把所有的可执行目标文件放到内存中执行。
2、一个编译器的结构OutputSourceProgramFront endBack endObject1、将编译器看成黑盒,则源程序映射为在语义上等价的目标程序,而这个映射由两部分组成:分析部分和综合部分。
2、分析部分把源程序分解成多个组成要素,并在这些要素之上加上语法结构。
3、综合部分根据中间表示和符号表中的信息来构造用户期待的目标程序。
4、编译器的第一个步骤:词法分析(lexical)或扫描(scanning)。
词法分析器读入组成源程序的字符流,并且将它们组成有意义的词素(lexeme)的序列。
编译原理--第一章.讲义
2018/11/14
2
编译原理
第一章 引论
2.编译理论与其他课程关系
操作系统
控制对象
数据结构
编译理论
基础
素材
离散数学
自动机和形式语言
2018/11/14 3
编译原理
第一章 引论
3.编译理论的应用
编译理论 的许多想法和技术可用于一般软件的设计:
文本编辑程序 有穷状态技术 上下文无关文法 语法制导翻译 代码优化技术
2018/11/14
目标程序代码
6
编译原理
第一章 引论
6.翻这种变换程序称为翻译程序
高级语言源程序
编译为
面向机器代码
这种变换程序称为编译程序 编译程序 有一些限制 (针对输入、输出)
2018/11/14 7
编译原理
第一章 引论
1.编译过程的组成 源程序
编译原理
第一章 引论
5.代码优化
任务
对于代码(主要是中间代码)进行加工变换, 以期能够产生更为高效(省时间和空间)的 目标代码 。
所做转换
中间代码
中间代码(优化后)
依据
程序等价变换规则
2018/11/14
主要理论基础
数据流方程
15
编译原理
第一章 引论
5.代码优化
示例
(1) M := I (2) N := J (3) K := 1 (4) if 100<K goto (9) (5) (6) (7) (8) (9)
源程序
词法分析 语法分析
单词符号 语法单位 中间代码
编译过程
中间代码生成 代码优化
中间代码(优化后)
目标代码
编译原理第1章 概述
1.3 编译程序的生成
一、基本方法 1. 对源程序文本进行
认真分析(语法语 义理解) 2. 设计编译算法(前后 端、遍、算法等) 3. 选择语言,编制程序 4. 调试编译程序(测试) 5. 整理资料、形成文本
二.移植:将别的语言的编译移植过来 三. 自展:L0→L1+L0 →L2+L1+L0 → … →L 四. 编译程序的自动生成 1. 词法分析程序生成器----LEX 2. 语法分析程序生成器----YACC 3. 自动产生编译程序的工具 编译程序-编译程序 编译程序产生器 翻译程序脚本系统
随着并行技术和并行语言的发展,处理并行语言的并行 编译技术和将串行程序转换成并行程序的自动并行编译技术 正在深入研究之中。
优
码
程序
析
析
代 码
产
化
生 成
生
信息表管理程序
国防科技大学出版社 [3]杜淑敏著,编译程序设计原理、北京航空
航天大学出版社 [4]Aho ,编译原理技术工具(英文),1986 [5]形式语言与自动机理论(研究生教材)
第一章引论
1.1 什么是编译程序
编译程序是一种翻译程序,它将高级 语言所写的程序翻译成等价的机器语言 或汇编语言的目标程序。
源
编
其中的道理。 3、不得缺席:难学,自学花时间多 4、适当做笔记 5、意见反馈 6、作业:一定要独立完成
四、学时安排及评分标准
讲课42学时 12学时上机(词法、语法) 要交实验报告 考试占70% 平时占30%,{ 作业,考勤,实验} 只讲授部分章节
编译原理第一章PPT课件
掌握编译原理有助于提高程序员对程序性能、代码质量和软件
03
工程实践的理解。
编译原理的应用领域
编译器设计
编译原理的核心应用领域之一 是编译器设计,包括源代码到
目标代码的转换、优化等。
解释器设计
解释器是另一种将源代码转换 为机器码的程序,编译原理同 样适用于解释器的设计。
程序分析
编译原理中的一些技术可以用 于程序分析,例如静态分析、 动态分析和程序切片等。
从高级语言的设计开始,逐步向下设计低级语言和机器语言。
数据结构和算法选择
选择合适的数据结构和算法,提高编译器的性能和可维护性。
代码优化
在生成目标代码之前,对中间代码进行优化,以提高目标代码的性能 和质量。
04 语言与语法
语言的定义与分类
总结词
语言的定义与分类是编译原理的重要基础,它涉及到语言的语法、语义和语用等方面。
语言的语义分析
总结词
语义分析是编译过程中的重要环节,它涉及 到对语言意义的解释和理解。
详细描述
语义分析是对源代码进行静态分析的过程, 目的是理解源代码的意义和功能。在语义分 析阶段,编译器会检查源代码中是否有语法 错误、类型错误、逻辑错误等,并对其进行 相应的处理。同时,语义分析还会进行符号 表管理、类型检查、控制流分析等工作,以
详细描述
中间代码生成是编译过程的第三步,其主要任务是将抽象语法树转化为中间代码。中间代码是一种抽象的、与具 体机器无关的代码形式,通常采用三地址码、四元式等表示方式。中间代码的主要目的是为了方便后续的优化和 目标代码生成。
代码优化
总结词
对中间代码进行优化,提高执行效率。
详细描述
代码优化是编译过程中非常重要的一步,其主要任务是对中间代码进行优化,以提高生成的目标代码 的执行效率。常见的优化技术包括常量折叠、无用代码删除、循环展开等。
编译原理 第1讲(第一章)
•记录源程序中使用的名字 •收集每个名字的各种属性信息 类型、作用域、分配存储 信息 c 常量 值:35
x 变量 类型:实 层次:2
VAR procedure… var procedure var x:real;//层次为2 …. end ….. end
…..
解释程序直接将4的值输出(显示)。有些象单步调试
编
1)遍:指对源程序或其内部表示从头 到尾扫视一遍,并进行有关的加工处理。 2)一遍扫描:以语法分析程序为中心。 编译一次完成,但是运行效果不是很好。 3)多遍扫描:每遍扫描完成不同的任 务。优点: 功能独立;结构清晰;利于 优化;节省空间。 2~8遍。
–编译方式:首先由编译程序将程序翻译成为 机器语言(或者虚拟机的语言,如java),然 后执行。
•比较:
–编译的方式可以使得一次翻译过后,多次运 行。适于花较大的精力进行优化工作。
解释执行和编译执行的区别
如:… … b := 2 ; a := b+2 ; write a ; ……
编译程序
生成代码
Int 2 St b Ld b add 2 St a
赋值语句的语法树
赋值语句 标识符 := 表达式 表达式 + 表达式
标识符
表达式
*
表达式
标识符
整数
赋值语句的语法树另一种表达形式
id1:=id2+id3*N
:= id1 Position id2 initial
+
*
id3 rate N 60
(3)语义分析
•变量声明 •类型匹配 •类型转换 例: Program p(); Var rate:real; procedure initial; … position := initial + rate * 60 /* error */ /* error */ /* warning */; …
(编译原理)讲义
第一章概述计算机由硬件和软件组成,软件又包括程序设计语言、系统软件和应用软件,而编译系统属系统软件。
最早人们只能使用计算机可直接接受的机器语言,到1956年,在IBM704计算机上构造了第一个FORTRAN编译程序,使人们从繁重的机器语言程序设计中解放出来。
计算机是一种逻辑电子装置,它只能接受二进制数,要使得计算机接受高级语言程序,就要借助于编译程序将高级语言程序翻译成机器可接受的机器语言。
§1编译程序和解释程序:要在计算机上实现除机器语言之外的任一程序设计语言,就首先应使此语言为计算机所“理解”。
解决这一问题的方法有两种:一种是对程序进行翻译;另一种是对程序进行解释。
翻译程序:①汇编程序②编译程序翻译程序:是把一种语言编写的程序翻译成等价的另一种语言的程序;前一种语言称为源语言,后一种语言称为目标语言;根据源语言和目标语言的不同,有各种不同的翻译程序:汇编程序:若源语言是汇编语言,目标语言是机器语言,这种翻译程序称为汇编程序。
编译程序:若源语言是高级语言,而目标语言是某计算机的汇编语言或机器语言,这种翻译程序称为编译程序。
解释程序:它以用该语言编写的源程序作为输入,但不产生目标程序,而是按照源语言的定义边解释边执行源程序本身。
通常的编译程序是先将源程序比较简单地翻译成某种中间形式的程序,然后再对这种中间形式进行解释;这种中间形式的语言有多种:波兰表示、三元组、四元组、树、伪代码等。
编译程序和解释程序相比,解释程序的执行效率比较低,但占用时间较少。
§2编译程序的组成部分:编译程序将首先根据源语言的定义来对源程序进行分析,之后进行综合,并从而得到与源程序等价的目标程序;分析:对源程序进行结构分析和语义分析;综合:创建出与源程序等价的目标程序;结构分析:①词法分析②语法分析综合:①中间代码生成②代码生成每一个编译程序一般都要做以下几个方面的工作:①词法分析②语法分析③语义分析④中间代码生成⑤代码生成⑥代码优化目标程序图1。
编译原理课件-概述
(2) (* ,
id3 t1
(3) (+ ,
id2 t2
(4) (:= ,
t3 -
t1 ) t2 ) t3 ) id1 )
翻譯為中間代碼
j = 2 * i + 1; if (j >= n)
j = 2 * i + 3; return a[j];
Three-address code
t1 = 2 * i t2 = t1 + 1 j = t2 t3 = j < n if t3 goto L0 t4 = 2 * i t5 = t4 + 3 j = t5 L0: t6 = a[j] return t6
語義分析(處理)
:=
Id1
+
position Id2
initial
Id3
rate
* inttoreal 60
語義分析(語言的規定和實現)
int arr[2], c; c = arr * 10;
語義分析
語義分析(semantic analysis)
The parsed program is further analyzed
編譯邏輯過程
编译原理第1章
编译原理第1章第一章编译概述2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗?答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
各部分的主要功能如下:词法分析程序又称扫描器。
进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数;语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类;语义分析的功能是确定源程序的语义是否正确;中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码;代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率;目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码;符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息;错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。
编译程序的每部分都是必不可少的。
3.解释方式和编译方式的区别是什么?答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。
解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。
4.论述多遍扫描编译程序的优缺点?答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。
缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。
编译原理(第一章)
语法分析器通常采用自顶向下的分析 方法,从源代码的起始位置开始,逐 步向下解析,直到找到完整的语法结 构或遇到语法错误。
语法分析是编译器的基础,它决定了 源代码的结构和含义,并为编译器提 供了理解和处理源代码的框架。
语法分析的任务
确定词法单元
语法分析器需要将源代码分解 成一个个的词法单元或符号, 如关键字、标识符、运算符等
对优化后的代码进行评估,包括性能测试、空间占用测试 等,以确定优化的效果是否达到预期目标。
THANKS FOR WATCHING
感谢您的观看
优化的分类
根据优化涉及的方面不同,优 化可以分为局部优化和全局优 化。
局部优化是指在单个函数或代 码块范围内进行的优化,通常 关注单个语句或表达式的优化。
全局优化是指在程序的全局范 围内进行的优化,通常关注函 数或模块之间的优化,以提高 整个程序的性能。
优化技术
在此添加您的文本17字
常见的优化技术包括常量折叠、死代码消除、循环展开、 循环优化、函数内联等。
在此添加您的文本16字
常量折叠是指在编译过程中将常量表达式的结果进行计算 并替换掉原来的表达式,以减少程序运行时的计算量。
在此添加您的文本16字
死代码消除是指删除程序中永远不会被执行到的代码,以 减少程序的空间占用和提高程序的运行效率。
在此添加您的文本16字
循环展开是指将循环体中的代码复制到循环外部,以减少 循环次数和减少循环开销。
。
识别语法结构
语法分析器需要识别出源代码 中的各种语法结构,如表达式 、语句、程序等。
建立语法树
语法分析器需要将识别的语法 结构按照一定的规则组织起来 ,形成一棵语法树。
语义检查
语法分析器在识别语法结构的 同时,还需要进行一些语义检 查,如类型检查、变量声明等
编译原理第1章
功能:依据源语言的语法规则把源程序的单词序列组成语法短语
(表示成分析树/语法树)。
17
What is a Grammar?
语法分析所依据的是语言的语法规则,文法是规则的集合,它们 支配了tokens 中的相互依赖和结构。
语言的语法规则通常是由递归规则来定义,如上述例子中表达式 和语句可由下述递归规则来定义:
t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1= t3
25
Phase 5. Code Optimizer (代码优化)
代码优化的任务是:对产生的中间代码进行等 价变换,使生成的目标代码更为高效(时间和 空间)。优化的目的主要是提高运行效率,节 省存储空间。优化主要有两类,一是与机器有 关的优化,主要设计如何分配寄存器,如何选 择指令,这类优化是在生成目标代码时进行的; 另一类优化与机器无关,主要是对中间代码的 优化。主要有局部优化、循环优化等。
语义审查---上下文相关性、类型匹配、类型转换
例:
void p(); float: rate; void initial(); … position = initial + rate * 60 /* error */ /* error */ /* warning */; …
21
= position initial rate + * 60 position
19
(initial) <id,3> (rate) 树的结点是利用该语言的文法来建造的
语法树是分析树的一种压缩表示
=
position
+
* rate 60
编译原理第一章
第一章概述1.1 编译程序的概念计算机硬件的最核心部件是CPU(Computer Processor Unit)即中央处理器,CPU能够执行的指令是二进制形式的指令即机器指令,机器指令的集合称机器语言。
用机器指令书写的程序可以说无法阅读,程序设计的效率极低甚至可以说无法进行程序设计。
机器指令的助记符形式称汇编指令,比如MOV是数据传送指令,助记符形式的汇编指令的集合称汇编语言。
汇编语言的出现使得程序设计的效率有所提高,即使现在,汇编语言仍是编制设备驱动程序的重要工具。
但是,汇编语言书写的程序不能直接在CPU中运行,需要汇编程序(Assembler)把汇编语言书写的源程序(Source Program)汇编成机器语言程序才能在CPU中运行。
汇编的过程可以用下图表示:(源程序)(目标程序)汇编语言与机器语言类似,仍然依赖于计算机,使用起来繁琐、易出错、可读必差、缺乏通用性,因此面向过程的高级语言、面向对象的高级语言相继出现了。
例如面向过程的高级语言:Basic、Pascal、Fortran、C语言等等;面向对象的高级语言Visual Basic、Visual C++、Delphi、PowerBuilder等等。
把高级语言翻译(Translator)成汇编语言程序或机器语言程序的程序称为编译程序(Compiler)。
汇编语言与机器语言亦称低级语言。
对高级语言书写的源程序进行编译的过程可以用下图表示:编译程序翻译目标程序(Object Program)一般指低级语言程序。
综上所述,可以看出编译程序在计算机系统中的重要地位。
不同的高级程序设计语言需要不同的编译程序,同一种高级程序设计语言在不同的计算机上需要不同的编译程序。
有了编译程序,程序设计人员就不需要考虑与计算机硬件有关的绝大部分甚至全部细节,使程序设计独立与计算机,即同一个高级语言源程序可以在不同的计算机上运行。
在计算机上运行一个高级语言源程序一般分为两步:第一步是通过编译程序把源程序翻译成目标程序;第二步是运行或称执行目标程序。
编译原理课件-编译概述
14/60
Wensheng Li BUPT @ 2008
1. 詞法分析
掃描,線性分析 詞法分析器:
– 依次讀入根源程式中的每個字元,對構成根源程式的字 串進行分解,識別出每個具有獨立意義的字串作為記號 (token)並組織成記號流。
– 把需要存放的單詞放到符號表中,如變數名,標號,常 量等。
簡介
什麼是編譯?
–把根源程式轉換成等價的目標程式的過程即是編譯。
編譯程序的設計涉及到的知識:
–程式設計語言 –形式語言與自動機理論 –電腦體系結構 –數據結構 –演算法分析與設計 –操作系統 –軟體工程等
3/60
Wensheng Li BUPT @ 2008
1.1 翻譯和解釋
一、程式設計語言 二、翻譯程式
中間代碼生成
temp1:=inttoreal(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3
代碼優化
temp1:=id2*4.0 id1:= id1+trmp1
Wensheng Li BUPT @ 2008
目標代碼生成
MOVF id2, R2 MULF #4.0, R2 MOVF id1, R1 ADDF R2, R1 MOVF R1, id1
結果。 –有些“三地址”指令少於三個運算元
25/60
Wensheng Li BUPT @ 2008
total:=total+rate*4 的三地址代碼
temp1:=inttoreal(4) temp2:=id2*temp1 temp3:=id1+temp2 id1:=temp3
26/60
编译原理chapter1 编译概述
精品文档
7
赋值语句经语法分析生成分析树
赋值语句
变量 a
:= 表达式
表达式
+
项
项
项
* 因子
因子 因子
60
b
c
精品文档
8
赋值语句经语义分析生成语法树
:=
a
+
b
*
c
inttoreal
精品文档
60 9
生成中间代码
temp1:=inttoreal(60); temp2:=c * temp1; temp3:=b +temp2; a :=temp3;
仅依赖源程序 仅依赖目标计算机
遍(PASS): 对输入文件(源程序或其
等价的中间形式)从头到尾扫视,完成
预定输的入处文理件。
遍
输出文件
精品文档
14
把前端组织成一遍扫描
错误的诊查处理
语法分析
源 程 序
词法 分析
语义分析和 中间代码生 成
中 间 代 码
符号表管理
精品文档
15
设计编译程序应首先研究的问题
源
目
程 序
编译程序
标 程
抽 象目标
序
首先研究源程序的语法和语义及运行模
型,源是设计编译程序的出发点。
研究目标计算机,设计目标代码的指令
系统,它是由目标计算机扩充而成,扩
充后的计算机称作抽象计算机。目前的
通用计算机往往和源语言执行模型不一
致。。
精品文档
16
教和学的几个问题
重要性:处理字符串的一般方法;构造 大程序的方法;实用;研究课题:新的 语言及实现技术;并行编译技术。
第1课 第1章_编译原理概述
共20页 5
语义分析 semantic analysis
进行语义审查以判断是否有语义错误,例如: 上下文相关性,类型匹配,类型转换 The parsed program is further analyzed to determine whether it conforms to the source language’s contextual constraints: scope rules, type rules
源程序
遍
第一遍输出文件 第二遍输入文件
遍
第(N-1)遍输出文件 第N遍输入文件
共20页
遍
目标代码
16
Compiler与interpreter
解释程序不生成可执行文件,不能独立执行
编译程序生成可执行文件,可以独立执行
Basic,JAVA
共20页
17
编译技术的发展史
第一个编译程序据说出现在20世纪50年代早期,其功能 多数是将算术公式翻译成机器代码,非常简单。 50年代中期,随着FORTRAN等高级语言的出现,开发 了相应的编译系统。 50年代末,开始研究能够自动生成编译程序的程序。 60年代起,开始使用自展技术,就是使用语言编写其自 身的编译程序 并行技术的发展带动了并行编译技术的研究;嵌入式系 统的发展推动了交叉编译技术的发展;此外还有VHDL 等专用语言的编译技术不断深化。
共20页 13
编译阶段的组合
分析,综合(synthesis)
源程序的分析
目标程序的综合
编译的前端(front end) 编译的后端(back end)
共20页
14
源代码
第1章编译原理概述剖析
第5页
1.1 程序设计语言与翻译程序
为什么要使用编译程序?
机器语言 (machine language)
C7 06 0000 0002
第26页
2018年12月23日星期
1.2编译程序 的结构
• 由左图可以看出, 词法分析是实现编 译器的基础,语法 分析是实现编译器 的关键。 • 因此按照这个顺序 来实现编译器 • 每一步的实现都依 赖于一定的理论基 础。 • 数学,尤其是离散 数学是程序设计方 法学的理论基础
2018年12月23日星期 第27页
2018年12月23日星期
第21页
赋值语句 标识符 id1(area)
id1:=int1 + id2 * id3 + id2 * id3
表达式
:=
表达式
+
表达式 * 表达式 标识符 id3(width)
表达式
表达式 常数 int1(5)
+
表达式 标识符
表达式 标识符
*
表达式 标识符
id2(length) id3(length)
第25页
第五阶段:目标代码的生成
任务:把中间代码(或经优化的中间代码)变换成特定机 器上的低级语言代码。 o 依赖于机器的硬件系统结构和机器指令的含义 o 目标代码可以是:绝对指令代码、可重定位的指令 代码、汇编指令代码 序号 1 2 3 四元式 (*, id2, id3, T1) (+, int1, T1, T2) (+, T2, T1, id1) (1)mov AX, id2 (2)mul AX, id3 (3)mov BX, AX (4)add AX, int1 (5)add AX, BX (6)mov id1, AX
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018年12月23日星期
第14页
什么是编译原理
编译原理是讨论编译程序设计的基本理论、 基本概念、基本方法
2018年12月23日星期
第15页
1.2 编译过程概述
1、逻辑上分五个阶段:词法分析、语法分析、语义
分析与中间代码生成、代码优化、目标代码生成 每个阶段把源程序从一种表示变换成另一种表示
编译原理
教材及主要参考资料
教材:编译原理及实践教程,黄贤英,清华大学出
版社
主要参考资料: 编译原理,陈火旺,国防工业出版社 编译原理(原书第2版)(龙书) ,ALFRED V.AHO
etc著,赵建华 郑滔等译 ,机械工业出版社 ,2008.12 社
程序设计语言编译方法,肖军模,大连理工大学出版 编译原理,张素琴,吕映芝,清华大学出版社
更多教材及参考资料参见编译原理精品课程网站。
第2页
C语言程序
void main( ) { int x,y,z; x=3; y=2; z=x+y; }
在内存中:
序言
内存地址 内存内容
单元名字
……
……
……
x:局部变量
y:局部变量 z:局部变量
200H
202H 204H ……
3
2 5 ……
数 据 区
源程序
编译器
目标程序
词 法 分 析
2018年12月23日星期
语 法 分 析
语义分 析与中 间代码 生成
代 码 优 化
目标 代码 生成
第16页
按照词法分析、语法分析、语义分析等这种方式来 划分阶段的原因是:每个阶段的复杂程度不同,所 依据的理论基础不同,实现时采用的方法也不同。 主要是方便理解和实现。 划分阶段的依据是什么?每个阶段所实现的功能相 对独立。
2018年12月23日星期 第9页
翻译程序所处的层次
语言处 理程序
Fortran语言
Hale Waihona Puke Fortran编译程序高 级 语 言
C 语 言
操作系统
C 编译 程序
计算机硬件 汇编语言
Basic解释程序
Basic语言
. . . . . .
. . . . . .
2018年12月23日星期
第10页
编译程序
源程序
汇编程序
汇编程序
机器语言层
机器语言1 计算机1
机器语言2 计算机2
第8页
2018年12月23日星期
什么叫翻译程序
翻译程序:能够将某种语言写的程序转换成 另一种语言的程序,而且后者与前者在逻辑 上是等价的。 编译程序:将高级程序设计语言程序翻译成 逻辑上等价的低级语言(汇编语言,机器语言) 程序的翻译程序。 解释程序:将高级程序设计语言写的源程序 作为输入,边解释边执行源程序本身,而不 产生目标程序的翻译程序。
2018年12月23日星期
第12页
编译程序的分类
诊断编译程序 优化编译程序 可变目标编译程序 交叉编译程序
2018年12月23日星期
第13页
编译器的伙伴
编辑器(editor) 预处理器(Preprocessor)
将源程序汇集到一起,宏展开等
汇编程序(assembler) 连接程序(linker) 连接系统函数与系统资源 装入程序(loader) 重定位(relocation) Debugger,Profiler,Project Manager
汇 编 语 言 程 序
mov ax,3 mov x,ax mov bx,2 mov y,bx add ax,bx mov z,ax ......
300H
302H 304H 306H 308H ......
3A03
3AE1 3A02 3AE2 DA6C 3A71
代 码 区
第一章
编译原理概述
本章要求
2018年12月23日星期
第17页
用一个例子说明各阶段的功能
/*一个PASCAL语言的源程序*/ program test; /*this is an example,computing an area*/ var area, length, width: integer; begin length:=5;width:=5; area := 5+length *width+length *width end.
主要内容:各种翻译程序的概念,编译 过程和阶段划分,编译程序的组成和结 构,编译程序的构造方法 重点掌握:编译程序工作的基本过程及 其各阶段的基本任务,编译程序总框。
第5页
1.1 程序设计语言与翻译程序
为什么要使用编译程序?
机器语言 (machine language)
C7 06 0000 0002
汇编语言 (assembler language)
MOV X , 2
高级语言 (high-level language)
X=2
第6页
为什么要使用编译程序?
机器语言 (machine language)
C7 06 0000 0002
汇编语言 (assembler language)
MOV X , 2
2018年12月23日星期
第18页
第一阶段:词法分析
任务: 从左到右扫描源程序,识别出每个单词 o 附加任务:a、滤掉空格 b、去掉注释 o 单词符号是语言的基本组成成分 o 词法分析的工作主要依据语言中单词的构成规则 o 单词的种类: (1) 标识符 (2) 关键字(char、int、if、else、while、for等) (3) 运算符(即运算符号 +、-、*、/、&等) (4) 界符(常见的有 ; , : ( )等) (5) 常数
编译程序 目标程序 结果
输入数据
计算机运行
解释程序
源程序 解释程序 结果
输入数据
2018年12月23日星期 第11页
对编译程序的一些说明
编译程序实质上是一个翻译程序,要注意等价变换 本课程的任务就是讲解在这个转换过程中所涉及到 的一些理论和方法,最后,使用这些理论和方法, 自己编写一个小的编译器 转换是一个总体的功能,要抓住总体结构,逐层细 分,写编译器时要体现软件工程中软件设计的原则, 自顶向下,逐层分解。 编译器要完成的转换任务相当复杂,实现编译器时 必须分步骤分阶段实现。分阶段实现的好处是能够 简化程序的设计,当然也可以不分阶段实现。
高级语言 (high-level language)
X=2
2018年12月23日星期
第7页
计算机中的语言层次和翻译程序
转换 程序 编译程序1
高级语言层
高级语言1
高级语言2 交叉编 译程序
高级语言3 编译程序3
高级语言4 编译程序4
解释程序1
编译程序2 汇编语言1 反汇编 程序
汇编语言层
汇编语言2 交叉汇 编程序