编译原理---第8章解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
局部数据的动态分配(Dynamic Allocation)
• 层次单元法
• 栈式(Stack)存储分配策略
• 堆式(Heap)存储分配策略
www.bjut.edu.cn
国家精品课程
——
《编译原理》
运行时刻的内存划分
数组区 临时工作单元区 简单变量区
代码段 全局静态数据
形式单元区 寄存器保护区 返回地址
动态(Dynamic)绑定
运行时指定(具体地址/相对地址) 回忆:动态数组
www.bjut.edu.cn
国家精品课程
——
7
《编译原理》
过程/函数名的绑定
为过程指定程序代码段入口地址 静态绑定:编译时指定相对地址
(词法分析:在符号表中建立过程的表项)
语义分析:构造目标代码,填写过程的入口地址 如:函数、子程序
www.bjut.edu.cn
4
分段式程序 Program layer Int a,b,c Begin …… Sub(a+b,b,a) …… End Subroutine sub(x,y,z) Real a,b,c Begin …… End
嵌套式程序 Program layer Int a,b,c Procedure sub1(x,y,z) Int x,y,z Procedure add(a,b) Real a,b Begin Real x,y,z x=a y=x*2+b z=1/y End Begin …… End Procedure sub2(x,y) …… Begin …… end
C.true S1.begin
S1.code
goto S.next
S2.begin S2.code S.next
www.bjut.edu.cn
国家精品课程
——
16
《编译原理》
上次课主要内容
S.begin S → while C do S1翻译
S.begin := S1.next := newlabel; C.true := S1.begin := newlabel;
1
第8章 运行环境
(Run-Time Enviroments)
国家精品课程
——
2
《编译原理》
主要内容
绑定(Binding)
存储(Storage)组织(Organization)与分配 (Allocation) 参数(Parameter)传递(Passing) 过程说明与调用 符号表(Symbol Table)管理
——
23
《编译原理》
堆(Heap)式存储分配
用于动态数据结构
存储空间的动态分配和释放
实现方法
将内存空间分为若干块,根据用户要求分配 无法满足时,调用无用单元收集程序将被释放的块收 集起来重新分配
www.bjut.edu.cn
国家精品课程
——
24
《编译原理》
8.3 参数传递
传值调用 call-by-value
如果实参 (地址 )具有左值,则存放其左值到活动记录中 ;否则计算出表达式的值,将此值存入一个单元,并将 该单元的地址传给被调用者
实参A
A 传地址
形参 X A的地址
调用者 被调用者间址访问实参 A
www.bjut.edu.cn
国家精品课程
——
26
《编译原理》
复制恢复 Copy-Restore
将参数的左、右值同时传给被调用者,被调用 者直接使用右值,并将计算结果按照左值返回 给调用者
2
1
17~31
41~62
www.bjut.edu.cn
思考:如何设计分配算法?
共需要63个存储单元
13
嵌套式程序 begin program layer real x,y,z int a,b,c x=a procedure Sub1(x,y,z) int x,y,z y=x*2+b procedure add(a,b) z=1/y real a,b begin begin int a,b,c Real x,y,z …… P 2 x=a P1 P begin P 3 y=x*2+b z=1/y S1 S2 char name,from,a …… P end end begin …… …… end end procedure Sub2(x,y) …… …… Sub2(x,y) P4 begin …… …… end sub1(a1,a2,a3) 嵌套分程序 …… 嵌套过程 end
4/17
6/10
5/23
程序段之间的调用关系
程序段号/所需数据空间
国家精品课程
——
12
《编译原理》
分层分配算法
允许程序段之间的覆盖(覆盖可能性分析)
1/22 2/15 3/18 7/80
程序段
6 5 4
区域
0~9 0~22 0~16 23~40
4/17
6/10
5/23
3
原始总存储需求=105个存储单元
www.bjut.edu.cn
28
主程序 A:=2; B:=3; P(A+B, A, A);
子程序 P(X,Y,Z); {Y:=Y+1;
换名 A:=A+1=3 A:=A+A+B=3+3 +3 9
Print A
Z:=Z+X}
复制恢复:
临时单元: T:A+B=5
X=T=5,Y=Z=A=2
传地址:
X=T=5,Y=Z=A =2
动态绑定
运行时指定——函数名作为形式参数(formals) 如:函数指针、虚函数(C++)
www.bjut.edu.cn
国家精品课程
——
8
《编译原理》
8.2 存储组织与分配(P257)
主要内容
运行时刻的内存划分(Partition)
局部数据的静态分配(Static Allocation)
国家精品课程
——
5
《编译原理》
绑定的时机与策略
语言定义的标识符的生存期决定最终绑定的时 机
全局变量:全程有效——程序装入时 局部变量:分段有效——进入过程或分程序时
www.bjut.edu.cn
国家精品课程
——
6
《编译原理》
变量名的绑定
静态(Static)绑定
编译时指定(相对地址) 词法分析期间——在符号表中建立变量的表项 回忆:说明语句的语义分析中的字节数计算,填写变量地址( enter)
Y:=Y+1=3 Z:=Z+X=2+5=7
Y
传值调用: 2 Z 7
A=3
A=7
A:=A+1=2+1
A:=A+T=3+5 8
国家精品课程
——
29
《编译原理》
8.4 过程调用
过程(procedure)
子程序(subroutine)、函数(function)
过程的定义与调用
形参和实参的结合:参数计算与传递 调用与返回
实际参数A 形式参数X
A
调用者
传值/传地址
A的地址 A的值
被调用者
www.bjut.edu.cn
国家精品课程
——
27
《编译原理》
传名调用Call-by-Name
将被调过程的过程体复制到调用处,并将每一 个形参“文字地”替换成实参 用换名子程序实现Thunk 是一种早期的语言ALGOL用的一种参数传递 方式
www.bjut.edu.cn
国家精品课程
——
30
《编译原理》
工作方式
调用方:当前环境的保存与恢复 被调方:构造环境,参数绑定
Main( ) { Sub1( x ) { Sub2( x + 1 ) } } Sub2( y ) { Sub3( )
——
15
《编译原理》 C.code C.false
上次课主要内容
S → if C then S1 else S2 的 翻译
C.true := newlabel; C.false := newlabel; S1.next := S2.next := S.next; S.code := C.code || gen( C.true':' )|| S1.code || gen( 'goto' S.next ) || gen( C.false':' ) || S2.code
国家精品课程
——
19
《编译原理》
静态存储分配无法克服的问题2
递归调用问题
栈式存储分配
特点
嵌套调用次序 先进后出 生存期限于本次调用 自动释放
www.bjut.edu.cn
国家精品课程
——
20
《编译原理》
栈(Stack)式存储分配
用途
活动记录——栈单元对应 一次过程调用所需存储 过程的局部数据区
过程调用时计算实参(Actual),将值存到活动记录 形参 (Formal) 与活动记录的实参绑定,运行时将形参 作为局部变量使用 实际参数A A 调用者 形式参数X
单向传值
A的值 被调用者 直接使用
www.bjut.edu.cn
国家精品课程
——
25
《编译原理》
引用调用 Call-by-Reference/Address
www.bjut.edu.cn
国家精品课程
——
3
《编译原理》
8.1 绑定(Binding)
Binding的概念
将符号名和相应目标数据(的地址)对应起来
标识符与数据目标的对应
变量名──数据存储单元地址 过程名、函数名──程序段入口地址
相关问题
变量和过程的作用域,决定绑定的有效期
www.bjut.edu.cn
国家精品课程
——
17
《编译原理》
上次课主要内容
运行环境 绑定:静态、动态 静态分配——分层分配法 动态分配
层次单元法
每个分程序、过程都有一个层次单元,用来存放当前可 以用于分配的地址
www.bjut.edu.cn
18
嵌套式程序 begin 6+ program layer 6+ real x,y,z int a,b,c x=a 6+12+* procedure Sub1(x,y,z) 6+12+ int x,y,z y=x*2+b procedure add(a,b) z=1/y real a,b begin begin int a,b,c Real x,y,z 6+12+6+ …… P P1 2 P x=a begin P 6+12+6+ 3 y=x*2+b z=1/y S1 S2 char name,from,a …… 6+12+6+3+ P end end begin …… …… end end 6+12+ procedure Sub2(x,y) 6+12+ …… …… Sub2(x,y) P4 begin …… …… 6+12+* end sub1(a1,a2,a3) …… 标准单元6+12+ * end
国家精品课程
——
11
《编译原理》
静态存储分配策略介绍
顺序分配算法
按照程序段出现的先后顺序逐段分配
1/22 2/15 3/18 程序段 区域 1 0~21 2 22~36 3 37~54 4 55~71 5 72~94 6 95~104 共需要105个存储单元 能用更少的空间么?
www.bjut.edu.cn
C.true S1.begin
C.code
C.false
C.false := S.next;
wenku.baidu.comS.code := gen( S.begin':' ) || C.code ||
S1.code goto S.begin S.next
gen( C.true':' ) || S1.code ||
gen( 'goto'S.begin )
活动记录
活动记录
活动记录
运行栈
www.bjut.edu.cn
21
数组存储区
活动记录组织 示例——过程
数据区结构
本 过 程 所 辖 分 程 序 存 储 区
……
第 一 层 分 程 序 临时工作单元 局部数组说明 局部变量 分程序TOP
SPn
SPn-1
……
本过程Display
SP1
SPn为第n 层过程数 据区首址
国家精品课程
——
14
《编译原理》
静态存储分配无法克服的问题1
动态数组问题
层次单元法
• 层次单元
–进入分程序:将直接外层分程序的层次单元内容植入本层 层次单元
• 标准单元的使用
–调用语句:将本层层次单元内容送标准单元 –过程说明:将标准单元内容送本层层次单元
www.bjut.edu.cn
国家精品课程
SP
形式单元(m+1个)
连 接 数 据 主调分程序TOP 全局Display地址 返回地址 主调过程SP
SP0
本过程TOP
国家精品课程
——
22
《编译原理》
静态存储分配无法克服的问题3
被调用者的生存期超过调用者/局部数据需要保 留( save )
堆式存储分配
www.bjut.edu.cn
国家精品课程
局部数据区中的一个栈单元 ——活动记录(静态/动态分配)
栈
堆
www.bjut.edu.cn
9
国家精品课程
——
10
《编译原理》
静态存储分配
特点
编译时刻确定存储位置
访问效率高
主要用途
子程序的目标代码段
全局数据目标(全局变量)
??用什么样的算法实现静态存储分配
www.bjut.edu.cn
• 层次单元法
• 栈式(Stack)存储分配策略
• 堆式(Heap)存储分配策略
www.bjut.edu.cn
国家精品课程
——
《编译原理》
运行时刻的内存划分
数组区 临时工作单元区 简单变量区
代码段 全局静态数据
形式单元区 寄存器保护区 返回地址
动态(Dynamic)绑定
运行时指定(具体地址/相对地址) 回忆:动态数组
www.bjut.edu.cn
国家精品课程
——
7
《编译原理》
过程/函数名的绑定
为过程指定程序代码段入口地址 静态绑定:编译时指定相对地址
(词法分析:在符号表中建立过程的表项)
语义分析:构造目标代码,填写过程的入口地址 如:函数、子程序
www.bjut.edu.cn
4
分段式程序 Program layer Int a,b,c Begin …… Sub(a+b,b,a) …… End Subroutine sub(x,y,z) Real a,b,c Begin …… End
嵌套式程序 Program layer Int a,b,c Procedure sub1(x,y,z) Int x,y,z Procedure add(a,b) Real a,b Begin Real x,y,z x=a y=x*2+b z=1/y End Begin …… End Procedure sub2(x,y) …… Begin …… end
C.true S1.begin
S1.code
goto S.next
S2.begin S2.code S.next
www.bjut.edu.cn
国家精品课程
——
16
《编译原理》
上次课主要内容
S.begin S → while C do S1翻译
S.begin := S1.next := newlabel; C.true := S1.begin := newlabel;
1
第8章 运行环境
(Run-Time Enviroments)
国家精品课程
——
2
《编译原理》
主要内容
绑定(Binding)
存储(Storage)组织(Organization)与分配 (Allocation) 参数(Parameter)传递(Passing) 过程说明与调用 符号表(Symbol Table)管理
——
23
《编译原理》
堆(Heap)式存储分配
用于动态数据结构
存储空间的动态分配和释放
实现方法
将内存空间分为若干块,根据用户要求分配 无法满足时,调用无用单元收集程序将被释放的块收 集起来重新分配
www.bjut.edu.cn
国家精品课程
——
24
《编译原理》
8.3 参数传递
传值调用 call-by-value
如果实参 (地址 )具有左值,则存放其左值到活动记录中 ;否则计算出表达式的值,将此值存入一个单元,并将 该单元的地址传给被调用者
实参A
A 传地址
形参 X A的地址
调用者 被调用者间址访问实参 A
www.bjut.edu.cn
国家精品课程
——
26
《编译原理》
复制恢复 Copy-Restore
将参数的左、右值同时传给被调用者,被调用 者直接使用右值,并将计算结果按照左值返回 给调用者
2
1
17~31
41~62
www.bjut.edu.cn
思考:如何设计分配算法?
共需要63个存储单元
13
嵌套式程序 begin program layer real x,y,z int a,b,c x=a procedure Sub1(x,y,z) int x,y,z y=x*2+b procedure add(a,b) z=1/y real a,b begin begin int a,b,c Real x,y,z …… P 2 x=a P1 P begin P 3 y=x*2+b z=1/y S1 S2 char name,from,a …… P end end begin …… …… end end procedure Sub2(x,y) …… …… Sub2(x,y) P4 begin …… …… end sub1(a1,a2,a3) 嵌套分程序 …… 嵌套过程 end
4/17
6/10
5/23
程序段之间的调用关系
程序段号/所需数据空间
国家精品课程
——
12
《编译原理》
分层分配算法
允许程序段之间的覆盖(覆盖可能性分析)
1/22 2/15 3/18 7/80
程序段
6 5 4
区域
0~9 0~22 0~16 23~40
4/17
6/10
5/23
3
原始总存储需求=105个存储单元
www.bjut.edu.cn
28
主程序 A:=2; B:=3; P(A+B, A, A);
子程序 P(X,Y,Z); {Y:=Y+1;
换名 A:=A+1=3 A:=A+A+B=3+3 +3 9
Print A
Z:=Z+X}
复制恢复:
临时单元: T:A+B=5
X=T=5,Y=Z=A=2
传地址:
X=T=5,Y=Z=A =2
动态绑定
运行时指定——函数名作为形式参数(formals) 如:函数指针、虚函数(C++)
www.bjut.edu.cn
国家精品课程
——
8
《编译原理》
8.2 存储组织与分配(P257)
主要内容
运行时刻的内存划分(Partition)
局部数据的静态分配(Static Allocation)
国家精品课程
——
5
《编译原理》
绑定的时机与策略
语言定义的标识符的生存期决定最终绑定的时 机
全局变量:全程有效——程序装入时 局部变量:分段有效——进入过程或分程序时
www.bjut.edu.cn
国家精品课程
——
6
《编译原理》
变量名的绑定
静态(Static)绑定
编译时指定(相对地址) 词法分析期间——在符号表中建立变量的表项 回忆:说明语句的语义分析中的字节数计算,填写变量地址( enter)
Y:=Y+1=3 Z:=Z+X=2+5=7
Y
传值调用: 2 Z 7
A=3
A=7
A:=A+1=2+1
A:=A+T=3+5 8
国家精品课程
——
29
《编译原理》
8.4 过程调用
过程(procedure)
子程序(subroutine)、函数(function)
过程的定义与调用
形参和实参的结合:参数计算与传递 调用与返回
实际参数A 形式参数X
A
调用者
传值/传地址
A的地址 A的值
被调用者
www.bjut.edu.cn
国家精品课程
——
27
《编译原理》
传名调用Call-by-Name
将被调过程的过程体复制到调用处,并将每一 个形参“文字地”替换成实参 用换名子程序实现Thunk 是一种早期的语言ALGOL用的一种参数传递 方式
www.bjut.edu.cn
国家精品课程
——
30
《编译原理》
工作方式
调用方:当前环境的保存与恢复 被调方:构造环境,参数绑定
Main( ) { Sub1( x ) { Sub2( x + 1 ) } } Sub2( y ) { Sub3( )
——
15
《编译原理》 C.code C.false
上次课主要内容
S → if C then S1 else S2 的 翻译
C.true := newlabel; C.false := newlabel; S1.next := S2.next := S.next; S.code := C.code || gen( C.true':' )|| S1.code || gen( 'goto' S.next ) || gen( C.false':' ) || S2.code
国家精品课程
——
19
《编译原理》
静态存储分配无法克服的问题2
递归调用问题
栈式存储分配
特点
嵌套调用次序 先进后出 生存期限于本次调用 自动释放
www.bjut.edu.cn
国家精品课程
——
20
《编译原理》
栈(Stack)式存储分配
用途
活动记录——栈单元对应 一次过程调用所需存储 过程的局部数据区
过程调用时计算实参(Actual),将值存到活动记录 形参 (Formal) 与活动记录的实参绑定,运行时将形参 作为局部变量使用 实际参数A A 调用者 形式参数X
单向传值
A的值 被调用者 直接使用
www.bjut.edu.cn
国家精品课程
——
25
《编译原理》
引用调用 Call-by-Reference/Address
www.bjut.edu.cn
国家精品课程
——
3
《编译原理》
8.1 绑定(Binding)
Binding的概念
将符号名和相应目标数据(的地址)对应起来
标识符与数据目标的对应
变量名──数据存储单元地址 过程名、函数名──程序段入口地址
相关问题
变量和过程的作用域,决定绑定的有效期
www.bjut.edu.cn
国家精品课程
——
17
《编译原理》
上次课主要内容
运行环境 绑定:静态、动态 静态分配——分层分配法 动态分配
层次单元法
每个分程序、过程都有一个层次单元,用来存放当前可 以用于分配的地址
www.bjut.edu.cn
18
嵌套式程序 begin 6+ program layer 6+ real x,y,z int a,b,c x=a 6+12+* procedure Sub1(x,y,z) 6+12+ int x,y,z y=x*2+b procedure add(a,b) z=1/y real a,b begin begin int a,b,c Real x,y,z 6+12+6+ …… P P1 2 P x=a begin P 6+12+6+ 3 y=x*2+b z=1/y S1 S2 char name,from,a …… 6+12+6+3+ P end end begin …… …… end end 6+12+ procedure Sub2(x,y) 6+12+ …… …… Sub2(x,y) P4 begin …… …… 6+12+* end sub1(a1,a2,a3) …… 标准单元6+12+ * end
国家精品课程
——
11
《编译原理》
静态存储分配策略介绍
顺序分配算法
按照程序段出现的先后顺序逐段分配
1/22 2/15 3/18 程序段 区域 1 0~21 2 22~36 3 37~54 4 55~71 5 72~94 6 95~104 共需要105个存储单元 能用更少的空间么?
www.bjut.edu.cn
C.true S1.begin
C.code
C.false
C.false := S.next;
wenku.baidu.comS.code := gen( S.begin':' ) || C.code ||
S1.code goto S.begin S.next
gen( C.true':' ) || S1.code ||
gen( 'goto'S.begin )
活动记录
活动记录
活动记录
运行栈
www.bjut.edu.cn
21
数组存储区
活动记录组织 示例——过程
数据区结构
本 过 程 所 辖 分 程 序 存 储 区
……
第 一 层 分 程 序 临时工作单元 局部数组说明 局部变量 分程序TOP
SPn
SPn-1
……
本过程Display
SP1
SPn为第n 层过程数 据区首址
国家精品课程
——
14
《编译原理》
静态存储分配无法克服的问题1
动态数组问题
层次单元法
• 层次单元
–进入分程序:将直接外层分程序的层次单元内容植入本层 层次单元
• 标准单元的使用
–调用语句:将本层层次单元内容送标准单元 –过程说明:将标准单元内容送本层层次单元
www.bjut.edu.cn
国家精品课程
SP
形式单元(m+1个)
连 接 数 据 主调分程序TOP 全局Display地址 返回地址 主调过程SP
SP0
本过程TOP
国家精品课程
——
22
《编译原理》
静态存储分配无法克服的问题3
被调用者的生存期超过调用者/局部数据需要保 留( save )
堆式存储分配
www.bjut.edu.cn
国家精品课程
局部数据区中的一个栈单元 ——活动记录(静态/动态分配)
栈
堆
www.bjut.edu.cn
9
国家精品课程
——
10
《编译原理》
静态存储分配
特点
编译时刻确定存储位置
访问效率高
主要用途
子程序的目标代码段
全局数据目标(全局变量)
??用什么样的算法实现静态存储分配
www.bjut.edu.cn