编译原理与技术讲义.ppt
合集下载
编译原理与技术课程课件 (11)
push(t,tblptr); push(0,offset) } /* 建立主程序(最外围)的符号表
偏移从0开始 */ DD1 ; D2
2019/5/20
《编译原理与技术》讲义
23
D proc id ; N D1 ; S { t := top( tblptr ); addwidth( t, top( offset ) );
25
e.g.10 过程嵌套声明
i : int; j : int ;
PROC P1 ; k : int; f : real ;
PROC P2; l : int ;
a1 ; a2; PROC P3; temp : int ; max : int ;
三元式
⑴⑬
⑭
⑬(*, b,c )
⑵⑭
⑬
⑭(/, d, f )
⑶⑮
⑮
⑮ ( + , ⑬, ⑭)
⑷⑯
⑯
⑯ ( := , a , ⑮)
2019/5/20
《编译原理与技术》讲义
13
中间代码的种类
四元式
按编号次 序计算
计算结 果存于
方便移动,计算 大量引入临 次序容易调整 时变量
result
三元式
按编号次 序计算
2019/5/20
《编译原理与技术》讲义
7
中间代码的种类
e.g.4 构造表达式a+b*-4的语法树(DAG)
+
ID a
*
ID b
@
NUM 4
2019/5/20
《编译原理与技术》讲义
8
中间代码的种类
三地址代码
一般形式:x := y op z 或 x := op y
偏移从0开始 */ DD1 ; D2
2019/5/20
《编译原理与技术》讲义
23
D proc id ; N D1 ; S { t := top( tblptr ); addwidth( t, top( offset ) );
25
e.g.10 过程嵌套声明
i : int; j : int ;
PROC P1 ; k : int; f : real ;
PROC P2; l : int ;
a1 ; a2; PROC P3; temp : int ; max : int ;
三元式
⑴⑬
⑭
⑬(*, b,c )
⑵⑭
⑬
⑭(/, d, f )
⑶⑮
⑮
⑮ ( + , ⑬, ⑭)
⑷⑯
⑯
⑯ ( := , a , ⑮)
2019/5/20
《编译原理与技术》讲义
13
中间代码的种类
四元式
按编号次 序计算
计算结 果存于
方便移动,计算 大量引入临 次序容易调整 时变量
result
三元式
按编号次 序计算
2019/5/20
《编译原理与技术》讲义
7
中间代码的种类
e.g.4 构造表达式a+b*-4的语法树(DAG)
+
ID a
*
ID b
@
NUM 4
2019/5/20
《编译原理与技术》讲义
8
中间代码的种类
三地址代码
一般形式:x := y op z 或 x := op y
编译原理与技术
编译原理与技术
2021/7/21
《编译原理与技术》讲义
1
第一章 引论
什么是编译程序? 翻译程序、解释程序和汇编程序 编译程序的组成结构 编译程序的生成 相关话题
2021/7/21
《编译原理与技术》讲义
2
语言翻译过程
算法描述,求某整数n的阶乘fact(n), n≥0 1 // n == 0
2021/7/21
《编译原理与技术》讲义
35
2021/7/21
《编译原理与技术》讲义
11
编译程序的组成结构
词法分析阶段 语法分析阶段 语义分析、中间代码生成 优化阶段 目标代码生成
2021/7/21
《编译原理与技术》讲义
12
编译程序的组成结构
后端
back end 与目标机相关
program
scanner parser semantics
2021/7/21
《编译原理与技术》讲义
18
编译程序的组成结构
代码优化 得到“优化”后的中间代码;也可以在最后 的代码生成阶段实施“优化”
t1 := rate * 60.0
// 直接用浮点数60.0
position := initial + t1 // 去除多余的
// 临时变量
较优化前,减少2条中间代码
编译程序的移植/交叉编译 Step1:
L
B
L
B
L
L
A
A
用语言L编写 的语言L到语 言B的编译程
序
2021/7/21
A 借助已有的A机器上 语言L的编译程序
《编译原理与技术》讲义
得到机器A上 (实现语言)语 言L到语言B的
2021/7/21
《编译原理与技术》讲义
1
第一章 引论
什么是编译程序? 翻译程序、解释程序和汇编程序 编译程序的组成结构 编译程序的生成 相关话题
2021/7/21
《编译原理与技术》讲义
2
语言翻译过程
算法描述,求某整数n的阶乘fact(n), n≥0 1 // n == 0
2021/7/21
《编译原理与技术》讲义
35
2021/7/21
《编译原理与技术》讲义
11
编译程序的组成结构
词法分析阶段 语法分析阶段 语义分析、中间代码生成 优化阶段 目标代码生成
2021/7/21
《编译原理与技术》讲义
12
编译程序的组成结构
后端
back end 与目标机相关
program
scanner parser semantics
2021/7/21
《编译原理与技术》讲义
18
编译程序的组成结构
代码优化 得到“优化”后的中间代码;也可以在最后 的代码生成阶段实施“优化”
t1 := rate * 60.0
// 直接用浮点数60.0
position := initial + t1 // 去除多余的
// 临时变量
较优化前,减少2条中间代码
编译程序的移植/交叉编译 Step1:
L
B
L
B
L
L
A
A
用语言L编写 的语言L到语 言B的编译程
序
2021/7/21
A 借助已有的A机器上 语言L的编译程序
《编译原理与技术》讲义
得到机器A上 (实现语言)语 言L到语言B的
编译原理精选版演示课件.ppt
预测分析表
3
表驱动的预测分析程序模型
khk
4
实现步骤:
(1) 判断文法是否为LL(1)文法。 如果文法中含有左递归,必须先消除 左递归
(2)构造预测分析表 : Select(A ) (3)列出预测分析过程
khk
5
第6章:自底向上分析方法
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符逐个 移入一个后进先出栈中,边移入边分析,一旦栈顶 符号串形成某个句型的可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,称为 归约。重复这一过程,直到归约到栈中只剩下文法 的开始符号时,则分析成功。
关键问题
khk
6
移进—规约分析(Shift-reduce parsing)
+
A a
可得 b <. a
由A→( B 且B+ ( B… 可得 (<. (
+
B aa…
可得 (<. a
+
B Aa )
可得 (<. A
khk
18
A(B(Aa) …)
(3) 求> .关系:
A(B…B
+
Aa
由S→bAb,且A…) 可得 ) > . b
A+…B 可得 B > . b
khk
88
例1:文法
SaAcBe A b A Ab B d
输入串abbcde#分析
khk
9
归约分析过程(移进归约):
步骤 1 2 3 4 5 6 7 8 9 10 1kh1k
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
编译原理与技术讲义-第3章
2
在自顶向下的语法分析中,通常使用预测分析法 或移进-规约分析法进行语法分析。
3
预测分析法基于预测分析表进行语法分析,而移 进-规约分析法则使用一个栈和一个规约机进行语 法分析。
自底向上的语法分析
自底向上的语法分析是一种与自顶向下 的语法分析相反的方法,其基本思想是 从源程序的叶子节点开始,逐步向上构 建语法树。
在自底向上的语法分析中,通常使用LR(0)、 SLR(1)、LALR(1)等算法进行语法分析。
自底向上的语法分析方法在处理左 递归和不确定的文法时具有优势, 但在处理右递归文法时可能会出现 问题。
03
中间代码生成
中间代码生成概述
中间代码定义
01
中间代码是源代码和目标代码之间的代码,通常是一种抽象的、
语法分析的主要目标是理解源程序的语法结构,并构建一棵语法树,以表 示程序中的各个语句和表达式的层次结构。
语法分析是编译过程中最复杂的部分之一,需要仔细设计和实现,以确保 能够正确地解析源程序。
自顶向下的语法分析
1
自顶向下的语法分析是一种常见的语法分析方法, 其基本思想是从源程序的根节点开始,逐步向下 分析各个子节点。
利用数据流方程来分析程序中 的数据依赖关系,从而进行优 化。例如,通过数据流分析确 定无用代码并进行删除。
05
目标代码生成
目标代码生成概述
01
目标代码生成是编译器的重要 阶段,它将中间代码转换为特 定机器上的目标代码。
02
目标代码生成需要考虑机器的 指令集、寻址方式、寄存器分 配等因素,以确保生成的代码 能够正确、高效地运行。
Java等。
02
实现词法分析器需要编写相应的词法分析器代码,并
编译原理(1)50页PPT
编译程序
将一种语言书写的程序翻译成另一种语 言的等价的程序。 编译程序的输入对象称为源程序。 编译程序的输出对象称为目标程序。
高级语言程序的处理过程
常用的翻译工具有3种
根据被翻译语言与执行方式的不同 1.汇编程序
用于特定计算机上的汇编语言的翻译程序。
2.编译程序 3.解释程序
对源程序进行翻译的程序
sum = first+count*10
id1∶=id2+id3*10 四元式(运算符,运算对象1,运算对象2,结果)
5.中间代码优化
任务:通过调整和改变中间代码中某些 操作的次序,最终产生更加高效率的目 标代码 优化所依循的原则是程序的等价变换规 则 其方法有:公共子表达式的提取、循环 优化、删除无用代码等。
任务:扫描源程序,根据语言的词 法规则,分解和识别出每个单词, 并把单词翻译成相应的机内表示。 单词是语言中最小的语义单位 在词法分析阶段工作所依循的是语 言的词法规则。描述词法规则的有 效工具是正规式和有限自动机。
Pascal源程序片断
position := initial + rate * 60
二.编译程序概述
源程序 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成
目标程序
英译与编译的比较
1.识别出句子中的一个个单 1.词法分析 字
2.分析句子的语法结构
2.语法分析
3.初步翻译句子的含意
3.语义分析中间代码 生成
4.译文修饰
4.优化
5.写出最后译文
5.目标代码生成
1.词法分析
表格与表格管理
编译过程中源程序的各种信息被保留在 种种不同的表格里,编译各阶段的工作 都涉及到构造、查找或更新有关的表格, 因此需要有表格管理的工作
《编译原理》课件
了解中间代码生成的概念和它在编译过程中的角色。 学习四元式和三地址码的表示和生成方式,以及中间代码优化的技巧。
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
编译原理与技术.ppt
动作
移进a 移进b 归约:Ab 移进b 移进c
2019/10/28
《编译原理与技术》讲义
12
移进-归约分析
e.g.17 用栈来实现串abbcde$的分析(2)
分析栈 $aAbc $aA $aAd $aAB $aABe $S
2019/10/28
输入串
动作
de$ de$ e$ e$ $
移进c 归约: AAbc 移进d 归约:Bd 移进e
《编译原理与技术》讲义
28
e.g.21 表达式文法G2的LR分析表(续)
状
action
态 id + * ( ) $
7 s5
s4
8
s6
s11
9
r1 s7
r1 r1
10
r3 r3
r3 r3
11
r5 r5
r5 r5
goto ETF
10
2019/10/28
《编译原理与技术》讲义
29
e.g.21 id*(id+id)$的移进-归约分析过程
输入串 )$ )$ )$ $ $ $ $ $
输出 r6:Fid r4:TF r1:EE+T s11:移进) r5:F(E) r3:TT*F r2:ET acc
2019/10/28
《编译原理与技术》讲义
32
识别活前缀的DFA
活前缀(viable prefix)
$
r: SaABe
分析成功!
《编译原理与技术》讲义
13
移进-归约分析
四种分析动作(action)
∙ 移进(shift)-将当前输入符号移入栈顶top
(why?)
∙ 归约(reduce)-当“句柄”出现在栈顶(从栈
《编译原理课件》PPT课件
它是源程序的一种内部表示形式。 设计中间代码的原则:一是容易生成,二是
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理与技术》讲义
20
编译程序的组成结构
符号表管理
名称 类型
…
position float
initial float
rate float
2020/10/20
《编译原理与技术》讲义
11
编译程序的组成结构
词法分析阶段 语法分析阶段 语义分析、中间代码生成 优化阶段 目标代码生成
2020/10/20
《编译原理与技术》讲义
12
编译程序的组成结构
后端
back end 与目标机相关
program
scanner parser semantics
2020/10/20
《编译原理与技术》讲义
19
编译程序的组成结构
代码生成 与目标机器有密切联系,如指令选择,寄存 器的使用等。
movf rate, R1 mulf #60.0, R1 movf initial, R2 addf R2, R1 movf R1, position
2020/10/20
目标程序 T (机器语言)
初始数据
2020/10/20
目标程序 T 运行系统 计算机
计算结果
《编译原理与技术》讲义
8
什么是编译程序?
源语言(程序)到目标语言(程序)的映射 转换或者翻译过程
系列转换(翻译)过程
源语言S
T1
…
Tn
中间语言
目标语言T
2020/10/20
《编译原理与技术》讲义
9
解释程序与汇编程序
fact(n) = n * fact( n-1 ) // n! == n * (n-1)!
伪语言描述 fact(n) = if n ≤ 0 then 1 else n*fact(n-1)
2020/10/20
《编译原理与技术》讲义
3
语言翻译过程
高级程序设计语言描述,(如C语言) int fact( int n ) { if (n<= 0) return 1; else return ( n*fact(n-1)); }
均属于翻译程序
源程序 S 初始数据
Interpreter/解释程序
计算结果
汇编程序 S’ 汇编语言
assembler/汇编程序
目标程序 T
2020/10/20
《编译原理与技术》讲义
10
C函数fact的汇编语言形式
.file "foo.c" .text
.globl fact .type fact,@function
2020/10/20
《编译原理与技术》讲义
18
编译程序的组成结构
代码优化 得到“优化”后的中间代码;也可以在最后 的代码生成阶段实施“优化”
t1 := rate * 60.0
// 直接用浮点数60.0
position := initial + t1 // 去除多余的
// 临时变量
较优化前,减少2条中间代码
}
2020/10/20
《编译原理与技术》讲义
14
编译程序的组成结构
词法分析阶段-scanner 字符流 -> 记号流
position = initial + rate * 60
scanner
字符流
id1 = id2 + id3 * 60 记号流
标识符 赋值运算符 标识符 加运算符 标识符 乘运算符 整型常量
fact: pushl %ebp movl %esp, %ebp subl $4, %esp cmpl $0, 8(%ebp) jg .L2 movl $1, -4(%ebp) jmp .L1
.L2: subl $12, %esp movl 8(%ebp), %eax decl %eax
pushl %eax call fact addl $16, %esp imull 8(%ebp), %eax movl %eax, -4(%ebp) .L1: movl -4(%ebp), %eax leave ret .Lfe1: .size fact,.Lfe1-fact .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
编译原理与技术
2020/10/20
《编译原理与技术》讲义
1
第一章 引论
什么是编译程序? 翻译程序、解释程序和汇编程序 编译程序的组成结构 编译程序的生成 相关话题
2020/10/20
《编译原理与技术》讲义
2
语言翻译过程
算法描述,求某整数n的阶乘fact(n), n≥0 1 // n == 0
输入数据
a.out/可执行程序 loader/装入程序
计算机
计算结果
2020/10/20
《编译原理与技术》讲义
6
语言翻译过程
为何不设计直接运行高级语言的机器? ✓机器本身的指令系统(二进制) ✓语言本身扩展
2020/10/20
《编译原理与技术》讲义
7
什么是编译程序?
源程序 S (高级语言)
编译程序 C
optimizer code generator
前端 front end 与源语言有关
middle end
2020/10/20
《编译原理与技术》讲义
13
编译程序的组成结构
例子,hoo.c: main() { float position, initial, rate;
position = initial + rate * 60;
=
id1
+
进行类型 转换
id2
ቤተ መጻሕፍቲ ባይዱ
*
id3
int float
60
2020/10/20
《编译原理与技术》讲义
17
编译程序的组成结构
中间代码生成 形式多样 - 三地址码,p-code等 t1 := int_to_float( 60 ) t2 := id3 * t1 t3 := id2 + t2 id1 := t3
2020/10/20
《编译原理与技术》讲义
15
编译程序的组成结构
语法分析阶段-parser 记号流 -> 分析树(语法树)
id1 = id2 + id3 * 60 记号流
parser
2020/10/20
= id1
+
语法树
id2
*
id3
60
《编译原理与技术》讲义
16
编译程序的组成结构
语义分析 语义树-带有语义信息的分析树(语法树)
2020/10/20
《编译原理与技术》讲义
4
语言翻译过程
输入命令 cc foo.c
c 程序 foo.c
库函数或 其它 object文 件
Ansi C compiler cc Object file
Linker/连接程序
a.out/可执行程序
2020/10/20
《编译原理与技术》讲义
5
语言翻译过程