如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
6.4对非局部名字的访问讨论基于活动记录的栈式分配。一个语言所规定的作用域规则决定了如何处理对非局部名字的引用。有静态和动态两种作用域规则。静态:考查程序正文来决定引用的名字是哪一个名字说明,如Pascal,C和Ada是众多语言中使用带有“最近嵌套”规定的词法作用域规则的语言;动态:在运行时刻考查最近的活动来决定应用到一个名字上的说明,如LISP和APL。6.4.1块一个块(Block)是一个含有局部数据说明的语句。{declarationsstatements}一个块与另一个块要么是独立的,要么一个块完全嵌入在另一个块之中,这种嵌套的性质有时称作块结构。在块结构语言中,说明的作用域由最近嵌套规则给出:1.在块B中的一个说明的作用域包括B。2.如果名字x在块B中没有说明,那么,x在B中的出现是在一个外围块B中的x的说明的作用域之内,并且使得:(a)B中有x的说明,(b)B是包围B的,相对于其它任何具有名字x的说明且包围B的块而言,B是离B最近的。对于pascal语言来说,一个过程是一个块,一个程序是一个块结构。而对于c语言来说,每个函数是一个块结构,而函数之间是不嵌套的。main(){inta=0;/*B0-B2*/intb=0;/*B0-B1*/{intb=1;/*B1-B3*/{inta=2;printf(“%d%d/n”,a,b);}{intb=3;printf(“%d%d/n”,a,b);}printf(“%d%d/n”,a,b);}printf(“%d%d/n”,a,b);}a06.4.2不含嵌套过程的词法作用域C中过程定义不能嵌套(l)inta[11];(2)readarray(){…a…}(3)intpartition(y,z)inty,z;{…a…}(4)quicksort(m,n)intm,n;{.…..}(5)main(){...a...}图6.17带有a的非局部出现的C程序目标代码6.4.3含有嵌套过程的词法作用域图6.18带有嵌套过程的一个Pascal程序程序的静态嵌套结构:sortreadarrayexchangequicksortpartition(1)programsort(input,output);(2)vara:array[0..10]ofinteger;(3)x:integer;(4)procedurereadarray;(5)vari:integer;(6)begin…a…end{readarray};(7)procedureexchange(i,j:integer);(8)begin(9)x:=a[i];a[i]:=a[j];a[j]:=x(10)end{exchange};(11)procedurequicksort(m,n:integer);(12)vark,v:integer;(13)functionpartition(y,z:integer):integer;(14)vari,j:integer;(15)begin…a…(16)…V…(17)…exchange(i,j);…(18)end{partition};(19)begin…end{quicksort};(20)begin…end.{sort}程序的静态嵌套结构决定程序中每个过程中访问哪些外围过程中的数据。每个过程静态嵌套在哪些过程中,可用静态链static(p)表示:static(sort)=sortstatic(readarray)=sortreadarraystatic(exchange)=sortexchangestatic(quichsort)=sortquichsortstatic(partition)=sortquichsortpartition运行时,过程的数据被组织成活动记录,为了实现非局部访问,过程的活动记录之间必须维持静态链反映程序的静态嵌套结构。6.4.3.1嵌套深度用过程的嵌套深度来表达一个过程在程序中的嵌套层次。令主程序的嵌套深度为1;从一个过程进入到一个被包围过程时嵌套深度加1。如图6.18中的位于(11)行上的过程quicksort的嵌套深度为2,而(13)行上的partition的嵌套深度为3。过程表示除过程名字之外的过程定义正文。一个名字的嵌套深度等于说明它的过程的嵌套深度,是名字的重要属性。在(15)—(17)行上的partition中的a,v和i的嵌套深度分别是1,2和3。6.4.3.2存取链(accesslink)栈中的活动记录应反映源程序正文中过程之间的嵌套关系,或静态结构。为每一个活动记录增设一个称为存取链(或存取链路)的指针,如果在源程序正文中过程p直接