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

📄 10.5.1.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='10.4.1.htm'" ></td>
<!--
    <td>
    <img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.6.htm'" ></imag></td>
!-->

  </tr>
</table>

<p> </p>
<font class="title2"><b><a name="105"></a>10.5 面向对象语言的编译优化</b></font>
<p></p>
<table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
面向对象语言的编译优化一个很重要的方面是将对动态方法的调用尽可能的转化为静态方法的调用。
</p>
<p>
同普通的函数调用相比,动态方法的调用引入了查找动态方法表的工作量,对10.2的单继承情况来说,这需要两条指令来完成。乍看起来这种花销并不大,其实不然。因为:
</p>
<p>
·现代的计算机体系结构处理向常量地址的跳转比处理从表中获取的地址跳转更加有效。当指令流中的跳转地址为常量时,处理器能够引导指令获取机制预取位于跳转地址中的指令,并存于cache中;但当跳转地址无法预测时,预取也无法实现,因而就会将指令的获取-执行流水线滞延好几个周期。
</p>
<p>
·一个编译器如果不知道在某个位置将被调用的函数实例,也就对很难分析出这个函数调用的影响。那么编译器就不能对内联函数扩展或是过程间分析做有效的优化。
</p>
<p>
因此,这就需要面向对象语言的优化编译器通过全局程序分析找到那些总是调用相同的函数实例的动态方法调用,并将对它们的调用替换为对相应静态方法的调用。
</p>
<p>
例如对于一个动态方法的调用c->f(),这里c是类C的 指针,编译器要用类型层次分析来确定哪些C的子类包含了对方法f的重定义,如果没有,那么f对应的函数实例必然是C_f,这时就可以将对f的调用改为静态方法调用。
</p>
<p>
这个思想可以和静态数据流分析的一种形式--类型传播相结合。例如当执行了赋值语句c = new C后,c的类就明确了,这种信息就可以通过赋值语句d = 
c传播下去。当调用动态方法d-&gt;f()时,这种类型传播信息就会限制上述类型层次分析的范围,因而也就限制了f可能对应的函数实例。
</p>
<p>
(注:在上述的程序示例中,为了表示清楚,将属性和方法的默认保护设为public的,这与c++的默认private可能不同,用户实际使用时可以加上)。
</p>
</td></tr></table>
<p> </p>

<table align="right" width="300">
  <tr>
    <td>
    <img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.4.1.htm'" ></td>
<!--
    <td>
    <img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.6.htm'" ></imag></td>
!-->
  </tr>
</table>
</body>
</html>

⌨️ 快捷键说明

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