📄 6.4.3_3.htm
字号:
<html>
<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>
<body>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.4.3_2b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.4.3_3b.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>6.4.3.3 Display表 </b></font>
<table><tr><td>    </td>
<td class="content">
<P>
对于非局部名字而言,比用存取链更为快速的存取可以通过使用指向活动记录的指针数组d而获取,它称之为一个display表。在运行时刻我们所保持的这个display表使得嵌套深度为i的非局部名字a的存储单元就在由display元素d[i]所指向的活动记录中。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
假设控制在一个嵌套深度为j的过程p的一个活动记录中,那么,display表中前j-1个元素指向按静态规则包围过程p的那些过程的最新的活动记录,并且d[j]指向过程p的活动记录。使用display表一般要比沿存取链寻找的快,因为存放非局部名字的活动记录是通过访问d的元素而找到的,于是就只需沿指针前进一步。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
保持display表的一个简单方法是在display表之外还使用存取链。作为调用和返回序列的一部分,display表通过跟踪一系列存取链而得以更新。当存取链连到嵌套深度为n的活动记录时,display元素d[n]被置为指向这个活动记录。实际上,display表复制了在一系列的存取链内的信息。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
对于上面的简单方法可以加以改进。图6.20所表示的方法,在通常的情况下,即当过程不作为参数来传递的情况下,在过程的入口和出口处需要较少的工作。图6.20中的display表是一个从栈中分离出来的全程数组。图中表示的情况关系到图6.18源程序正文的执行。和以前一样,图中只给出了过程名字的头一个字母。
</p>
</td></tr></table>
<br>
<center><img src="6_20.gif" ></center><br>
<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.4.3_2b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.4.3_3b.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -