- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章运行时存储空间的组织及管理
PAGE
PAGE 1
第六章 运行时存储空间的组织和管理
在这一章,我们把过程和函数这样的程序单元统称为过程,运行时过程的一次执行称为过程的一次活动,过程的每次调用引起它的一个活动。过程的活动需要可执行代码和存放所需信息的存储空间,后者通常用一块连续的存储区来管理,称为活动记录。在考虑代码生成之前,我们需要把静态的程序正文和运行时的活动联系起来,考察名字和数据对象之间的关系。我们在本章不仅要讨论一个活动记录中的数据安排,还有讨论一个程序执行过程中,所有活动记录的组织方式。
由于过程可以递归,在程序运行中某一时刻,可能有多个活跃着的活动与一个过程对应。因此递归过程中的一个变量可以表示目标机器上不同的数据对象,虽然某一时刻,只有一个这样的对象是可访问的。这是一个影响存储分配策略的重要语言特征。影响存储分配策略的语言特征有如下一些:
(1)过程能否递归;
(2)当控制从过程的活动返回时,局部变量的值是否要保留;
(3)过程能否访问非局部变量;
(4)过程调用的参数传递方式;
(5)过程能否作为参数被传递;
(6)过程能否作为结果值传递;
(7)存储块能否在程序控制下动态地分配;
(8)存储块是否必须显式地释放。
语言编译器组织运行时的存储空间和把名字绑定到数据单元的方式,在很大程度上取决于对上述问题的回答,也是本章的讨论中重点要解决的问题。
6.1 局部存储分配策略
本节讨论一个过程活动所需信息的存储分配,我们先回顾和这个存储分配有关的语言概念,然后介绍活动记录中的数据安排,最后介绍对过程中并列的程序块实行重叠分配的办法。
6.1.1 过程
过程定义是一个声明,它的最简单形式是将一个名字和一个语句联系起来。该名字是过程名,而这个语句是过程体。在大多数语言中,返回值的过程叫做函数,完整的程序也可以看作一个过程。
当过程名出现在调用语句中时,我们就说这个过程在该点被调用。过程调用就是执行被调用过程的过程体。过程调用也可以出现在表达式中,这时也叫做函数调用。
出现在过程定义中的某些名字是特殊的,它们被称为该过程的形式参数(或形参)(C语言称它们为形式变元,Fortran语言称它们为哑变元)。称为实在参数(或实参)的变元传递给被调用过程,它们取代过程体中的形式参数。建立实参和形参对应的方法在6.4节讨论。图6.1是一个完整的Pascal程序,除了主过程外,它还有3个过程嵌在主过程中。
过程体的每次执行叫做该过程的一个活动。过程p的一个活动的生存期是从过程体开始执行到执行结束的时间,包括消耗在执行被p调用的过程时的时间,以及再由这样的过程调用过程所花的时间等等。一般而言,术语“生成期”涉及程序执行期间的连续的步序列。
6.1.2 名字的作用域和绑定
语言中的声明是把信息联系到名字的一种语法结构。名字的声明可以是显式的,例如Pascal的程序段:
var i: integer;
声明也可以是隐式的,例如Fortran程序中,若无其它声明的话,以字母I开始的变量名代表整型变量。
program sort(input, output);
var a: array[0..10] of integer;
procedure readarray;
var i: integer;
begin
for i:=1 to 9 to read(a[i])
end;
function partition(y, z: integer): integer;
var i, j, x, y: integer;
begin
. . .
end;
procedure quikesort(m, n: integer);
var i: integer;
begin
if (n m) then begin
i:= partition(m, n);
quikesort(m, i-1);
quikesort(i+1,n);
end
end;
begin
a[0] := -9999;
a[10] := 9999;
readarray;
quikesort(1, 9)
end.
图6.1 读入整数并排序的Pascal程序
在程序的不同部分可能有同一名字的互相独立的声明,语言的作用域规则规定了该名字的哪个声明应用到程序正文中该名字的出现。图6.1的Pascal程序中,i在3个过程中都有声明,但它们的使用互相独立。
一个声明起作用的程序部分称为该声明的作用域。过程中出现的名字,如果是在该过程的一个声明的作用域内,那么这个出现称为局部于该过程的;否则叫做非
原创力文档


文档评论(0)