⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9.3.3_2.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 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.3.3.htm'" ></td>
<td>
<img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.4.1.htm'" ></img></td>
</tr>
</table>

<p><br>
<font class="title2"><b>9.3.3 代数恒等式的使用(续)</b></font> </p>


<table>
<tr>
<td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
四、其他一些代数变换
</p>
<p>
dag构造过程可以帮助我们应用上述和其它一些代数变换,如应用交换律和结合律。
</p>
<p>
1、交换律
</p>
<p>
例如:若*的两个运算对象可交换,那么x&nbsp;*&nbsp;y&nbsp;=&nbsp;y&nbsp;*&nbsp;x.在构造dag图的时候,当要建立一个左右子结点分别为m和n的新的*结点时,先检查是否已有这样的结点存在;然后检查是否已有左右后代分别为n和m的*结点存在,只要有一种存在,就不用再建立新的*结点了。
</p>
<p>
关系算符<=,>=,<,>,=和≠有时也会产生公共子表达式。例如:条件x>y的测试可以由减和测试减所设置的条件码完成。(不过,减可能引起上溢或下溢,而比较指令不会。)这样,对x-y和x>y只需要生成dag的一个结点。 
</p>
<p>
2、结合律
</p>
<p>
结合律也可以用来寻找公共子表达式。例如:如果原代码有赋值
</p>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        a&nbsp;:=&nbsp;b&nbsp;+&nbsp;c <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        e&nbsp;:=&nbsp;c&nbsp;+&nbsp;d&nbsp;+&nbsp;b <br>
产生的中间代码可能是 <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        a&nbsp;:=&nbsp;b&nbsp;+&nbsp;c <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        t&nbsp;:=&nbsp;c&nbsp;+&nbsp;d <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        e&nbsp;:=&nbsp;t&nbsp;+&nbsp;b <br>
如果t在块外面不需要,这个序列可以改成 <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        a&nbsp;:=&nbsp;b&nbsp;+&nbsp;c <br>
&nbsp&nbsp&nbsp;&nbsp;&nbsp&nbsp&nbsp;&nbsp;        e&nbsp;:=&nbsp;a&nbsp;+&nbsp;d <br>
这里既用到+的结合律又用到它的交换律。 <br>
<p>
编译器的编写者应该仔细阅读语言的说明,决定计算的哪些重新安排是允许的,因为计算机算术并不都是遵守数学的代数恒等式。例如:标准的Fortran77说,假如括号的完整性不违反的话,编译器可以计算任何数学等价的表达式。所以编译器可以用x*(y-z)代替x*y-x*z,但不能用a+(b-c)代替(a+b)-c。
</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.3.3.htm'" ></img></td>
<td><img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'" onclick="vbscript:window.location.href='9.4.1.htm'" ></td>
</tr>
</table>

</BODY>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -