- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6讲--运行时空间组织
第六讲 运行时存储空间组织; 编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来,弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。
在程序的执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。在程序语言中,程序使用的存储单元都是由标识符来表示的。它们对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。所以对于编译程序来说存储组织与管理是一个复杂而又十分重要的问题。这一章就是对目标程序运行时的活动和运行环境进行讨论,主要讨论存储组织与管理, 包括活动纪录的建立与管理、存储器的组织与存储分配的策略、非局部名称的访问等问题。 ;§1.目标程序运行时的活动; 所谓递归过程是指一个过程P,若在其过程体内又再次转向它自身;或者P调用了P1,而P1中又调用了P。源语言是否允许递归过程直接影响了存储空间的分配策略。
例如Fortran中不允许递归过程,不允许含可变体积的数据项或待定性质的名字,这就完全确定了Fortran语言的分配策略—静态分配,即在编译阶段就能完全确定程序中所需的存储空间以及各个数据项的位置。
而Algol中允许递归过程,还允许可变数组,这样一来就必须使用动态分配策略了。
调用过程与被调用过程之间的信息往来主要通过全局变量或者参数传递,下面我们就来回顾一下参数传递的几种方式。; 二、参数传递
1.传地址(call by address/reference):
把实在参数的地址传递给相应的形式参数。在过程段中,每个形式参数都有一个相应的存储单元:形式单元,用来存放相应的实在参数的地址。当调用一个过程时,调用段必须先把实在参数的地址传递到一个被调用段可以访问的地方。如果实在参数是个简单变量,则直接传递它的地址;如果它是表达式,那就先把它的值计算出来并存放在某一临时单元之中,然后传送这个临时单元的地址。
当程序控制转入被调用段后,被调用段首先把上述地址抄入自己的形式单元中,过程体对形式参数的任何引用或赋值都被处理成对形式单元的间接访问。; 2.传值(call by value):
调用过程计算实参的值,存放在一个被调用过程可以取到的地方。被调用过程执行时,首先将这些值抄入自己的形式单元中,然后就像使用局部变量一样使用这些形式单元。
如果实在参数不为指针,则在这种情况下被调用段无法改变实参的值。
例如,看下面的Pascal程序:
;(1)program reference(input,output);
(2)var a,b:integer;
(3)procedure swap({var} x,y:integer);
(4) var temp:integer;
(5) begin
(6) temp:=x;
(7) x:=y;
(8) y:=temp
(9) end;
(10)begin
(11) a:=1; b:=2;
(12) swap(a,b);
(13) writeln(‘a=’,a);writeln(‘b=’,b)
(14)end.
带有过程swap的PASCAL程序; procedure swap(x,y:integer); //传值
var temp:integer;
begin temp:=x; x:=y; y:=temp
end;
调用swap(a,b) 过程将不会影响a和b的值,其结果等价于执行下列运算:
x :=a;
y :=b;
temp :=x;
x :=y;
y :=temp
;procedure swap(x,y:integer);//传地址
var temp:integer;
begin
temp:=x; x:=y; y:=temp
end;
调用swap(i,a[i]),其结果等价于执行下列运算:
①把i,a[i]的地址分别放到x和y相应的单元a1,a2;
②temp的内容置为a1所指单元中存的内容;
③a1所指单元的内容置为a2所
文档评论(0)