如何使用访问链接和显示来访问非本地名称?
访问链接是指向每个激活记录的指针,它为嵌套过程获取词法作用域的直接实现。换句话说,访问链接用于实现词法作用域语言。“访问线”可能需要放置被调用过程所需的数据。
处理在不同词法级别定义的静态链接的改进方案是使用称为显示的数据结构。显示是一个指向激活记录的指针数组。Display[0] 包含指向在词法级别 0 定义的过程的最最近激活的激活记录的指针。
显示数组中元素的数量由输入源程序中嵌套的最大级别给出。在访问封闭过程中定义的非局部变量的显示方案中,每个过程在激活时将其激活记录的指针存储在其词法级别的显示数组中。
它保存该位置在显示数组中的先前值,并在过程退出时将其恢复。显示方案的优点是可以直接使用 Display[n] 获取词法级别“n”的任何封闭过程的激活记录,而不是像先前方案那样遍历访问链接。
非局部名称有两种作用域规则:
静态作用域或词法作用域
词法作用域称为静态作用域。在这种类型的作用域中,作用域是通过确定程序文本进行测试的。例如,PASCAL、C 和 ADA 等语言使用静态作用域规则。这些语言也称为块结构语言。
动态作用域
动态作用域分配规则用于非块结构语言。在这种类型的范围中,非局部变量访问指的是在最近调用且仍在活动的过程声明的非局部数据。在动态作用域下实现非局部访问的方法有两种:
**深度访问** - 基本概念是保留一个活动变量的堆栈。使用控制链接而不是访问链接,要查找变量,请从上到下搜索堆栈,查找包含所需变量空间的最新的激活记录。这种访问非局部变量的方法称为深度访问。由于搜索是在堆栈中“深入”进行的,因此该方法称为深度访问。在这种方法中,应在运行时使用符号表。
**浅层访问** - 其思想是保留中心存储,并为每个变量名称分配一个槽。如果名称不是在运行时创建的,则可以在编译时确定存储布局。