📄 c_6b.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.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.1.2.htm'"></img></td>
</tr>
</table>
<br><br>
<center><font class="title1">引言</font></center><br>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
在考虑代码生成以前,我们需要把静态源程序正文与实现此程序的运行时刻的动作联系起来。在执行过程中,源程序正文中相同的名字可以在目标机器中指示不同的数据目标。本章主要讨论名字和数据目标之间的关系。
</p>
</td>
</tr>
</table>
<table><tr><td>    </td>
<td class="content">
<p>
数据目标的保留和释放是由运行时刻支持的程序包来管理的,它包括由生成的目标代码装配的程序。通常,程序包是指由内容彼此相关的多个程序集合而成的一组程序。在高级语言中过程是一个重要的语法范畴。我们将看到,运行时刻支持的程序包的设计将主要受到过程的语义的影响。对于类似Pascal的语言的支持程序包可以利用在这一章中介绍的技术来构造。同时在讨论中也涉及到Fortran和Lisp等语言。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
我们把一个过程的每一次执行称作这个过程的一次活动(激活)。如果一个过程是递归的,那么在同一个时刻,它可能有几个活动是活着的,或说有几个活动存活。Pascal中的每一次过程调用导致一次处理该过程数据目标的活动。运行时刻数据目标的表示形式由它的类型来决定。通常,基本的数据类型,如字符、整型、实型等,可以用目标机器中等价的数据目标来表示。然而,复杂的数据类型,如数组、串、记录等,一般用基本目标的组合来表示。我们将在第七章中讨论它们的设计
</td></tr></table>
<hr size=2 color=red width=90%>
<br>
<font class="title2"><b>6.1 有关源语言中的一些问题的讨论</b></font>
<table><tr><td>    </td>
<td class="content">
<p>
为了说明方便,我们假设一个程序是由若干个过程组成的,如在Pasca1中的那样。在这一节中,读者要注意区分一个过程的源程序正文和其运行时刻的活动。
</td></tr></table>
<br>
<font class="title2"><b>6.1.1 过程</b></font>
<table><tr><td>    </td>
<td class="content">
<P>
(1) <B><font color="#0000FF">program</font></B> sort(input,output);
<BR> (2) <B><font color="#0000FF">var</font></B> a:array[0..10] of integer;
<BR> (3) <B><font color="#0000FF">procedure</font></B> readarray;
<BR> (4) <B><font color="#0000FF">var</font></B> i:integer:
<BR> (5) <B><font color="#0000FF">begin</font></B>
<BR> (6) for i:=1 to 9 do read(a[i]);
<BR> (7) <B><font color="#0000FF">end</font></B>;
<BR> (8); <B><font color="#0000FF">function</font></B> partition(y,z:integer):integer;
<BR> (9) <B><font color="#0000FF">var</font></B> i,j,x,v:integer;
<BR> (10)   <B><font color="#0000FF">begin</font></B>
<BR> ...
<BR> (11) <B><font color="#0000FF">end</font></B>;
<BR> (12) <B><font color="#0000FF">procedure</font></B> quicksort(m,n:integer);
<BR> (13) <B><font color="#0000FF">var</font></B> i:integer;
<BR> (14) <B><font color="#0000FF">begin</font></B>
<BR> (15) <B><font color="#0000FF">if</font></B>(n>m) <B><font color="#0000FF">then</font></B><font color="#0000FF"> <B>begin</B>
</font>
<BR> (16) i:=partition(m,n);
<BR> (17) quicksort(m,i-1);
<BR> (18) quicksort(i+1,n);
<BR> (19) <B><font color="#0000FF">end</font></B>
<BR> (20) <B><font color="#0000FF">end</font>;</B>
<BR> (21) <B><font color="#0000FF">begin</font></B>
<BR> (22) a[0]:=-9999; a[10]:=9999;
<BR> (23) readarray;
<BR> (24) quicksort(1,9);
<BR> (25) <B><font color="#0000FF">end</font></B>
<p>
<B>图6.1</B> 读入整数并排序的一个Pascal程序
<P>
</p>
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
一个<font class="emphasize">过程定义</font>就是一个说明,其最简单的形式是把一个标识符和一个语句联系起来。标识符就是<font class="emphasize">过程的名字</font>,语句是<font class="emphasize">过程体</font>。例如,图6.1的pascal代码的(3)到(7)行中包含了一个名为readarray的过程的定义,过程体在(5)到(7)行中给出。之后,在(8)到(11)行中包含了一个名为partition的过程,等等。在许多语句中把返回值的过程称为<font class="emphasize">函数</font>;然而,把函数也作为过程来处理是很方便的。同时,一个完整的程序也可以作为一个过程看待。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
当一个过程名出现在一个可执行的语句中时,我们就说这个过程在这一点被调用。过程调用的基本思想是执行过程体。图6.1的(21)到(25)行中的主程序在(23)行调用过程readarray,然后在(24)行调用过程quicksort。我们注意到,过程调用也可以发生表达式中,如(16)行。这一情况有时也称作是函数调用或函数引用。
</td></tr></table>
<table><tr><td>    </td>
<td class="content">
<p>
出现在过程定义中的有一些标识符是特殊的,被称为过程的形式参数(简称形参)。例如,第(12)行中的标识符m和n是过程quicksort的形式参数。与之相对应的是实在参数(简称实参),我们可以把它们传递给被调用过程,在过程体中用实参代替形参。在6.5节中,我们将讨论建立形式参数和实在参数之间对应关系的方法。图6.l中第(18)行是对一个带有实在参数i+1和n的过程quicksort的调用。
</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.0.htm'"></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='6.1.2.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -