« 上一篇下一篇 »

表达式的优化代码的生成

一个基本块仅包含单一的表达式求值时,或者我们认为以逐次处理各个表达式的方式基本块生成代码就已经足够了,那么我们可以最佳地选择寄存器。在下面的算法中,我们引人对一个表达式树(即一个表达式的语法树)的结点添加数字标号的方案。在使用固定个数的寄存器来对一个表达式求值的情况下,该方案允许我们为表达式生成最优的代码。

Ershov 数

一开始,我们给一个表达式树的每个结点各赋予一个数值。该数表示如果我们不把任何临时值存放问内存的话,计算该表达式需要多少个寄存器。这些数有时被称为Ershou数(Ershov nurnher)。这是根据A.Ershov命名的,他为只有一个算术寄存器的机器使用了类似的方案。对我们的机器模型而言,计算Ershov数的规则如下:

1)所有叶子结点的标号为1。

2)只有一个子结点的内部结点的标号和其子结点的标号相同。

3)具有两个子结点的内部结点的标号按照如下方式确定:

①如果两个子结点的标号不同,那么选择较大的标号。

②如果两个子结点的标号相同,那么它的标号就是子结点的标号值加一。

用于语义检査的例程

在一个代码生成翻泽方案中出现的属性和输人树中的属性是一样的。但是翻译方案中的属性常常带有关于该属性下标的取值的限制。比如,一个机器指令可能要求某个属性的值位于特定范围之内,或者两个属性的取值之间有一定关系。

这些关于属性值的限制可以用断言来描述。在进行归约之前需要判断相应的断言是否被满足。实际上,相对于纯文法描述的方式而言,语义动作和断言的普遍使用能够更加灵活、更加容易地对代码生成器加以描述。可以使用通用模板来描述各类指令,然后使用语义动作来为特定情况选择指令。比如,两种不同的加法指令可以用同一个模板来表示:


可以通过特定的断言来消除二义性,解决语法分析-动作的冲突问题。这些断言允许在不同的上下文中使用不同的选择策略。因为目标机体系结构的某些方面(比如寻址模式)可以用属性值来描述,所以对目标机器的描述可以变得更小。这种方法的复杂之处在于人们难以验证该翻译方案是否可靠地描述了目标机器。当然,所有的代码生成器都会或多或少地碰到这个问题。

« 上一篇下一篇 »