📄 6.5.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.5.2.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.5.4.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>6.5.3 复制恢复</b></font>
<table><tr><td>    </td>
<td class="content">
<P>
可以说,在传值调用和引用调用之间的一个混合形式是复制恢复连接(copy-restore linkage):
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
1.当控制流入到被调用过程之前,实在参数被计算出来。实在参数的右-值被传递到被调用过程中,如同传值调用。另外,要把那些具有左-值的实在参数的左-值在调用以前确定下来,以待后用。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
2.当控制返回时,把形式参数的现行右-值复制回到相应的实在参数的左-值中,此左-值是在调用之前计算出来的。当然,只有那些具有左-值的实在多数被复制下来。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
第一步将实在参数的值“复制入”被调用过程的活动记录中(即放入形式参数的存储单元中)。第二步将形式参数的最后值“复制出”到调用过程的活动记录中(即在调用以前确定下来的实在参数的存储位置中)。所以这种方法有时也称作“复制入复制出"(copy-in copy-out)。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
注意,swap(i,a[i])使用复制恢复方法也可以正确地工作,因为a[i]的存储位置在调用以前由调用过程计算并保存了。于是,形式参数y的最后值当过程返回时被复制到正确的位置中,即使a[i]的位置由于调用而发生变化(因为i的值改变了)。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
在Fortran的参数传递实现上,一些系统常常使用复制恢复,也有的系统使用引用调用。复制恢复和引用调用二者是有区别的。如果被调用过程具有多种方式来访问调用过程的活动记录中的同一个存储单元的话,那么,这时二者之间的区别可以表现出来。图6. 25说明了这一问题。由在第(6)行上的调用unsafe(a)建立的活动记录可以把a作为非局部名字来访问也可以通过形式参数x来访问。在引用调用方式下,x和a的赋值语句都直接影响a,因此a的最后值为0。而在复制恢复的方式下,首先把实在参数a的值l复制到形式参数x中。恰在控制返回以前(或说控制返回时)把x的最后值2复制到实在参数a的左-值中,因此a的最后值为2。
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<P>
(1) <font color="#0000FF"> <b>program</b> </font> copyout(input,output); <br>
(2) <b> <font color="#0000FF">var</font></b> a: integer; <br>
(3) <b> <font color="#0000FF">procedure</font></b> unsafe (var x: integer ); <br>
(4) <b> <font color="#0000FF">begin</font></b> x:=2;a:=0 <b><font color="#0000FF">end</font></b>; <br>
(5) <b> <font color="#0000FF">begin</font></b> <br>
(6) a:=1; unsafe(a); writeln(a) <br>
(7) <b> <font color="#0000FF">end</font></b>.<br> <br>
<b>图6.25</b> 如果把call-by-reference变为copy-restore则输出将要改变<br>
</p>
</td></tr></table>
<br>
<table align=right width=300>
<tr>
<td><img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.5.2.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.5.4.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -