编译原理-第十章-第二部分
编译原理第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)单词符号是语言中具有独立意义的最基本结构。
编译原理第十章目标程序运行时的存储组织
编译原理第十章目标程序运行时的存储组织课前索引【课前思考】◇回顾通常的编译过程,能否找到本章所讲内容在哪个过程?◇为什么编译程序要考虑目标程序运行时存储区的管理与组织?◇请归纳C语言与PASCAL语言的程序结构与数据类型的不一致点【学习目标】全面熟悉目标程序运行时存储区的整体布局;每种存储区的组织方式与管理方法;并通过实例着重掌握,对同意过程嵌套定义的情况,栈式动态存储分配的组织方式与运行时进栈退栈的活动实现方法。
【学习指南】在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
我们这里所说的运行时的存储区组织,是指目标程序运行时的数据空间的管理与组织。
【难重点】◇目标程序运行时,存储区域的整体布局,与各区域的作用。
◇各类不一致类型的数据表示。
◇同意过程嵌套定义的情况,栈式动态分配的组织管理。
◇对过程的调用,进入与退出时,栈式动态分配的工作原理。
◇过程活动纪录的各项内容与它们的作用,与活动纪录的组织方式。
◇过程参数传递的不一致方式。
【知识结构】从逻辑上看,在代码生成前,编译程序务必进行目标程序运行环境的配置与数据空间的分配。
通常来讲,假如编译程序从操作系统中得到一块存储区以使目标程序在其上运行,该存储区需容纳生成的目标代码与目标代码运行时的数据空间。
数据空间应包含:用户定义的各类类型的数据对象(变量与常数)所需的存储空间,作为保留中间结果与传递参数的临时工作单元,调用过程时所需的连接单元,与组织输入/输出所需的缓冲区。
目标代码所占用空间的大小在编译时能确定。
有些数据对象所占用的空间也能在编译时确定,其地址能够编译进目标代码中。
而有些数据对象具有可变体积与待分配性质,无法在编译时确定存储空间的位置。
因此运行时的存储区常常划分成:目标区、静态数据区、栈区与堆区,如图10.1就是一种典型划分,代码(code)区用以存放目标代码,这是固定长度的,即编译时能确定的;静态数据区(static data)用以存放编译时能确定所占用空间的数据;堆栈区(stack and heap)用于可变数据与管理过程活动的操纵信息。
编译原理-第十章--代码优化
第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。
所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。
优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。
一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。
中间代码的优化是对中间代码进行等价变换。
目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。
另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。
局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。
循环优化对循环中的代码进行的优化。
全局优化是在整个程序范围内进行的优化。
本章重点:局部优化基本块的DAG表示第一节优化技术简介为了说明问题,我们来看下面这个例子,源程序是:P :=0For I :=1 to 20 doP :=P+A[I]*B[I];经过编译得到的中间代码如图10-1-1所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。
那么,对于这个中间代码段,可进行如下这些优化。
1、删除多余运算(删除公共子表达式)优化的目的在于使目标代码执行速度较快。
图10-1-1中间代码(3)和(6)中都有4*I的运算,而从(3)到(6)没有对I赋值,显然,两次计算机的值是相等的。
所以,(6)的运算是多余的。
我们可以把(6)变换成:T4 :=T1。
这种优化称为删除多余运算或称为删除公共子表达式。
2、代码外提减少循环中代码总数的一个重要办法是代码外提。
这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。
使之只在循环外计算一次,上例中,我们可以把(4)和(7)提到循环外。
经过删除多余运算和代码外提后,代码变成图10-1-2。
编译原理chapter2 语言的基本知识
2.2 文法和语言的定义
2 . 2 . 1 引子 2 . 2 . 2 文法和语言的定义 一. 文法和语言的定义 二. 推导 三. 语言 四. 最左推导和最右推导 五。短语,直接短语,句柄
11
引子 分析:The grey wolf will eat the goat
〈句子〉
〈主语〉
〈谓语〉
〈冠词〉〈形容词〉〈名词〉 〈动词〉 〈直接宾语〉
7
三.符号串的运算 1.连接:设x和y是符号串,它们的连接 xy 是把y的符号写在x的符号之后得到的符号 串。例如,x=ba,y=nana,xy=banana.
2.方幂:x0= ; x1=x; x2=xx;
……;xn=xn-1x;
例如, x=ba,
x1= ba, x2=baba, x3=bababa,…...
3
2.1.1 字母表
字母表是符号的非空有穷集合。任何程序
语言都有自己的字母表,例如:
1.计算机语言:由符号“0”和“1”组成
的字
母表,∑={0,1}
2. ASCII字符集;
3. Pascal字母表为: ∑=
{AZ, az, 09, +, -, *, /, <, =, >,
:, ',', ; ,., , (, ), {, }, [, ] }
直接宾语 , 助动词 ,动词原形 } 语法规则集P={句子 主语谓语,……} 开始符号S= 句子
14
句子根据规则推导出来
句子主语 谓语
冠词 形容词 名词 谓语
the 形容词 名词 谓语
the grey名词 谓语
the grey wolf 谓语
the grey wolf 动词 直接宾语
编译原理编译原理02-授课文档PDF_2_2
视频区域
标识符与名字
标识符
以字母开头的,由字母数字组成的字符串
名字
标识程序中的对象
视频区域
Jordan
binding
标识符
名字
绑定
视频区域
标识符与名字
名字的意义和属性
值:单元中的内容
属性:类型和作用域
名字的说明方式
视频区域
由说明语句来明确规定的
int score
描述数据和对数据的运算
视频区域
程序的层次结构
程序 |
子程序或分程序、过程、函数 |
语句 |
表达式 |
数据引用 运算符 函数调用
视频区域
程序语言成分的逻辑和实现意义
抽象的逻辑的意义
数学意义
计算机实现的意义
具体实现
计算思维与数学思维 视频区域 的不同
编译原理
高级程序设计语言概述 ——高级程序设计语言的一般特性
视频区域
测试
下面哪些属于程序语言的语义定义? ( A. 表达式中圆括号必须匹配 B. 类的声明必须以class开头 C. 关于函数调用时参数传递方法的描述 D. 函数体必须用return语句结尾
)
视频区域
程序语言的基本功能和层次结构
程序,本质上说是描述一定数据的处理过程
程序语言的基本功能
K.Nygaard 视频区域O. Dahl
John Cocke (1987) -- RISC & 编译优化
O. Dahl,K.Nygaard (2001) -- Simula语言和OO概念
Alan Kay(2003) -- SmallTalk语言和面向对象程序设计
编译原理第10章
编译原理
例子:下面的程序段 PI=3.141592 R=2 S=PI*R*R 可重写为: PI=3.141592 R=2 S=3.141592*2*2 进一步的合并,则最终产生: PI=3.141592 R=2 S=12.566368 注意∶在所有后继的语句中,PI或S的每一次出现都 可由它的对应值替代,直到该变量被一个语句重新定 义为止。
第19页
编译原理
第20页
编译原理
4.重新命名临时变量 例如: t:=b+c →→ u:=b+c
5.交换语句次序 目的:减少临时变量 例如:相邻两个语句 t1:=b+c → t2:=x+y t2:=x+y → t1:=b+c
Байду номын сангаас第21页
编译原理
6.合并已知量
是将能在编译时计算出值的表达式用其相应 的值替代,即如果在编译时,编译程序能知 道这一个表达式的所有操作数的值,则此表 达式就可由其计算出的值替代。 A:=B op C A:=op B 若B与C为已知量(在编译时可以计算出 值), 则计算出B op C或op B的值t, 改写为 A:=t;
编译原理
第一节
概 述
优化的定义:对程序进行各种等价变换,使得 变换后的代码运行结果与变换前代码运行结果 相同,而运行速度加大,或占用存储空间减少, 或两者都有。 空间效率和时间效率有时是一对矛盾,有时 不能兼顾。
第5页
编译原理
三条优化原则
等价:是指不改变程序的运行结果; 有效:主要指优化后的目标代码运行时间较短, 以及占用的存储空间较小。 合算:应尽可能以较低的代价取得较好的优化 效果。
第二节 局部优化
基本块内的变换为局部优化。
清华大学编译原理第二版课后习答案
Lw.《编译原理》课后习题答案第一章第 1 章引论第 1 题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
编译原理陈火旺版10-11章.
对于给定的一个程序,可以将其划分为一系列的基本 块,分别在块内进行局部优化(基本块内的优化)。
以下先给出划分基本块的算法。
1. 求出程序中可做基本块入口的语句,它们是: (1)程序的第一个语句;
(2)能由条件转移语句或无条件转移语句转移到的语句; (3)紧跟在条件转移语句后面的语句。
T0:=3.14
8B
T1:=6.28
*
T3:=6.28 T2:=R+r T4:= T2 A:=6.28*T2 T5:=A
B A 6 T5
*
5 +
T2 T4
7 -
T6
T6:=R-r
B:=A*T6 已完成了如下优化:
1 T0
2
T1 T3
3
4
合并已知量;
3.14 6.28 R
r
删除无用代码;(B:=A)
删除公共子表达式。
经前述各种优化处理后,最终的中间代码如下:
B1
i:=m-1; j:=n ; T1:=4*n; v:=a[T1];
T2:=4*i; T4:=4*j;
B2
T2:=T2+4;T3:=a[T2]; if T3<v goto B2
B3
T4:=T4+4;T5:=a[T4]; if T5>v goto B3
B4 if T2>=T4 goto B6
第十一章 目标代码生成
目标代码生成器的位置:
源 程序
编译前端
中间 代码
代码优化
中间 代码
代码生成器
目标 程序
符号表
目标代码的形式: 1、已定位的可立即执行的机器语言代码; 2、可浮动的机器语言代码,需装配连接再执行; 3、汇编语言目标代码,需汇编再执行。
编译原理-第十章习题答案
4
本章教学线索
1 概述 2 优化技术简介 3 局部优化 4 循环优化
上一页
下一页
5
1 概述
优化的目的是为了获得更高效的代码,必须遵循以下原则: (1)等价原则:优化后不能改变程序运行的结果 (2)有效原则:优化后所产生的目标代码运行时间更短、占 用的存储空间更小 (3)合算原则:尽可能以较低的代价获取较好的优化效果。 常用的优化技术: (1)删除公共子表达式 (2)复写传播 (3)删除无用代码 (4)代码外提 (5)强度削弱 (6)删除归纳变量
优化后: _tmp0 = 56 ; _tmp1 = _tmp0 – b ; a = _tmp1 ;
上一页 下一页
8
常数传播
_tmp4 = 0 ; f0 = _tmp4 ; _tmp5 = 1 ; f1 = _tmp5 ; _tmp6 = 2 ; i = _tmp6 ;
优化
f0 = 0 ; f1 = 1 ; i=2;
上一页 下一页
goto Lnext
L4:t2 = y - z x = t2 goto L1
21
3.2 基本块的DAG及其应用
基本块DAG图的概念: (1)图的叶子结点以一标识符或常数作为标志,表示该结点代表该变量或常数 的值; (2)图中的内部结点以一运算符作为标记,表示该结点代表应用该运算符对其 后继结点所代表的值进行运算的结果; (3)图中各个结点上可能附加一个或多个标识符,表示这些变量具有该结点所 代表的值。 基本块DAG图的构造算法: 假设代码形式为(0)A = B (1)A = op B (2)A = B op C 或 A = B[C]
例: L1: if a<b goto L2 goto Lnext L2: if c<d goto L3 goto L4 L3: t1 =y+z x =t1 goto L1 L4:t2 = y-z x =t2 goto L1 L1:if a<b goto L2 L2:if c<d goto L3 goto L4 L3:t1 = y + z x = t1 goto L1
编译原理 第20讲(第十章)
10.3.3分程序结构的存储分配方案
处理分程序结构存储分配方案的一种简单办法是, 把分程序看成 “无名无参过程”,它在哪里定义就在 哪里被调用。因此,可以把处理过程的存储办法应用到 处理分程序中,但这种做法是极为低效的。 一则,每逢进入一个分程序,就照样建立连接数据 和DISPLAY表,这是不必要的。 二则,当从内层分程序向外层转移时,可能同时要 结束若干个分程序。 按照过程处理办法,意味着必须一层一层地通过 “返回” 来恢复所要到达的那个分程序的数据区,但 不能直接到达。
10.4.1 传值的实现(Call
by value)
1.形式参数当作过程的局部变量处理,
即在被调过程的活动记录中开辟了形参 的存储空间,这些存储位置即是我们所 说的形式单元(用以存放实参)。 2.调用过程计算实参的值,并将其放在 对应形式单元开辟的空间中。(传右值) 3.被调用过程执行时,就像使用局部变 量一样使用这些形式单元。
10.5 堆式动态存储分配
需求: – 一个程序语言允许用户自由地申请数据空间和退还 数据空间,或者不仅有过程而且有进程(process) 的程序结构, 操作: – 堆提供两个操作,分配操作和释放操作 情况: – 经一段运行时间之后,这个大空间就必定被分划成 许多块块,有些占用,有些无用(空闲)--碎片问 题
例子(Pascal)
int i; //全局变量 int a [10]; //全局变量 void p (int x) { 为什么不换名字? ++i; ++x; } main () { i=1; –1把被调用的程序中与调用过程中同名的 a[1]=1; 局部变量换名 a[2]=2; –2把被调用程序抄到调用处,其中形参用 p(a[i]); 实参文字形式替换 return 0; }
- 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. 删除无用赋值