编译原理运行时存储空间组织陈火旺版.ppt
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
局部数据区(局部变量、内情向量、临时单元)
TOP→ 临时单元 内情向量 局部变量 形式单元 静态链 动态链
SP→ 返回地址
局部数据区 连接数据
三.存储分配策略
静态存储分配 在编译时对所有数据对象分配固定的存储单元 (FORTRAN) 且在运行时始终保持不变 栈式 在运行时把存储器作为一个栈进行管理,运行 时每当调用一个过程,它所需空间就动态分配于 栈顶,一旦退出,所占空间予以释放(C,Pascal)
故返回P:=x+y ,即Z=4.
例2.(上海交通大学)假定下列程序在语法上是正确的。 Program text (input,output); Var i,j:integer procedure cal (x,y:integer); begin y:=y**2; x:=x-y; y:=y-x; end ; {cal} begin {main} i:=2 ; j:=3; cal(i, j); writeln(j:1) end {main} 采用哪种参数传递方式使上述程序打印16,采用哪种 方式使程序结果为3 传地址、传名 传值
例1.(清华大学 考研试题) 在下面的函数P中,参数x是通过地址传递的,参数y通过 值传递
FUNCTION P(VAR x:integer ; y:integer) : integer; BEGIN K:=3; L:=5; P:=x+y
END; 若P由下列程序调用
K:=1;
L:=1;
Z:=P(K,L) 则问Z的值是什么,这两种参数传递机制如何实现?
解:当传值时,在调用段对参数进行的修改在主程序 段中不对参数实际值造成影响,而传地址时,在 调用段对参数的修改就实际改变了参数值 x传地址 y传值 Z:=P(K,L) K地址传到调用段。K:=3即x:=3 y只是L的值,过程体中L:=5不改变y的值 故此时 x=3,y仍为1。 所以P:=x+y,即为P:=3+1=4。
第九章 运行时存储空间组织
9.1 目标程序运行时的活动 9.2 运行时存储器的划分 9.3 静态存储分配 9.4 简单的栈式存储分配 9.5 嵌套过程语句的栈式实现 9.6 堆式动态存储分配 复习题
9.1 目标程序运行时的活动 一、过程的活动
一个过程的活动指的是该过程的一 次执行。即每次执行一个过程体产生该 过程体的一个活动。
活动的生存期:从执行某过程体第一步 操作到最后一步操作之间的操作序,包 括执行该过程体时调用其它过程花费的 时间。
二、参数传递 1.参数
形式参数(形参,哑元) 实在参数(实参) 2. 参数传递途径 传地址 传值 传名 得结果
1.传地址
把实参地址传给相应形参,在过程段中每个形参都 有一个相应单元,称为形式单元,用来存放实参地址, 过程体对形参的任何引用或赋值都被处理成对形式单 元的间接访问。
2.传值
调用段把实参值计算出来并存放在一个被调用段可 以拿得到的地方,被调用段开始工作时,首先把这些 值抄进自己的形式单元之中,然后就好象使用局部名 一样使用这些形式单元,若实参不为指针,在这种情 况下被调用段无法改变实参的值。
3. 得结果
每个形参对应有两个单元,第一个单元存放实参地址, 第二个单元存放实参的值,在过程体中对形参的任何引 用或赋值都看成是对它的第二个单元的直接访问,但在 过程工作完成返回前必须把第二个单元的内容存放到第 一个单元所指的那个实参单元中
add_z add_a add_a
z_val 4
4
z:=z+x =9+4=13
9.2 运行时存储器的划分 一.运行时存储器的划分
FORTRAN 语言 目标代码 静态数据 栈 ↑ ↓ 堆
C/C++ 代码区 静态/全局数据区 栈区 堆区
二.活动记录
活动记录:为了管理过程在一次执行中所需 要的信息,使用一个连续的存储块。这个 连续的存储块称为活动记录。 活动记录内容: 连接数据 (返回地址、动态链、静态链) 形式单元
4. 传名(替换规则)
过程调用的作用相当于把被调用段的过程体抄到调 用出现的位置,把其中任一出现的形式参数都替换成相 应的实在参数,为了表现实在参数的整体性,必需时在 替换前先把它用括号括起来。
实现方法:在进入被调用段之前不对实在参数预先进行 计值,而是让过程体中每当使用到相应形参时才逐次对 它实行计值。通常把实参处理成一个子程序,每当过程 体中使用到相应形参就调用这个子程序。
分析: 传名: a:=a+2=6
a:=a+a+b=6+6+5=17 传地址:a:=a+2=6
a:=9+6=15 传值:a=4
得结果:
调用者数据区: 被调用者
add_a 4
add_x T
T
add_b 5
x_val 9
9
(a+b)临时单元T 9 add_y add_a add_a
y_val 4 y:=y+2 6
动态存储分配 堆式 在运行时把存储器组织成堆结构,以便用户关 于存储空间的释放与申请,凡申请者从堆中分给 一块,凡释放者退回给堆(C/C++,Pascal)
本节略
复习题 1. 参数传递途径种类 2. 活动记录概念及主要内容 3. 存储分配策略有哪些,分别怎样实现? 4. P270 9
例3.对于下面的程序,若参数传递办法分别为传名, 传地址,传值,得结果,那么程序执行时所输出的a 分别是多少? Procedure P(x,y,z); Begin y:=y+2; z:=z+x; end;
begin a:=4; b:=5; P(a+b,a,a); Print a
End;
解:程序执行时所输出的a对应传名、传地址、 传值、得结果分别是17,15,4,13。
TOP→ 临时单元 内情向量 局部变量 形式单元 静态链 动态链
SP→ 返回地址
局部数据区 连接数据
三.存储分配策略
静态存储分配 在编译时对所有数据对象分配固定的存储单元 (FORTRAN) 且在运行时始终保持不变 栈式 在运行时把存储器作为一个栈进行管理,运行 时每当调用一个过程,它所需空间就动态分配于 栈顶,一旦退出,所占空间予以释放(C,Pascal)
故返回P:=x+y ,即Z=4.
例2.(上海交通大学)假定下列程序在语法上是正确的。 Program text (input,output); Var i,j:integer procedure cal (x,y:integer); begin y:=y**2; x:=x-y; y:=y-x; end ; {cal} begin {main} i:=2 ; j:=3; cal(i, j); writeln(j:1) end {main} 采用哪种参数传递方式使上述程序打印16,采用哪种 方式使程序结果为3 传地址、传名 传值
例1.(清华大学 考研试题) 在下面的函数P中,参数x是通过地址传递的,参数y通过 值传递
FUNCTION P(VAR x:integer ; y:integer) : integer; BEGIN K:=3; L:=5; P:=x+y
END; 若P由下列程序调用
K:=1;
L:=1;
Z:=P(K,L) 则问Z的值是什么,这两种参数传递机制如何实现?
解:当传值时,在调用段对参数进行的修改在主程序 段中不对参数实际值造成影响,而传地址时,在 调用段对参数的修改就实际改变了参数值 x传地址 y传值 Z:=P(K,L) K地址传到调用段。K:=3即x:=3 y只是L的值,过程体中L:=5不改变y的值 故此时 x=3,y仍为1。 所以P:=x+y,即为P:=3+1=4。
第九章 运行时存储空间组织
9.1 目标程序运行时的活动 9.2 运行时存储器的划分 9.3 静态存储分配 9.4 简单的栈式存储分配 9.5 嵌套过程语句的栈式实现 9.6 堆式动态存储分配 复习题
9.1 目标程序运行时的活动 一、过程的活动
一个过程的活动指的是该过程的一 次执行。即每次执行一个过程体产生该 过程体的一个活动。
活动的生存期:从执行某过程体第一步 操作到最后一步操作之间的操作序,包 括执行该过程体时调用其它过程花费的 时间。
二、参数传递 1.参数
形式参数(形参,哑元) 实在参数(实参) 2. 参数传递途径 传地址 传值 传名 得结果
1.传地址
把实参地址传给相应形参,在过程段中每个形参都 有一个相应单元,称为形式单元,用来存放实参地址, 过程体对形参的任何引用或赋值都被处理成对形式单 元的间接访问。
2.传值
调用段把实参值计算出来并存放在一个被调用段可 以拿得到的地方,被调用段开始工作时,首先把这些 值抄进自己的形式单元之中,然后就好象使用局部名 一样使用这些形式单元,若实参不为指针,在这种情 况下被调用段无法改变实参的值。
3. 得结果
每个形参对应有两个单元,第一个单元存放实参地址, 第二个单元存放实参的值,在过程体中对形参的任何引 用或赋值都看成是对它的第二个单元的直接访问,但在 过程工作完成返回前必须把第二个单元的内容存放到第 一个单元所指的那个实参单元中
add_z add_a add_a
z_val 4
4
z:=z+x =9+4=13
9.2 运行时存储器的划分 一.运行时存储器的划分
FORTRAN 语言 目标代码 静态数据 栈 ↑ ↓ 堆
C/C++ 代码区 静态/全局数据区 栈区 堆区
二.活动记录
活动记录:为了管理过程在一次执行中所需 要的信息,使用一个连续的存储块。这个 连续的存储块称为活动记录。 活动记录内容: 连接数据 (返回地址、动态链、静态链) 形式单元
4. 传名(替换规则)
过程调用的作用相当于把被调用段的过程体抄到调 用出现的位置,把其中任一出现的形式参数都替换成相 应的实在参数,为了表现实在参数的整体性,必需时在 替换前先把它用括号括起来。
实现方法:在进入被调用段之前不对实在参数预先进行 计值,而是让过程体中每当使用到相应形参时才逐次对 它实行计值。通常把实参处理成一个子程序,每当过程 体中使用到相应形参就调用这个子程序。
分析: 传名: a:=a+2=6
a:=a+a+b=6+6+5=17 传地址:a:=a+2=6
a:=9+6=15 传值:a=4
得结果:
调用者数据区: 被调用者
add_a 4
add_x T
T
add_b 5
x_val 9
9
(a+b)临时单元T 9 add_y add_a add_a
y_val 4 y:=y+2 6
动态存储分配 堆式 在运行时把存储器组织成堆结构,以便用户关 于存储空间的释放与申请,凡申请者从堆中分给 一块,凡释放者退回给堆(C/C++,Pascal)
本节略
复习题 1. 参数传递途径种类 2. 活动记录概念及主要内容 3. 存储分配策略有哪些,分别怎样实现? 4. P270 9
例3.对于下面的程序,若参数传递办法分别为传名, 传地址,传值,得结果,那么程序执行时所输出的a 分别是多少? Procedure P(x,y,z); Begin y:=y+2; z:=z+x; end;
begin a:=4; b:=5; P(a+b,a,a); Print a
End;
解:程序执行时所输出的a对应传名、传地址、 传值、得结果分别是17,15,4,13。