正在加载图片...
310 翁译原理及实践 China-pub.com 载 (8) (a,x,0) (住E_£,(8),(4) (haissact,-) 三元式是代表三地址码的有效方法,空间数量减少了且编译器不需要产生临时变量名:然 而,三元式也有一个不利因素:用数组索引代表三元式使得三元式位置的移动变得很困难,而 如用链表的话就不存在这个问题。三元式和对三元式的C代码定义的问题仍处于实践价段。 8.1.3P-代码 在70年代和80年代早期,P代码作为由许多Pascal编译器产生的标准目标汇编代码被设计 成称作P-机器(P-machine)的假想栈机器的实际代码。P-机器在不同的平台上由不同的解释器实 现。这个思想使得pascal编译器变得容易移植,只需对新平台重写P.机器解释器即可。P代码 已被证明是一个非常有用的中间代码,它的各种扩展和修改版在许多自然代码的编译器中得到 了使用,其中大多数都是针对类Pascali语言的。 由于将P代码设计成直接可执行的,所以它包含了对特殊环境的明确描述、数据尺寸,还 有P机器大量的特有信息,如果要理解P代码程序,就必须提供上述信息。为避开细节而恰当 地说明问题,在这里只描述P代码的一个简化的抽象版本。各种不同版本的实际P代码的描述 能在本章最后列出的大量参考书中找到。 从我们的目的出发,P机器包括一个代码存储器、一个未指定的存放命名变量的数据存储 一个存放临时数据的栈,还有一些保持栈和支持执行的寄存器。作为P代码的第1个例子, 考虑如下表达式,这个表达式在81.1节中已用过,它的语法树在811节: 2*a+(b-3) 这个表达式的P代码版本如下: 1e2 。1 ad constant 3 er aubstraction ad ;nteger addition 这些指令被看作代表如下的P-机器操作:1dc2首先将值2压入临时栈,然后,1oda将变量a 的值压入栈。指令mP1将这两个值从栈中弹出,使之相乘(按弹出的相反顺序),再将结果压入 栈。接下来两个指令(1。a聊1dc3将b的值和常量3压入栈(现在栈中有3个值),随后,sb: 指令弹出栈顶的两个值,用第1个值去减第2个值,再把结果压入栈中,最后a1指令弹出余下 的两个值并使之相加,再将结果压入栈。代码结束时,栈中只有一个值,它代表了这次运算的 结果。 作为第2个例子,考虑威值语句: x=y+1 对应于如下的P代码指令: load address of x lod y load value of y 三元式是代表三地址码的有效方法,空间数量减少了且编译器不需要产生临时变量名;然 而,三元式也有一个不利因素:用数组索引代表三元式使得三元式位置的移动变得很困难,而 如用链表的话就不存在这个问题。三元式和对三元式的 C代码定义的问题仍处于实践价段。 8.1.3 P- 代码 在7 0年代和8 0年代早期,P -代码作为由许多P a s c a l编译器产生的标准目标汇编代码被设计 成称作P -机器( P - m a c h i n e )的假想栈机器的实际代码。P -机器在不同的平台上由不同的解释器实 现。这个思想使得p a s c a l编译器变得容易移植,只需对新平台重写 P -机器解释器即可。P -代码 已被证明是一个非常有用的中间代码,它的各种扩展和修改版在许多自然代码的编译器中得到 了使用,其中大多数都是针对类P a s c a l语言的。 由于将P -代码设计成直接可执行的,所以它包含了对特殊环境的明确描述、数据尺寸,还 有P -机器大量的特有信息,如果要理解 P -代码程序,就必须提供上述信息。为避开细节而恰当 地说明问题,在这里只描述 P -代码的一个简化的抽象版本。各种不同版本的实际 P -代码的描述 能在本章最后列出的大量参考书中找到。 从我们的目的出发,P -机器包括一个代码存储器、一个未指定的存放命名变量的数据存储 器、一个存放临时数据的栈,还有一些保持栈和支持执行的寄存器。作为 P -代码的第1个例子, 考虑如下表达式,这个表达式在8 . 1 . 1节中已用过,它的语法树在8 . 1 . 1节: 2 * a + ( b - 3 ) 这个表达式的P -代码版本如下: ldc 2 ; load constant 2 lod a ; load value of variable a m p i ; integer multiplication lod b ; load value of variable b ldc 3 ; load constant 3 s b i ; integer substraction a d i ; integer addition 这些指令被看作代表如下的P -机器操作:ldc 2首先将值2压入临时栈,然后,lod a将变量a 的值压入栈。指令m p i将这两个值从栈中弹出,使之相乘 (按弹出的相反顺序),再将结果压入 栈。接下来两个指令(loa b和ldc 3)将b的值和常量3压入栈(现在栈中有3个值),随后,s b i 指令弹出栈顶的两个值,用第 1个值去减第2个值,再把结果压入栈中,最后 a d i指令弹出余下 的两个值并使之相加,再将结果压入栈。代码结束时,栈中只有一个值,它代表了这次运算的 结果。 作为第2个例子,考虑赋值语句: x := y + 1 对应于如下的P -代码指令: lda x ; load address of x lod y ; load value of y 3 1 0 编译原理及实践 下载
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有