正在加载图片...
306 翁译原理及实践 China-pub.Co 下载 编译器编写者可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中 间表示代替语法树,然后再从这个新的中间表示生成目标代码。这种类似目标代码的中间表示 称为中间代码(intermediate code)。 中间代码能采用很多形式,几平有多少种编译器就有多少种中间代码形式。然而所有中间 代码都代表了语法树的某种线性化(linearization)形式,也就是说,语法树用顺序形式表示。中 间代码可以是高水平的,它几乎和语法树一样可以抽象地表示各种操作。它或者还可以非常接 近目标代码。它可以使用或不使用目标机器和运行时环境的细节信息,如数据类型的尺寸、变 量的地址和寄存器。它可以混合或不混合符号表中包括的信息,如作用域、嵌套层数和变量的 偏移量。假如它混合了符号表中包括的信息,目标代码的生成基于中间代码就足够了:否则, 编译器必须保留符号表 当编译器的目标是产生非常高效的代码时,中间代码是极其有用的。如要产生高效的代码 就需要相当数量的目标代码属性分析,使用中间代码能使这变得容易。特别地,虽然从语法 树中直接得到混合细节分析信息的附加数据结构不是不可能的,但它能更容易地从中间代码 中得到。 中间代码在使编译器更容易重定向上也是有用的:假如中间代码与目标机器相对独立,那 么要为不同目标机器生成代码就仅需重写从中间代码到目标代码的翻译器。这比重写整个编译 器要容易。 在本节中我们将学习两个中间代码的普遍形式:三地址码(hrce-addresscode)和P代码(P code)。这两种中间代码以许多不同的形式出现,我们的研究将仅集中在普遍特性上,而不是 代表了某一个版本的细节化描述。这种描述能在本章最后“注意与参考”节所描述的文献中 找到。 8.1.1三地址码 三地址码最基本的用法说明被设计成表示算术表达式的求值,形式如下: x y op z 这个用法说明表示了对y和z的值的应用操作符p,并将值赋给x。这里的p可以是算术运算符, 如+或,也可以是其他能操作于y、z值的操作符。 三地址码这个名字来自于这个用法说明的形式,因为x、y、z通常代表了内存中的3个地 址。但是要注意,x的地址的使用不同于y、z的地址的使用。y、z(x不能)可以代表常量或没 有运行时地址的字面常量。 为了看清这种形式的三地址码如何能表示表达式的计算,考虑下边的算术表达式 2*a+(b-3) 语法树如下: 相应的三地址码如下 七1=2★a 编译器编写者可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中 间表示代替语法树,然后再从这个新的中间表示生成目标代码。这种类似目标代码的中间表示 称为中间代码(intermediate code)。 中间代码能采用很多形式,几乎有多少种编译器就有多少种中间代码形式。然而所有中间 代码都代表了语法树的某种线性化 ( l i n e a r i z a t i o n )形式,也就是说,语法树用顺序形式表示。中 间代码可以是高水平的,它几乎和语法树一样可以抽象地表示各种操作。它或者还可以非常接 近目标代码。它可以使用或不使用目标机器和运行时环境的细节信息,如数据类型的尺寸、变 量的地址和寄存器。它可以混合或不混合符号表中包括的信息,如作用域、嵌套层数和变量的 偏移量。假如它混合了符号表中包括的信息,目标代码的生成基于中间代码就足够了;否则, 编译器必须保留符号表。 当编译器的目标是产生非常高效的代码时,中间代码是极其有用的。如要产生高效的代码 就需要相当数量的目标代码属性分析,使用中间代码能使这变得容易。特别地,虽然从语法 树中直接得到混合细节分析信息的附加数据结构不是不可能的,但它能更容易地从中间代码 中得到。 中间代码在使编译器更容易重定向上也是有用的:假如中间代码与目标机器相对独立,那 么要为不同目标机器生成代码就仅需重写从中间代码到目标代码的翻译器。这比重写整个编译 器要容易。 在本节中我们将学习两个中间代码的普遍形式:三地址码 (three-address code)和P -代码( P - c o d e )。这两种中间代码以许多不同的形式出现,我们的研究将仅集中在普遍特性上,而不是 代表了某一个版本的细节化描述。这种描述能在本章最后“注意与参考”节所描述的文献中 找到。 8.1.1 三地址码 三地址码最基本的用法说明被设计成表示算术表达式的求值,形式如下: x = y o p z 这个用法说明表示了对y和z的值的应用操作符o p,并将值赋给x。这里的o p可以是算术运算符, 如+或-,也可以是其他能操作于y、z值的操作符。 三地址码这个名字来自于这个用法说明的形式,因为 x、y、z通常代表了内存中的 3个地 址。但是要注意,x的地址的使用不同于 y、z的地址的使用。y、z(x不能)可以代表常量或没 有运行时地址的字面常量。 为了看清这种形式的三地址码如何能表示表达式的计算,考虑下边的算术表达式 2*a + ( b-3 ) 语法树如下: 相应的三地址码如下 t1 = 2 * a 3 0 6 编译原理及实践 下载
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有