非局部数据的访问
-
一个过程除了可以使用过程自身定义的 局部数据以外,还可以使用过程外定义的非局部数据。
-
语言可以分为两种类型
-
支持过程嵌套声明的语言
可以在一个过程中声明另一个过程,例:Pascal -
不支持过程嵌套声明的语言
不可以在一个过程中声明另一个过程,例:C
支持过程嵌套声明的语言

不支持过程嵌套声明的语言

无过程嵌套声明时的数据访问
- 变量的存储分配和访问
- 全局变量被分配在静态区,使用静态确定的地址访问它们。
- 其它变量一定是栈顶活动的局部变量。可以通过运行时刻栈的top_sp指针访问它们。
有过程嵌套声明时的数据访问
嵌套深度
- 过程的嵌套深度
- 不内嵌在任何其它过程中的过程,设其嵌套深度为1。
- 如果一个过程p 在一个嵌套深度为i 的过程中定义,则设定p
的嵌套深度为i +1。
- 变量的嵌套深度
将变量声明所在过程的嵌套深度作为该变量的嵌套深度

访问链 (Access Links)
-
静态作用域规则:只要过程b 的声明嵌套在过程a的声明中,过程b 就可以访问过程a中声明的对象。
-
可以在相互嵌套的过程的活动记录之间建立一种称为访问链 (Access link) 的指针,使得内嵌的过程可以访问外层过程中声明的对象。
如果过程b 在源代码中 直接嵌套 在过程a 中(b的嵌套深度比a的嵌套深度多1) ,那么b 的 任何活动中的访问链都指向最近的a的活动。
例子





访问链的建立



网友评论