6.1利用Pascal的作用域规则,试确定在图6.31内的Pascal程序中的名字a和b的每一次出 现所应用的说明。 program a input,output ) procedure bi(u,v,x.y:integer ) vara:record a,b2:interger end; b:record b a:interger end begin with a do begin=vend with b;do begin a:=x ba:=y end; writeln (a.a,a:.b2,bs.a,bi.b) end: begin b(1,2,3,4) en 图6.31带有对于a和b的若干个说明的一个Pascal程序 解:图中用红色数字下标相应标明。 6,2试问在图6.32中的程序将有怎样的输出?分别假定: (a)传值调用(cal-by-value): (b)引用调用(cal-by-reference): (c)复制恢复(copy-restore): (d)传名调用(cal-by-name). rep(x.y.z) begin y:=y+l: =z+x: end. beg a=2 b=3: p(a+b,aa); print a nd 图632说明参数传递的一个示意性的程序 解:(a)2:(b)8:(c)7:(d)9. 6.3在一个嵌套过程被作为参数传递时,也同样可以使用词法作用域规则。在图6.33中的 Pascal程序中的第(6)一(7)行上的函数f有一个非局部名字m:这里m的所有出现都用 圆圈标出。在第(8)行上,过程c给m赋值为0,然后把r作为实在参数传递给b。试问 (a)在第(5)行上的m的说明的作用域是否包括第(2) 一(3)行上的b的过程体 (b)在b的过程体中,因为形式参数将被实在参数f所替代,语句writeln(h(2)激活 £,那么,这时打印出的结果是什么?进一步要问,我们如何为「的活动记录建立存取链呢? 回答是,作为一个参数被传递的嵌套过程必须携带它自己的存取链,如图6.34所示。当过
6.1 利用 Pascal 的作用域规则,试确定在图 6.31 内的 Pascal 程序中的名字 a 和 b 的每一次出 现所应用的说明。 program a1 ( input, output ) ; procedure b1( u, v, x, y : integer ) ; var a2 : record a3, b2 : interger end ; b3 : record b4, a4 : interger end ; begin with a2 do begin a3 := u ; b2 := v end ; with b3 do begin a4 := x ; b4 := y end ; writeln ( a2.a3, a2.b2, b3.a4, b3.b4 ) end ; begin b1 ( 1, 2, 3, 4 ) end. 图 6.31 带有对于 a 和 b 的若干个说明的一个 Pascal 程序 解:图中用红色数字下标相应标明。 6.2 试问在图 6.32 中的程序将有怎样的输出?分别假定: (a)传值调用(call-by-value); (b)引用调用(call-by-reference); (c)复制恢复(copy-restore); (d)传名调用(call-by-name)。 program main ( input, output ) ; procedure p ( x, y, z ) ; begin y := y + 1 ; z := z + x ; end ; begin a := 2 ; b := 3 ; p ( a + b , a, a ) ; print a end. 图 6.32 说明参数传递的一个示意性的程序 解:(a)2;(b)8;(c)7;(d)9。 6.3 在一个嵌套过程被作为参数传递时,也同样可以使用词法作用域规则。在图 6.33 中的 Pascal 程序中的第(6)—(7)行上的函数 f 有一个非局部名字 m;这里 m 的所有出现都用 圆圈标出。在第(8)行上,过程 c 给 m 赋值为 0,然后把 f 作为实在参数传递给 b。试问 (a)在第(5)行上的 m 的说明的作用域是否包括第(2)—(3)行上的 b 的过程体? (b)在 b 的过程体中,因为形式参数将被实在参数 f 所替代,语句 writeln ( h ( 2 ) ) 激活 f,那么,这时打印出的结果是什么?进一步要问,我们如何为 f 的活动记录建立存取链呢? 回答是,作为一个参数被传递的嵌套过程必须携带它自己的存取链,如图 6.34 所示。当过
程c传递f时,它为f确定一个存取链,正如它调用f一样。这个链和f一起传递给b。结果, 当£从h中被激活时,这个链被用来建立「的活动记最中的存取链。 (©)试模拟整个程序的执行,在执行过程中注意各种变量的存取 (1)program param input,output ) (2)procedure b(function h(n:integer )integer): (3) begin writeln(h(2 ))end b: procedure (5) var(m):integer ( function f(n:integer )integer (7) begin f:=(m)+nend (f) (8) begin (m):=0;b(f)endc) (9)begin 10 en 图6.33 一个存取链一定要和实在参数「一起被传递 图6.34实在过程参数f携带它的存取键 解:(a)不包括。 (b)打印出的结果是2。下图为运行栈,标明各过程的活动记录、存取链和控制链
程 c 传递 f 时,它为 f 确定一个存取链,正如它调用 f 一样。这个链和 f 一起传递给 b。结果, 当 f 从 b 中被激活时,这个链被用来建立 f 的活动记录中的存取链。 (c)试模拟整个程序的执行,在执行过程中注意各种变量的存取。 (1) program param ( input, output ) ; (2) procedure b ( function h ( n : integer ) : integer ) ; (3) begin writeln ( h ( 2 ) ) end { b } ; (4) procedure c ; (5) var (m) : integer ; (6) function f ( n : integer ) : integer ; (7) begin f := (m) + n end { f } ; (8) begin (m) := 0 ; b ( f ) end { c } ; (9) begin (10) c (11) end 图 6.33 一个存取链一定要和实在参数 f 一起被传递 图 6.34 实在过程参数 f 携带它的存取链 解:(a)不包括。 (b)打印出的结果是 2。下图为运行栈,标明各过程的活动记录、存取链和控制链。 access link param c access link m b parama c access link m b f n = 2 control link control link control link control link access link access link access link
(c)运行程序param一调用过程c一访问局部变量m,m赋值为0→调用过程b, 传递实在参数「调用过程传递实在参数2通过存取链访问变量(0,返回值 m+2(-2),过程f结束一打印2,过程b结束一过程c结束一程序param结束 6.4当一个过程作为参数被传递时,我们假定有以下三种与此相联系的环境可以考虑,图 6.35中的Pascal程序是用来说明这一问题的。一种是词法环境(lexical environment),如此 这样的一个过程的环境是由这一过程定义之处的各标识符的联编所构成:一种是传递环境 ironment),是由这 一过程作 参 数被传递之处的各标识符的联编所构成: 种是活动环爱是曲是由这装数活动之处的各标提符的肤销清的皮 试考虑在第(11)行上的作为一个参数被传递的函数f。利用对于f的词法环境、传递环境 和活动环境,在第(8)行上的非局部量m将分别处在第(6)行、(10)行和(3)行上的 m的说明的作用域中。 (c)试给出程序的输出。 (1)program param inout,output (2) procedure b(function h(n:integer):integer); (3) begin m;writeln(h(2))end (b (5)procedurec; var m'integer (7 function f(n:integer )integer beginf:=m+nend (f) procedurer (10 var m integer (11) beginm:=7:b(f)end (r (12 beginm:=0:rendc: (13)begin (14) (15)end 图6.35词法、传递和活动环境举例 解:(a)词法环境 parama a
(c)运行程序 param → 调用过程 c → 访问局部变量 m,m 赋值为 0 → 调用过程 b, 传递实在参数 f → 调用过程 f,传递实在参数 2 → 通过存取链访问变量 m(=0),返回值 m+2(=2),过程 f 结束 → 打印 2,过程 b 结束 → 过程 c 结束 → 程序 param 结束。 6.4 当一个过程作为参数被传递时,我们假定有以下三种与此相联系的环境可以考虑,图 6.35 中的 Pascal 程序是用来说明这一问题的。一种是词法环境(lexical environment),如此 这样的一个过程的环境是由这一过程定义之处的各标识符的联编所构成;一种是传递环境 (passing environment),是由这一过程作为参数被传递之处的各标识符的联编所构成;另一 种是活动环境(activation environment),是由这一过程活动之处的各标识符的联编所构成。 试考虑在第(11)行上的作为一个参数被传递的函数 f。利用对于 f 的词法环境、传递环境 和活动环境,在第(8)行上的非局部量 m 将分别处在第(6)行、(10)行和(3)行上的 m 的说明的作用域中。 (a)图示出每个过程的活动记录。 (b)试为此程序画出活动树。 (c)试给出程序的输出。 (1) program param ( inout, output ) ; (2) procedure b ( function h ( n : integer ) : integer ) ; (3) var m : integer ; (4) begin m := 3 ; writeln ( h ( 2 ) ) end { b } ; (5) procedure c ; (6) var m : integer ; (7) function f ( n : integer ) : integer ; (8) begin f := m + n end { f } ; (9) procedure r ; (10) var m : integer ; (11) begin m := 7 ; b ( f ) end { r } ; (12) begin m := 0 ; r end { c } ; (13) begin (14) c (15) end . 图 6.35 词法、传递和活动环境举例 解:(a)词法环境 parama control link access link c access link control link m r control link access link m b access link control link m f n = 2 control link access link
传递环境 parama 成 城 ae 活动环境 投 contolit (b)活动树 param b(f) f(2
传递环境 活动环境 (b)活动树 parama control link r n = 2 access link control link c access link access link m control link access link m b access link m f control link control link parama c access link access link access link b m f control link control link control link control link m m r control link access link n = 2 control link access link param c r b (f ) f (2)
(c)词法环境:2:传递环境:9:活动环境:5。 补充题:对以下的Pascal程序画出过程c第二次被激活时的运行栈,控制链和存取链。说明 在c中如何访问变量x。 program env; procedure a: var x:integer procedureb proceduree beginx:=2:bend; (procedurec) beginc end: procedure b begin bend; rocedurea (main 解: a c e画 wc 说明:©中沿若存取链向前走两步,到过程a的活动记录中就可以访问到变量x。 补:6.3题(b)问中的display表。 d param d[2] d31 Saved d[2] Saved d[2]. Saved d[3]
(c)词法环境:2;传递环境:9;活动环境:5。 补充题:对以下的 Pascal 程序画出过程 c 第二次被激活时的运行栈,控制链和存取链。说明 在 c 中如何访问变量 x。 program env ; procedure a ; var x : integer ; procedure b ; procedure c ; begin x := 2 ; b end ; {procedure c} begin c end ; {procedure b} begin b end ; {procedure a} begin a end . {main} 解: 说明:c 中沿着存取链向前走两步,到过程 a 的活动记录中就可以访问到变量 x。 补:6.3 题(b)问中的 display 表。 env a b control link control link x control link access link control link access link access link b access link c control link access link c access link control link param c b f d[1] d[2] d[3] Saved d[2] Saved d[2] Saved d[3]