- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3 变量访问环境;声明链:声明链是过程名的序列,序列的头是主程序名M。具体定义如下:
(M)是过程声明链;
若(M,…,P)是声明链,且P中有过程Q的声明,则(M,…,P,Q)也是过程声明链。
用DeclareChain(Q)= (M,…,P,Q)表示声明链。
若Q的层数为N,则其声明链的长度为N+1;
对于任一过程Q,它的声明链是唯一的,并且在Q中出现的变量,其声明一定在DeclareChain(Q)中的过程内。; ;(当前)变量访问环境:Q的声明链中的每个过程的活跃活动记录构成的链称为Q的变量访问环境,记为:
VarVisitEnv(LAR(Q))
= [LAR(M), … , LAR(P), LAR(Q)] ;假设Q的变量访问环境:
VarVisitEnv(LAR(Q))
= [LAR(M),…,LAR(P),LAR(Q)]
在Q中有变量XQ,YM,ZP,它们分别定义在过程Q、M和P中,则它们的存储单元地址可表示如下(其中LAR(Q)表示LAR(Q)的始地址,其它类似):
addr( XQ )= LAR(Q) + OffsetX
addr( YM )= LAR(M) + OffsetY
addr ( ZP )= LAR(P) + Offsez
结论: 对于每个AR,只要知道了它的变量访问环境VarVisitEnv(AR),即可实现包括非局部变量在内的所有变量的访问。;PROC P;
… …
Begin
P
End;如何计算当前过程的变量访问环境;变量访问环境的实现方法;Display表:如果层数为N的过程P, 其AR(P)的变量访问环境为:
VarVisitEnv(AR(P))=[AR0,…,ARN],
ari表示ARi的始地址,则称:
[ar0,…,arN]
为AR(P)的Display表,其长度为N+1。
局部化Display表方法:对于每个AR求出其变量访问环境,并把它以地址表的形式(Display表)保存在AR中。因为每个AR都自带Display表,称这种方法为局部化Display表方法。;Display表的求法;局部Display表时变量的访问;例1:有过程M,Q,R,S,其中level(M)=0;level(Q)=1;level(R)=1;level(S)= 2,
并且CallChain(S)= (M,Q,R,S)。
;3.3 全局Display表;…………………………;;3.3 静态链的方法;AR1(G);Level(M)=0, Level(G)=1, Level(H)=2,Level(R)=3,Level(S)=3;使用静态链时变量的访问;总结;总结;4 地址分配原则回顾;抽象地址的变化规律 ;II.处理完函数首部:
处理前可用的 处理内容 处理后可用的
抽象地址 抽象地址
(?,off) ? Proc p() ? (?+1,off1)
(?,off) ? Func f():T ? (?+1,off1)
(?,off) ? Proc P() ? (?,off+2)(形式过程)
(?,off) ? Func F():T ? (?,off+2)(形式函数)
注:小写字母的标识符表示实在标识符,大写字母的标识符则表示形参标识符。nT 表示类型T的长度,off1表示处理完形参部分(实在过程首部)时的偏移值。 ;III. 处理形式参数:
(?,off)? Var ID:T ?(?,off+1)C语言:T *ID
(?,off)? ID:T ?(?, off+ nT ) C语言:T ID
IV.处理过程名及左括号之后:
(?,off)? Proc p( ?(?+1,d)
(?,off)? Func f( ?(?+1,d)
(?,off)? Proc P( ?(?+
文档评论(0)