📄 9.1.1.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='9.0a.htm'" ></img></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.1.2.htm'" ></img></td>
</tr>
</table>
<br><br>
<center><font class="title1">第九章 代码优化</font><br></center>
<br>
<font class="title2">9.1 引言</font><br>
<table>
<tr>
<td>    </td>
<td class="content">
<p>人们希望编译器产生的目标代码和手写的一样好,但是,要达到这个目标是相当困难的。不过,我们可以使编译器多做一些工作,使之产生的代码运行得更快一些,或占较少的空间,或两者兼有。这种改进是通过程序变换获得的,称做<font class = "emphasize">优化</font>。实施代码改进变换的编译器叫做<font class = "emphasize">优化编译器</font>。<br>
<p>本章强调的是用于一般语言的优化技术,且独立于机器,即改进目标代码而不用考虑目标机器任何性质的程序变换。依赖于机器的优化,例如寄存器分配和特殊机器指令序列的运用,已在第八章讨论过了。 <br>
<p>如果我们能识别出程序中经常执行的部分,并使得这些部分尽可能效率高,那么便能以最小的代价获得最大的利益。流行的说法是程序执行的90%时间消耗在10%的代码上。虽然实际比例可能有变化,但通常程序运行的大部分时间消耗在一小部分程序上。编译器必须靠自己对程序的分析,找出这10%的代码在哪里。 <br>
<p>在实践中,程序的内循环是重点要改进的地方。在强调控制结构的语言里,循环是显式出现在程序的语法中的,如while语句和for语句。通常,程序流图中的循环由控制流分析过程识别,这是本章讨论的重点之一。 <br>
<p>数据流分析是收集程序中变量定值和引用的信息的过程。在程序的不同点收集的这种信息可以用一组简单的方程联系起来。本章讨论用数据流分析收集信息和在优化中有效地使用这些信息的一些算法。 <br>
</td>
</tr>
</table>
<hr size=2 width=90% align=center color=red><br>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
本节,我们提出为建立高效的目标程序,程序员和编译器可作的选择。主要讨论能够用于改进程序性能的代码变换的种类以及可用于变换的程序的表示。
</p>
</td>
</tr>
</table>
<a name=9.1.1></a>
<hr size=2 width=90% align=center color=red><br>
<font class="title2">9.1.1 优化的标准</font><br>
<table>
<tr>
<td>    </td>
<td class="content">
<p>
简单说,最好的优化是花的代价最小,得益最大。由优化编译器提供的变换应该有下列几点性质。
</p>
<p>
首先,代码变换必须保持程序的含义。也就是优化不能改变程序对给定输入的输出,也不能引起在源程序的最初版本中不会出现的错误,如除数为零。因此,优化编译器应该采用相当稳妥的优化策略。
<p>
其次,变换加快程序的运行速度平均达到一个可度量的值。当然,并不是每一种变换都能成功地改进每一个程序,偶而,优化可能稍稍降低了个别程序的运行速度,所以我们强调一种变换对各种程序的平均影响。
<p>
第三,变换所作的努力是值得的。如果编译器的编写者为实现代码改进变换所消耗的时间和精力,编译器编译源程序的额外开销,不能从目标程序的运行中得以补偿,那么这种改进变换是没有意义的。
<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='9.0a.htm'" ></img></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.1.2.htm'" ></img></td>
</tr>
</table>
</BODY>
<html><script language="JavaScript">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -