编译原理-第十章-第二部分
编译原理第10章运行时的存储组织与分配

10.2 静态存储分配
在编译阶段由编译程序实现对存储空间的管理,为 源程序中的变量分配存储单元。
条件
➢在编译时能够确定变量在运行时的数据空间大小 ➢运行时不改变
编译原理第10章运行时的存储组织与 分配
FORTRAN程序的静态分配
编译原理第10章运行时的存储组织与 分配
动态存储分配 在目标程序运行阶段由目标程序实现对存
再见,see you again
2020/12/13
编译原理第10章运行时的存储组织与 分配
编译原理第10章运行时的存储组织与 分配
练习 下面程序的运行结果是什么?如果把第6行的(i+1)*fact( )改 成fact( )*(i+1)的话,则程序的运行结果是有什么变化?试分析 为什么会有这两种不同的结果。 int fact( ) { static int i=5; if(i==0) return 1; else { i--; return((i+1)*fact( )); //第6行 }} main( ) { printf("factor of 5!=%d\n",fact());}
为运行阶段实现存储奠定基础
编译原理第10章运行时的存储组织与 分配
教学内容
• 10.1 存储组织概述 • 10.2 静态存储分配 • 10.3 栈式动态存储分配 • 10.4 堆式动态存储分配
编译原理第10章运行时的存储组织与 分配
10.1 存储组织概述
运行时存储空间的划分
代码空间
目标代码空间 静态数据空间
储空间的组织与管理,为源程序中的变量分 配存储单元 特点 • 在目标程序运行时进行分配 • 编译时为运行阶段设计好存储组织形式,即为每个 数据项安排好它在数据区中的相对位置
编译原理ppt

B1
(1) (2) (3)
B2
(4) (5) (6) (7) (8) (9)
B3
B4
基本块内实行的优化: 合并已知量 删除多余运算 删除无用赋值 等 (1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
第十章 代码优化
10.1 优化技术简介 10.2 局部优化 10.3 循环优化
上海电力学院 彭源
优化的概念
编译时刻为改进目标程序的质量而进行的各项工 作。
空间效率 时间效率
空间效率和时间效率有时是一对矛盾,有时不能 兼顾。 优化的基本要求:
必须是等价变换 为优化的努力必须是值得的(有效、合算)。
优化的分类
7.2 局部优化
局部优化是指基本块内的优化 基本块是指程序中一顺序执行的语句序列,其 中只有一个入口语句和一个出口语句。执行时 只能从入口语句进入,从其出口语句退出
7.2.1 基本块的划分
1.
1) 2) 3)
把程序(中间代码形成)划分成基本块的算法: 求基本块的入口语句,它们是: 程序的第一个语句;或者 条件转移或无条件转移语句的转移目标语句; 或者 紧跟在条件转移语句后面的语句。
例:划分基本块 (1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
编译原理第10章_2

代码生成算法
用一个数组RVALUE来描述(记录)每个寄存器当 前的状况,是处于空闲状态还是被某个或某几 个变量占用;用寄存器Ri的编号值作为数组 RVALUE的下标,其数组元素值为变量名;
用数组AVALUE[M]表示变量的存放情况。一个 变量的值可能存放在寄存器中或存放在内存中, 也可能既在寄存器中又在内存中。
3. MOV *R1, *R0
ADD *R2, *R0
cost=2
假定R1和R2中分别包含b和c的值, 并且b的值在
这个赋值以后不再需要, 则还可有
4. ADD R2, R1 MOV R1, a
cost=3
3 寄存器分配
寄存器的分配与指派:在寄存器分配期间,为程 序的某一点选择驻留在寄存器中的一组变量; 在随后的指派阶段,选出变量将要驻留的具体 寄存器。
例:若用A,B,C,D表示变量,用T,U,V表 示中间变量,有四元式如下: (1) T:=A-B (2) U:=A-C (3) V:=T+U (4) D:=V+U
待用信息和活跃信息在四元式上的标记如下所示。 (1) T(3)L:= A(2)L - BFL (2) U(3)L:= AFL - CFL (3) V(4)L:= TFF + U(4)L (4) DFL:= VFF + UFF
④ 给出R,返回。
练习
1, 对照课件,好好看书吧!
b) 如果中间代码生成时的算法允许某些临 时变量在基本块外引用时,则假定这些临时变
量也是活跃的。
假设在变量的符号表的记录项中含有待用信息和 活跃信息的栏目,算法步骤如下:
① 对各基本块的符号表中的"待用信息"栏和"活 跃信息"栏置初值,即把"待用信息"栏置"非待 用","活跃信息"栏按在基本块出口处是否为 活跃而置成"活跃"或"非活跃"。 现假定变量都是活跃的,临时变量都是非 活跃的。
编译原理_Chapter-10

个属性都有一个值域
2. 非终结符及动作符号的属性可分为继承属性和综合属性 3. 开始符号的继承属性具有指定的初始值 4. 输入符号 (终结符号) 的每个综合属性具有指定的初始值 5.属性值的求值规则: (略)
常量区
程序数据存储器
8
例: a := b+c;
LDA (a) LOD b LOD c ADD STN
9
栈式抽象机指令代码如下:
指令名称 加载指令 立即加载 地址加载
存储 间接存 间接存
加 减 乘 ………
操作码 LOD LDC LDA STO ST STN ADD SUB MUL
地址 D 常量 (D) D @D
18
翻译处理过程为:
由该文法产生的一个声明实例为: constant integer SYMBSIZE := 1024;
<const del> →constant <type>↑t <entity>↑n :=
<const expr>↑c, s @insert↓ t,n,c,s ; 先识别类型(integer),将它赋给属性t;然后识别常量名字 (SYMBSIZE),将它赋给属性n;最后识别常量表达式,并 将其值赋给c,其类型赋给属性s 。
DECLARE @dec_on↑x‘(’ A , @name_defn↓A B , @name_defn↓B C @name_defn↓C‘)’ FLOAT @fix_up↓x, FLOAT
17
10.3.1 常量类型声明处理 常量标识符通常被看作是全局名。
编译原理 第10章(清华大学)

∶ ∶
(a) (a) 到 达 标 号 B1处 ;
BB 的 内 情 向 量 ZZ
BB11 的 TT OO P DISPLAY
形式单元 m,n 2
连接数据 A的TOP
∶ ∶ (b) (b)进 入 分 程 序 B1;
31
数 组B
B的 内 情 向 量 z
B1 的 T O P D I S P LAY
20
用Display表的方案
(1)主程序--->(2)P--->(3)Q--->(4)R
top
P的
display sp 活动记录
d[1]
主程序的
d[0]
活动记录
top display
主程序的
d[0]
sp 活动记录
(2)
(1)
21
用Display表的方案
• 主程序--->P--->Q--->R
d[2]displatyopsp
endmainmainqrmainqqtopr的活动记录q的活动记录spq的活动记录q的活动记录主程序全局主程序全局数据区数据区top临时工作单元局部简单变量局部数组的内情向量保存运行过程前的状态返回地址寄存器值??实参形式单元和参数个数sp控制链老sptop的数组区sp的活动记录q的活动记录主程序全局数据区嵌套过程语言的栈式分配方案l主要特点语言一个过程可以引用包围它的任一外层过程所定义的标识符如变量数组或过程等
地址 3 参数个数 4 形式单元
. . . d D ISP L A Y . 简单变量 . 数组内情向量 . 临时变量
• 当过程的层次为n, 它的 display为n+1个 值。 • 一个过程被调用时, 从调用过程的 DISPLAY表中自下向 上抄录n个SP值,再加 上本层的SP值。 •全局DISPLAY地址
编译原理课件第十章

