资源描述:
《编译原理第九章 运行时存储空间组织.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理第九章运行时存储空间组织第九章运行时存储空间组织9.1目标程序运行时的活动以Pascal为例,假定程序由若干个过程组成过程(procedure)定义一个过程的活动指的是该过程的一次执行过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序,包括执行P时调用其它过程花费的时间过程可以是递归的(1)programsort(input,output)(2)vara:array[0..10]ofinteger;(3)procedurereadarray;(4)vari:integer;(5)begin(6)fori:=1to9doread(a[i]
2、)(7)end;(8)functionpartition(y,z:integer):integer;(9)vari:integer;(10)begin......(11)end;programsortprocedurereadarrayfunctionpartition(yprocedurequicksort(12)procedurequicksort(m,n:integer);(13)vari:integer;(14)begin(15)if(n>m)thenbegin(16)i:=partition(m,n);(17)quicksort(m,i-1);(18)quicks
3、ort(i+1,n)(19)end;(20)end;(21)begin(22)a[0]:=-9999;a[10]:=9999;(23)readarray;(24)quicksort(1,9)(25)end.programsortprocedurereadarrayfunctionpartition(yprocedurequicksort参数传递过程是模块程序设计的主要手段,同时也是节省程序代码和扩充语言的主要途径。过程定义:procedureadd(x,y:integer;varz:integer)beginz:=x+y;end;过程调用add(a,b,c);参数传递方式一
4、.传地址把实在参数的地址传递给相应的形式参数方法:调用段预先把实在参数的地址传递到被调用段可以拿到的地方;程序控制转入被调用段之后,被调用段首先把实在参数的地址抄进自己相应的形式单元中;过程体对形式参数的引用域赋值被处理成对形式单元的间接访问。PASCAL的变量参数方式procedureswap(varm:integer;varn:integer);vari:integer;begini:=m;m:=n;n:=i;endswap(a,b)把a,b的地址送到已知单元j1和j2中m:=j1;n:=j2;i:=m↑;m↑:=n↑;n↑:=i;参数传递方式二.得结果传地址的一种变形
5、方法:每个形参对应两个形式单元,第一个形式单元存放实参地址,第二个单元存放实参的值。在过程体中对形式参数的任何引用或赋值都看作对它的第二个单元的直接访问。过程完成返回前把第二个单元的内容存放到第一个单元所指的实参单元中。有些Fortran采用这种方式;参数传递方式三.传值把实在参数的值传递给相应的形式参数方法:调用段预先把实在参数的的值计算出来并放在被调用段可以拿到的地方;被调用段开始工作时,首先把实参的值抄入形式参数相应的单元;被调用段中,象引用局部数据一样引用形式单元。PASCAL的值参数参数传递方式四.传名过程调用的作用相当于把被调用段的过程体抄到调用出现的地方,但把
6、其中任一出现的形式参数都替换成相应的实参。方法:在进入被调用段的之前不对实在参数预先进行计值,而是让过程体中每当使用到相应的形式参数时才逐次对它实行计值(或计算地址)。因此,通常把实在参数处理成一个子程序(称为参数子程序),每当过程体中使用到相应的形式参数时就调用这个子程序。PROGRAMEX…varA:integer;PROCEDUREP(B:integer)…varA:integer;BEGINA:=0;B:=B+1;A:=A+B;END;BEGINA:=2;TA:=0;A:=A+1;TA:=TA+A;write(A);ENDBEGINA:=2;P(A);write(A
7、);END例:…procedureP(w,x,y,z);beginy:=y*w;z:=z+x;endbegina:=5;b:=3;P(a+b,a-b,a,a);write(a);end传值:传地址:得结果:传名:542777编译程序为了组织存储空间,必须考虑下面几个问题:过程是否允许递归?当控制从一个过程的活动返回时,对局部名称的值如何处理?过程是否允许引用非局部名称?过程调用时如何传递参数;过程是否可以做为参数被传递和做为结果被返回?存储空间可否在程序控制下进行动态分配?存储空间是否必须显式地释放?9.2运行时存