第七章运行时存储空间组织.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章运行时存储空间组织

编译原理 第九章 运行时存储空间组织 /cp 网上教学系统: 070606302: 编译原理 第九章 运行时存储空间组织 9.1 目标程序运行时的活动 以Pascal为例,假定程序由若干个过程组成 过程(procedure)定义 一个过程的活动指的是该过程的一次执行 过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序,包括执行P时调用其它过程花费的时间 过程可以是递归的 (1) program sort(input, output) (2) var a: array[0..10] of integer; (3) procedure readarray; (4) var i: integer; (5) begin (6) for i:=1 to 9 do read(a[i]) (7) end; (8) function partition(y, z:integer):integer; (9) var i:integer; (10) begin ...... (11) end; (12) procedure quicksort(m, n:integer); (13) var i:integer; (14) begin (15) if (nm) then begin (16) i:=partition(m, n ); (17) quicksort(m, i-1 ); (18) quicksort(i+1, n ) (19) end; (20) end; (21) begin (22) a[0]:=-9999; a[10]:=9999; (23) readarray; (24) quicksort(1, 9 ) (25) end. 参数传递 过程是模块程序设计的主要手段,同时也是节省程序代码和扩充语言的主要途径。 过程定义: procedure add(x,y:integer; var z:integer) begin z:=x+y; end; 过程调用 add(a,b,c); 参数传递方式 一. 传地址 把实在参数的地址传递给相应的形式参数 方法: 调用段预先把实在参数的地址传递到被调用段可以拿到的地方; 程序控制转入被调用段之后,被调用段首先把实在参数的地址抄进自己相应的形式单元中; 过程体对形式参数的引用域赋值被处理成对形式单元的间接访问。 PASCAL的变量参数方式 procedure swap (var m:integer; var n: integer); var i:integer; begin i:=m; m:=n; n:=i; end 参数传递方式 二.得结果 传地址的一种变形 方法: 每个形参对应两个形式单元,第一个形式单元存放实参地址,第二个单元存放实参的值。 在过程体中对形式参数的任何引用或赋值都看作对它的第二个单元的直接访问。 过程完成返回前把第二个单元的内容存放到第一个单元所指的实参单元中。 有些Fortran采用这种方式; 参数传递方式 三.传值 把实在参数的值传递给相应的形式参数 方法: 调用段预先把实在参数的的值计算出来并放在被调用段可以拿到的地方; 被调用段开始工作时,首先把实参的值抄入形式参数相应的单元; 被调用段中,象引用局部数据一样引用形式单元。 PASCAL的值参数 参数传递方式 四.传名 过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把其中任一出现的形式参数都替换成相应的实参。 方法: 在进入被调用段的之前不对实在参数预先进行计值,而是让过程体中每当使用到相应的形式参数时才逐次对它实行计值(或计算地址)。因此,通常把实在参数处理成一个子程序(称为参数子程序),每当过程体中使用到相应的形式参数时就调用这个子程序。 PROGRAM EX … var A:integer; PROCEDURE P(B:integer) … var A:integer; BEGIN A:=0; B:=B+1; A:=A+B; END; 例: … procedure P(w,x,y,z); begin y := y*w; z := z+x; end begin a := 5; b := 3; P(a+b,a-b,a,a); write(a); end 编译程序为了组织存储空间,必须考虑下面几个问题: 过程是否允许递归? 当控制从一个过程的活动返回时,对局部名称的值如何处

文档评论(0)

sunhao111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档