湖北大学数计学院计科系
2010年9月
杂凑技术
设计一杂凑函数h(x),其中x为任一标识符,它把x映象 成表区中某一单元的地址,并要求当x≠y时,h(x)=h(y)的 可能性尽量地小,即单元冲突地可能性尽量小。
解决冲突的两种方法: 1. 线性探查法 2. 链接技术
湖北大学数计学院计科系
2010年9月
线性查找
造表时,它从符号表的表头依次向表尾方向填入诸表项,把 当前要填入的新表项填到符号表中紧接已填表之后的一个空 位置上,这样构造的表称为线性表。
查表时,从表头开始朝表尾方向(或从已填表项的末端开始 朝表头方向)逐个进行比较,直至找到所需表项或表中所有 已填表项比较完毕为止。
湖北大学数计学院计科系
B(Currbl).p := Lastbl + 1 ;
For i := 1 step 1 until B(Currbl).NO do Begin
Lastbl := Lastbl+1; T(Lastbl) := T(SP) ;
B(1..m)为分程序表,其每个表项形如 (Sno,NO,P);
Currbl为当前分程序的编号,初值为0;
➢对于变量,其描述信息通常包括: 类型、种类、精度、数组维数、形参类型、结构分量、标号、运行时
地址等等; ➢对于过程,其描述信息通常包括:
函数过程、形参过程、程序外部过程、递归过程、是否有形参等等。
湖北大学数计学院计科系
2010年9月
10.3 符号表的构造与查找
➢符号表的构造是指把新的表项填入表中的过程。 ➢符号表的查找是指在符号表中搜索某一特定表项的过程。
湖北大学数计学院计科系
2010年9月
构造分程序段的符号表
程序设计语言编译原理第三版第10章

§10.2 局部优化
举例:考察下面的三地址代码程序
(1)Read X
(2)Read Y
B1
(3)R:=X mod Y (4)if R=0 goto (8) B2
(5)X:=Y
(6)Y:=R
B3
(7)goto(3)
(8)write Y B4
(9)halt
B1
B2
B3
B4
§10.2 局部优化
3.流图及其生成
标识符(包括常数)-结点 NODE(A)-描述上述对应关系的函数,其值或者是一个结点的编号,
或者无定义
(2)中间代码的三种形式:A:=B A:=op B A:=B op C 或 A:=B[C]
(3)构造算法: ①开始,DAG为空 ②对基本块中每一条中间代码式,依次执行以下步骤:
§10.2 局部优化
步骤: 1.如果NODE(B)无定义,则构造一标记为B的叶结点并定义
NODE(B)为这个结点 如果当前代码是0型,则记NODE(B)的值为n,转4 如果当前代码是1型,则转2(1) 如果当前代码是2型,则(ⅰ)如果NODE(C)无定义,则构造一标 记
为C的叶结点并定义NODE(C)为这个结点;(ⅱ)转2(2)
(1)T0:=3.14 (2)T1:=2*T0 (3)T2:=R+r (4)A:=T1*T2 (5)B:=A (6)T3:=2*T0 (7)T4:=R+r (8)T5:=T3*T4 (9)T6:=R-r (10)B:=T5*T6
(4)代数变换
§10.2 局部优化
二、基本块的DAG表示及其应用
1.基本块的DAG:
一种结点带有下述标记或附加信息的DAG
(1)图的叶结点以一标识符(变量名)或常数作为标记,表示该 结点代表该变量或常数的值。
《编译原理》重点知识总结

