📄 8.5.0.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='8.4.0b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.1.htm'"></img></td>
</tr>
</table>
<br><br>
<font class="title2"><b>8.5 一个简单的代码生成器</b></font> <br>
<font class="title2"><b>8.5.0 序言</b></font> <br>
<table><tr><td>    </td>
<td class="content" >
<P>这一节要介绍一个简单的代码生成器。它依次把形式为三地址语句序列的中间代码变换成目标代码,我们将在上节的基础上对于在基本块内充分利用寄存器的问题进行考虑。即,一方面在基本块中,当生成计算某变量值的目标代码时,尽可能地让该变量的值保留在寄存器中(即不编出把该变量的值存到内存单元的指令),直到该寄存器必须用来存放别的变量值或者已到达基本块出口为止;另一方面,后续的目标代码尽可能地引用变量在寄存器中的值,而不访问主存。至于在基本块之间如何充分利用寄存器,这是一个较为复杂的问题。由于一个基本块的后继可能有好几个,而每一个后继又可能有几个不同的前驱,因而各后继基本块不易判断变量的值是否存放在寄存器中,以及存放在哪一个寄存器中。为简单起见,在离开基本块时,简单代码生成器就把有关变量在寄存器中的现行值存放到主存单元中去。</P>
<P>以上的处理均涉及到基本块的划分。这并不一定要求事先已划分好,可以在依次生成各三地址语句的目标代码时,同时应用划分基本块的算法,区分基本块的入口和出口。为了简单明了,我们假定在三地址语句中的每一个算符都对应一个相应目标语言的算符。尽管如此,我们将看到,代码生成时将考查许多情形。例如,对于三地址语句a:=b+c。如果寄存器R<SPAN class=down><sub>i</sub></SPAN>中存放了d而R<SPAN class=down>j</SPAN>中存放了c,且b在此语句之后不再活跃,即b在此语句以后不再被引用,那么我们可以为此语句生成一条指令:ADD R<SPAN class=down><sub>j</sub></SPAN>,R<SPAN class=down><sub>i</sub></SPAN>。其开销为1,结果存放在R<SPAN class=down><sub>j</sub></SPAN>中。如果b存放在R<SPAN class=down><sub>i</sub></SPAN>中,而c存放在一个存储单元里(为方便起见仍旧称此存储单元为c),并假定b不再活跃,我们可以生成如下指令序列:</P>
<P align=center>ADD c,R<SPAN class=down><sub>i</sub></SPAN> 其开销为2</P>
或者<P align=left>
MOV c,R<SPAN class=down><sub>j</sub></SPAN> <br>
ADD R<SPAN
class=down><sub>j</sub></SPAN>,R<SPAN class=down><sub>i</sub> </SPAN> 其开销为3 </P>
如果c的值随后还会被引用,则后面的指令序列或许更有价值。因为我们可以从寄存器R<SPAN
class=down><sub>j</sub></SPAN>中取出它的值。依赖于b和c当前存放在何处以及b的值是否还会被引用,将有许多情况需要考虑。如果我们注意到算符“+”是可交换的,则可考虑的情形将更多。究竟哪种情形行得通,这将依赖于有关三地址语句的上下文环境。</td></tr></table>
<table>
<tr>
<td><font class="yanshi">     观看演示 </font></td>
<td>
<font color=blue onmouseover="javascript:style.cursor='hand';" onclick="javascript:open('images/test8_3/Page1.htm','_blank','left=100,top=100,scrollbars=yes,resizable=yes,width=850,height=600')">
一个简单的代码生成器</font>
</td>
<td><img src="../images/yanshi.gif"></img></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='8.4.0b.htm'"></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='8.5.1.htm'"></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -