第九章运行时存储空间组织 9.1目标程序运行时的活动 ■ 以Pascal为例,假定程序由若干个过程组 成 口过程(procedure)定义 口一个过程的活动指的是该过程的一次执行 口过程P一个活动的生存期,指的是从执行该过 程体第一步操作到最后一步操作之间的操作序, 包括执行P时调用其它过程花费的时间 口过程可以是递归的 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 第九章 运行时存储空间组织 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; program sort (10) begin ..... procedure readarray (11) end; function partition(y procedure quicksort 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 (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; program sort procedure readarray function partition(y procedure quicksort
(12) procedure quicksort(m,n:integer); (13) var i:integer; (14) begin (15) if(n>m)then begin (16) i=partition(m,n)月 (17) quicksort(m,i-1): program sort (18) quicksort(i+1.n)】 procedure readarray (19) end; function partition(y (20) end; procedure quicksort (21) begin (22) a0]=-9999;a[10]=9999; (23) readarray; (24) quicksort(1,9) (25) end. 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 (12) procedure quicksort(m, n:integer); (13) var i:integer; (14) begin (15) if (n>m) 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. program sort procedure readarray function partition(y procedure quicksort
参数传递 过程是模块程序设计的主要手段,同时也 是节省程序代码和扩充语言的主要途径。 过程定义: procedure add(x,y:integer;var z:integer) begin Z:=x+y; end; ■过程调用 add(a,b,c); 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 参数传递 ◼ 过程是模块程序设计的主要手段,同时也 是节省程序代码和扩充语言的主要途径。 ◼ 过程定义: procedure add(x,y:integer; var z:integer) begin z:=x+y; end; ◼ 过程调用 add(a,b,c);
参数传递方式 一.传地址 ■ 把实在参数的地址传递给相应的形式参数 ■方法: 口调用段预先把实在参数的地址传递到被调用段 可以拿到的地方; ▣程序控制转入被调用段之后,被调用段首先把 实在参数的地址抄进自己相应的形式单元中; 口过程体对形式参数的引用域赋值被处理成对形 式单元的间接访问。 ■PASCAL的变量参数方式 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 参数传递方式 一. 传地址 ◼ 把实在参数的地址传递给相应的形式参数 ◼ 方法: 调用段预先把实在参数的地址传递到被调用段 可以拿到的地方; 程序控制转入被调用段之后,被调用段首先把 实在参数的地址抄进自己相应的形式单元中; 过程体对形式参数的引用域赋值被处理成对形 式单元的间接访问。 ◼ PASCAL的变量参数方式
procedure swap (var m:integer;var n:integer); var i:integer; begin i:=m; m:=n; n:=i; end ▣swap(a,b) 。把a,b的地址送到已知单元j1和i2中 m:=j1; n:=j2 ● i:=m个; m:=nf; 1饮;头学计算机系602教研室
国防科技大学计算机系602教研室 procedure swap (var m:integer; var n: integer); var i:integer; begin i:=m; m:=n; n:=i; end ❑ swap(a,b) • 把a,b的地址送到已知单元j1和j2中 • m:=j1; • n:=j2; • i:=m↑; • m↑:= n↑; • n↑:=i;
参数传递方式 二.得结果 ■传地址的一种变形 ■】 方法: 口每个形参对应两个形式单元,第一个形式单元 存放实参地址,第二个单元存放实参的值。 ▣在过程体中对形式参数的任何引用或赋值都看 作对它的第二个单元的直接访问。 口过程完成返回前把第二个单元的内容存放到第 一个单元所指的实参单元中。 ■有些Fortran采用这种方式; 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 参数传递方式 二.得结果 ◼ 传地址的一种变形 ◼ 方法: 每个形参对应两个形式单元,第一个形式单元 存放实参地址,第二个单元存放实参的值。 在过程体中对形式参数的任何引用或赋值都看 作对它的第二个单元的直接访问。 过程完成返回前把第二个单元的内容存放到第 一个单元所指的实参单元中。 ◼ 有些Fortran采用这种方式;
参数传递方式 三.传值 ■把实在参数的值传递给相应的形式参数 ·方法: 口调用段预先把实在参数的的值计算出来并放 在被调用段可以拿到的地方; 口被调用段开始工作时,首先把实参的值抄入 形式参数相应的单元; ▣被调用段中,象引用局部数据一样引用形式 单元。 ■ PASCAL的值参数 国防科技大学计算机系602教研室
国防科技大学计算机系602教研室 参数传递方式 三.传值 ◼ 把实在参数的值传递给相应的形式参数 ◼ 方法: 调用段预先把实在参数的的值计算出来并放 在被调用段可以拿到的地方; 被调用段开始工作时,首先把实参的值抄入 形式参数相应的单元; 被调用段中,象引用局部数据一样引用形式 单元。 ◼ PASCAL的值参数
参数传递方式 四.传名 ■过程调用的作用相当于把被调用段的过程 体抄到调用出现的地方,但把其中任一出 现的形式参数都替换成相应的实参。 ■方法: 口在进入被调用段的之前不对实在参数预先进 行计值,而是让过程体中每当使用到相应的 形式参数时才逐次对它实行计值(或计算地 址)。因此,通常把实在参数处理成一个子 程序(称为参数子程序),每当过程体中使 用到相应的形式参数时就调用这个子程序。 所科大学千机系602黄研
国防科技大学计算机系602教研室 参数传递方式 四.传名 ◼ 过程调用的作用相当于把被调用段的过程 体抄到调用出现的地方,但把其中任一出 现的形式参数都替换成相应的实参。 ◼ 方法: 在进入被调用段的之前不对实在参数预先进 行计值,而是让过程体中每当使用到相应的 形式参数时才逐次对它实行计值(或计算地 址)。因此,通常把实在参数处理成一个子 程序(称为参数子程序),每当过程体中使 用到相应的形式参数时就调用这个子程序
PROGRAM EX var A:integer; PROCEDURE P(B:integer) var A:integer; BEGIN A:=0; B:=B+1; A:=A+B; BEGIN END; A:=2; TA:=0; BEGIN A:=A+1; A:=2; TA:=TA+A; P(A)月 write(A); write(A); END END 算机系602教研室
国防科技大学计算机系602教研室 PROGRAM EX … var A:integer; PROCEDURE P(B:integer) … var A:integer; BEGIN A:=0; B:=B+1; A:=A+B; END; BEGIN A :=2; TA:=0; A:= A +1; TA:=TA+ A; write(A); END BEGIN A:=2; P(A); write(A); END