《编译原理》知识点总结目录第一章引论第二章高级语言及其语法描述第三章语法分析——自上而下分析第四章属性文法和语法制导翻译第五章语义分析和中间代码产生第六章优化第一章引论一.编译程序(compiler):把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序二.编译程序的工作的五个阶段:词法分析、语法分析、中间代码产生、优化、目标代码产生1.词法分析任务: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。
依循的原则:构词规则描述工具:有限自动机FOR I := 1 TO 100 DO保留字标识符等符整常数保留字整常数保留字2.语法分析任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。
依循的原则:语法规则述工具:上下文无关文法3.语义分析与中间代码产生任务:对各类不同语法范畴按语言的语义进行初步翻译。
(变量是否定义、类型是否正确等)依循的原则:语义规则中间代码:三元式,四元式,逆波兰记号,树形结构等。
是一种独立于具体硬件的记号系统。
例:将Z:=X + 0.618 * Y 翻译成四元式为(1) * 0.618 Y T1(2) + X T1 T2(3) := T2 _ Z4. 优化任务:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:程序的等价变换规则FOR K:=1 TO 100 DOBEGINM := I + 10 * K;N := J + 10 * K;END4.目标代码产生任务: 把中间代码变换成特定机器上的目标代码。
依赖于硬件系统结构和机器指令的含义目标代码三种形式:a)绝对指令代码: 可直接运行b)可重新定位指令代码: 需要连接装配c)汇编指令代码: 需要进行汇编第二章高级语言及其语法描述2.1.1语法词法规则:单词符号的形成规则。
a)单词符号是语言中具有独立意义的最基本结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2) if X<Y goto B3
(3) I:=2 (4) X:=X+1
B3
(5) Y:=Y-1 (6) if Y<=20 goto B5 (7) J:=I
不能外提的原因:B3不是循环出口结点B4的必经结点。 代码外提条件:不变运算所在的结点是循环L所有出口结点 的必经结点.
10
2.合并已知量 (1) 如果NODE(B)是标记为常数的叶结点,则转2(3);否则, 转3(1)。 (2) 如果NODE(B)和NODE(C)都是标记为常数的叶结点,则转 2(4);否则,转3(2)。 (3) 执行op B (即合并已知量)。令得到的新常数为P。如果 NODE(B)是处理当前四元式时新构造出来的结点,则删除 它。如果NODE(P)无定义,则构造一用P作标记的叶结点n。 置NODE(P)=n,转4。 (4)执行B op C (即合并已知量)。令得到的新常数为P。如果 NODE(B)或NODE(C)是处理当前四元式时新构造出来的结 点,则删除它。如果NODE(P)无定义,则构造一用P作标 记的叶结点n。置NODE(P)=n,转4。
n5 T2 , T4 + n3 R n4 r
3
n1 3.14
3.基本块四元式与DAG结点表示
一个基本块,可用一个DAG来表示与各四 元式相对应的DAG结点形式: DAG 图 n1 B
4
四元式 (0) 0型: A:=B (:=,B,-,A)
A
四元式
(1) 1型: A:=op B (op,B,-,A)
四元式
(5) 3型: D[C]:=B ([]=,B,-,D[C])
DAG 图
n4 []= n1 D n2
C
n3 B
(6) 0型: goto (s) (j,-,-,(s))
n1 (s)
7
假设DAG各结点信息将用某种适当的数据结构存放(如 链表)。另设置一个标识符与结点的对应函数:
如果存在一个结点n, n Node( A ) A是其上的标记或附加标识符 null 否则
DAG 图
n2 A op n1 B
(2) 2型: A:=B op C (op,B,C,A)
n3 A op n1 n2 B C
5
四元式
(3) 2型: A:=B[C] (=[],B[C],-,A)
DAG 图
n3 A =[] n1 n2 B C n3 (s) rop n1 n2 B C
6
(4) 2型: if B rop C goto (s) (jrop,B,C,(s))
29
(1)
I:=1
B1
(2‘) I:=3 (2) if X<Y goto B3
(3) I:=2 (4) X:=X+1
B2
B3
(5) Y:=Y-1 (6) if Y<=20 goto B5 (7) J:=I
B4
B5
考虑: B2 B3 B4 B2 B4 B5 I=3, J=3
30
11
3. 寻找公共子表达式 (1) 检查DAG中是否已有一结点,其唯一后继为NODE(B) 且标记为op(即公共子表达式)。如果没有,则构造 该结点n,否则,把已有的结点作为它的结点并设该 结点为n。转4。 (2) 检查DAG中是否已有一结点,其左后继为NODE(B), 右后继为NODE(C),且标记为op(即公共子表达式)。 如果没有,则构造该结点n,否则,把已有的结点作 为它的结点并设该结点为n。转4。
12
4. 删除无用赋值 如果NODE(A)无定义,则把A附加在结点n上并令 NODE(A)=n;否则,先把A从NODE(A)结点上的附加标识 符集中删除(注意,如果NODE(A)是叶结点,则其A标 记不删除)。把A附加到新结点n上并置NODE(A)=n。转 处理下一四元式。
13
例:试构造以下基本块G的DAG (1) T0:=3.14 (2) T1:=2*T0 (3) T2:=R+r (4) A:=T1*T2 (5) B:=A (6) T3:=2*T0 (7) T4:=R+r (8) T5:=T3*T4 (9) T6:=R-r (10) B:=T5*T6
B3
25
(1)
I:=1
B1 B2 B4 B5
(2) if X<Y goto B3
(3) I:=2 (4) X:=X+1
B3
(5) Y:=Y-1 (6) if Y<=20 goto B5 (7) J:=I
循环L:{B2,B3,B4} 入口结点:B2 出口结点:B4(从该结点有一有向边引到循环外的某结点)
G (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
T0:=3.14 T1:=2*T0 T2:=R+r A:=T1*T2 B:=A T3:=2*T0 T4:=R+r T5:=T3*T4 T6:=R-r B:=T5*T6
G’ (1) T0:=3.14 (2) T1:=6.28 (3) T3:=6.28 (4) T2:=R+r (5) T4:=T2 (6) A:=6.28*T2 (7) T5:=A (8) T6:=R-r (9) B:=A*T6 利用DAG可以实现局部优化 (1)合并已知量 G’中T1和T3都变成6.28 (2)删除多余运算 G中T4=R+r G’T4=T2 (3)删除无用赋值 18 G中B=A在G’中不再出现
符,就是作为叶子结点上标记的那些标识符。
在基本块内被定值并且该值在基本块后面可以被引
用的所有标识符,就是DAG各结点上的那些附加标 识符。
20
10.3 循环优化
对循环中的代码,可以实行: 代码外提 强度消弱 删除归纳变量(变换循环控制条件) 循环展开 循环合并
21
一、代码外提
15
(8) T5:=T3*T4 (10) B:=T5*T6
优化后的四元式
(1) (2) (3) (4) (5) (6) (7) (8) (9)
T0:=3.14 T1:=6.28 T3:=6.28 n6 A , B, T5 T2:=R+r * T4:=T2 n5 T2 , T4 n7 T 6 A:=6.28*T2 + T5:=A n1 T0 n2 T1 , T3 n3 T6:=R-r n4 B:=A*T6 3.14 6.28 R r
22
实行代码外提,在循环入口结点前面建立一个新结点(基本 块),称为循环的前置结点,前置结点以循环入口结点为其 唯一后继,原来流图中从循环外引到循环入口结点的有向边, 改成引到循环前置结点。
前置结点
入口结点
入口结点 循环L
循环L
23
代码外提条件
for I:=1 to 10 do A[I, 2*J] := A[I, 2*J] + 1
26
(1)
I:=1
B1 B2 B4 B5
(2) if X<Y goto B3
(3) I:=2 (4) X:=X+1
B3
(5) Y:=Y-1 (6) if Y<=20 goto B5 (7) J:=I
X=30, Y=25 B1 B2 B4 B2 B4 … B2 B4 B5 J=1, I=1
24
(1)
I:=1
B1
(1) (3) (6) (7) (10)
I:=1
B1
(2) if I>10 goto (15) B2 (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) T1=2*J T2=10*I T3= T2+ T1 T4=addr(A)-11 B3 T5=2*J T6=10*I T7= T6+ T5 T8=addr(A)-11 T9= T8[T7] T4[T3]= T9+1 I:=I+1 goto B2
27
(1) (3)
I:=1 I:=2
B1 B2’ B2 B4 B5
(2) if X<Y goto B3 (4) X:=X+1
B3
(5) Y:=Y-1 (6) if Y<=20 goto B5
(7) J:=I
X=30, Y=25 B1 B2’ B2 B4 B2 B4 … B2 B4 B5 J=2, I=2
14
(1) (2)
(3) (4) (5) (6) (7) (9)
T0:=3.14 T1:=2*T0
T2:=R+r A:=T1*T2 B:=A T3:=2*T0 T4:=R+r T6:=R-r
n8 B * n6 A , B, T5 * n5 T2 , T4 n7 T 6 + n1 T0 n2 T1 , T3 n3 3.14 6.28 R n4 r
16
n8 B *
优化后的四元式——若只有A和B是出基 本块之后活跃的 n8 B
(1) T2:=R+r (2) A:=6.28*T2 (3) T6:=R-r (4) B:=A*T6
* n6 A , B, T5 * n5 T2 , T4 n7 T 6 + n4 r
17
(1) S1:=R+r (2) A:=6.28*S1 n1 T0 n2 T1 , T3 n 3 (3) S2:=R-r 3.14 6.28 R (4) B:=A*S2
8
0,1,2型四元式的基本块的DAG构造算法 0型: A:=B 1型: A:=op B 2型: A:=B op C
对基本块中每一四元式,依次执行以下步骤: 1. 准备操作数的结点 2. 合并已知量 3. 删除公共子表达式 4. 删除无用赋值