编译原理-第十章

合集下载

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

编译原理第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

编译原理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

编译原理第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

编译原理_Chapter-10
定义5.2: L-属性翻译文法是带有下列说明的翻译文法: 1. 文法中的终结符,非终结符及动作符号都带有属性,且每
个属性都有一个值域
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章(清华大学)

编译原理 第10章(清华大学)
连接数据 A 的TOP
∶ ∶
(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章

§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)图的叶结点以一标识符(变量名)或常数作为标记,表示该 结点代表该变量或常数的值。

编译原理第十章

编译原理第十章
10.1.1

代码生成器的输入和输出
代码生成器:把源程序的某种中间表示 转换成目标代码; 目标代码生成器的输入:源程序的某种中 间表示(还可能有符号)。 目标代码生成的输出:与源程序等价的 目标代码。


中间代码的表示形式

后缀式(栈式)中间代码


三地址中间代码(三元式和四元式)
图结构中间代码(树,DAG)

假定虚拟的目标机按字编址,拥有1个通用寄 存器R,每个机器字存放一条指令。指令的格 表示方式:(地址):含义 为 此"地址"的内容,即 式为: content(地址)。 OP destination,source
source 和destination可以是立即数、寄存器、 存储字地址(绝对地址或以及以寻址方式表示 的地址),但不能同时为存储字地址。例如:
间接寄存器
间接变址 立即数
*R (寄存器内存放的 是操作数的地tent(R) (内存单元)
Content(C+content( R)) (内存单元)
虚拟机指令系统
指令名称 读 指令形式 IN R 指令含义
读指令,将外 部值输入到寄 存器R中

取数
写指令,将寄 存器R中的值输 出 LD R , A 将地址A中的内 (A表示源操作 容存入寄存器R 中 数地址)
–装配程序用来把程序加载到内存储器中,以便执
行。装入程序可处理所有的与指定的基地址或起 始地址有关的可重定位的地址,它使得可执行代 码更加灵活。 这种形式的目标代码虽然比较繁琐,连接和 装入时要付出一定的代价,但各个子程序模块可 以分别编译,给程序开发带来了极大的灵活性。
装配程序示例
3. 汇编语言代码
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

The end.
10.4 分程序结构的符号表
要构造分程序结构的符号表,需要在进入一分程序 和退出一分程序时完成相应的工作。 ❖ ① 进入分程序。在分程序表中添加一元素,使该分 程序变成当前分程序:
Lastbl:= Lastbl + 1; B(Lastbl):= (Currbl, 0, SP); Currbl:= Lastbl
Procedure BINARYSEARCH; begin i:= 1; j:= n; while i≤j do k:= (i + j) DIV 2 if T[k] = x then return (x的信息) else if T[k] x then i:= k + 1
else j:= k – 1; return (表中不存在x表项); end;
❖ 对于变量,其描述信息通常包括:类型、种类、精度、 维数或维数之值、形参类型、连结其它分量的方式、 标号的类型、是否在公用语句或等价语句中出现、它 的说明是否处理过、它运行时的地址。
10.2 符号表中的数据
对于过程,其描述信息通常包括: ❖ ① 是否为函数过程?若是,则给出其函数类型。 ❖ ② 是否为形式参数过程? ❖ ③ 是否为程序的外部过程? ❖ ④ 是否为递归过程? ❖ ⑤ 是否有形参?若是,给出每个形参的描述信息。 ❖ ⑥ 其说明是否加工过?
❖ 因为组成标识符的符号个数是不固定的。因此,常 常不是直接将标识符本身存放在主目栏中,而是存 放一个指向标识符的指示器,并在另一字符串表中 存放这些标识符。
10.2 符号表中的数据
❖ 符号表是编译程序中的一个很重要的部分,应按方便 获取信息和有效添加信息的方式建立符号表。值部分 描述标识符的有关属性,因此也称为描述信息。
线性查表算法为 Procedure LINEARSEARCH; begin for i:= n step –1 until 1 do if T[i] = x then return (x的信息), return (表中不存在x表项); return; end;
10.3.2 折半法
❖ 造表法是指按照表项主目的“大小”次序进行填写, “小”的排在前,“大”的排在后。
10.3.3 杂凑技术
❖ 除法公式 h (x) = ( x mod k )*2 其中,k是小于表容的最大质数,即k = 2039。这里 h (x)的直观含义是:标识符x的机内编码除以k的余 数,再乘2。
❖ 折叠函数。 本方法是把标识符机内编码分成若干段,每段≤11 位,然后按某种方式迭加,再取其中11位后乘2作为 h (x)之值。
❖ 查表时,每次取当时表正中间(即对折)那个表项 的主目与被查项进行比较;若被查项“小于”中间 表项,则在前半表区重复折半法查找;若被查项 “大于”中间表项,则在后半表区重复折半法查找 (两者相同时,表示已查到所需要的表项)。重复 这一过程,直到当时的表尾大于当时的表头为止。
10.3.2 折半法
折半查找算法为
10.3.3 杂凑技术
造表算法
Procedure HASHBUILD; begin if g≥2048 then return (error: 标识符表溢出); 计算h (x)→h; while @ (h) 0 do
if @ (h) = x then return (error: 重名) else begin
10.3.3 杂凑技术
❖ 乘法公式 h (x) = [C*( (*x) mod 1 )]*2 其中,x为标识符的机内编码;=0.618033988747; C=2048=211是表容,即表区中允许存放的标识符的 最大个数;a mod b的含义是a除以b的余数;[E]为E 之值的整数部分;h(x)的直观含意是:和x的乘积 的低位段的前11位内容再乘2;“2”是每个标识符所 占的单元个数。
10.3 符号表的构造与查找
符号表的构造(简称造表)是指把新的表项填入表中 的过程。符号表的查找是指在符号表中搜索某一特定 表项的过程。 10.3.1 线性查找 它按主目出现的先后顺序填写各个表项,而不做任何 整理表项次序的工作。查表时,从表头开始朝表尾方 向(或从已填表项的末端开始朝表头方向)逐个进行 比较,直至找到所需表项或表中所有已填表项比较完 毕(此时表明未找到所需要的表项)为止。
end; return (error: 名无定义);
10.3.3 杂凑技术
❖ 链接技术 链接技术就是在造表时,把冲突的各标识符连接到 一条“链”上,查表时,沿着这条“链”查找。这 种技术通常把表分为两个区:一部分称为链根区, 存放杂凑函数值不同的那些标识符;另一部分称为 链表区,存放所有冲突的标识符。 这是一种较好的解决冲突的方法,缺点是表区中的 链接地址(如LD)占用了一部分存储空间。
10.4 分程序结构的符号表
❖ ② 退出分程序。把该分程序的全部表项移到符号 表首部并使该分程序的外层分程序变为当前分程序。 B(Currbl).P:= Lastbl + 1; for i:= 1 step 1 until B(Currbl).NO do begin Lastbl:= Lastbl + 1; T(Lastbl):= T(SP); SP:= SP + 1; end; Currbl:= B(Currbl).Sno
h:= h + 2; if h≥4096 then h:= 0; end; @ (h):= x; g:= g + 1; return;
10.3.3 杂凑技术
查表算法:
Procedure HASHSEARCH;
begin f:= 0; 计算h (x)→h; while f2048 do
begin if @ (h) = x then return (查到表项x的信息); if @ (h) = 0 then return (error: 名无定义); h:= h + 2; if h 4096 then h:= 0; f:= f + 1
10.3 符号表的构造与查找
线性造表算法为 Procedure LINEARBUILD; begin for i:= n step –1 until 1 do if T[i] = x then return (error, 重名); n:= n+1; T[n]:= x; return; end;
10.3 符号表的构造与查找
10.3.3 杂凑技术
杂凑技术就是设计一杂凑函数h(x),其中x为任一标 识符,它把x映象成表区中某一单元的地址,并要求 当x y时,h(x) = h(y)的可能性尽量地小,即单元冲 突的可能性尽量地小。这样,在利用杂凑法造表时, 就能使要填入的标识符比较均匀地散列在整个表区 中(因此,杂凑法也称散列法)。
10.3.3 杂凑技术
用链接法存放方式示意图
链根区 S1
S2 S3
链表区
LD
S4
S5
0
S6Biblioteka 0S7S8
0
pointer
S9 S10
10.4 分程序结构的符号表
分程序结构符号表
分程序表
Sno
No
P
1 0(无) 4
21
3
31
4
43
1
分程序的编号(按 begin 的出现次序)
符号表
e, f, l1 b g, h, l2 l3 a, b, c, d
10.3.3 杂凑技术
解决冲突的方法 ❖ 线性探查法
线性探查法是解决冲突的最简单的一种方法,即当 发生冲突时,从冲突单元的下一位置开始,逐个查 寻,直至找到第一个所需位置(空单元)或指出语 法错(符号表溢出或标识符无定义)为止。 使用线性探查法解决地址冲突的缺点是:不容易将 表项均匀地分散到整个表区。
第十章 符号表的组织和查找
为了检查语义的正确性和生成代码,需要知道 源程序中所使用的各种标识符的属性,这些属性常 常由编译程序集中起来并存放在一个标识符表或符 号表中。本章讨论组织、构造和查找各种符号表的 方法。
10.1 符号表的一般组织形式
❖ 符号表的每一项(称为表项)包含两个部分,即主 目和值。表的主目通常即符号或标识符本身(变量 的名字),值乃是它们的属性,包括种属(如简单 变量、数组或过程等)和类型(如整型、实型、布 尔型等)。
相关文档
最新文档