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