正在加载图片...
China-pub.com 第8章代码生成 307 下载 t2=b-3 t3=t1+t2 三地址码要求编译器产生临时变量名,在这个例子中的是t1、t2和3。这些临时变量对应于 语法树的内部节点而表示计算值,在这个例子中用临时变量七3表示根节点值⊙。这里并没有说 明如何在内存中分配这些临时变量:它们通常将被分到寄存器中,但也有可能保存在活动记录 里面(参见第7章“临时栈”的讨论)。 三地址码仅代表了从左至右的语法树线性化,因为首先列出了相对于根的左子树的求值的 代码,编译器在某种情况下希望用另一种顺序也是有可能的。我们注意到对于三地址码来说, 是有可能使用另一顺序,即(临时变量有不同的意思): t1=b-3 t2=2*a t3=t2+t1 很明显,上面所示的这种三地址码形式对于表示所有语言,即使是最小的程序语言的特性也是 不够的。例如一元操作符(如负号)就需要一个三地址码的变种(包含两个地址)如: t2=-t1 为适应标准程序语言的使用结构,必须为每个结构改变三地址码的形式。如果语言中含有 不常见到的特性,那么就必须为表达的这种特性发明另一种三地址码形式。这就是三地址码之 所以没有标准形式的原因(正如语法树没有标准形式一样)。 在这一章余下的章节中我们将逐个处理一些程序语言共有的结构,并显示怎样将这些结构 翻译成三地址码。为了知道其结果,我们给出一个用TNY语言编写的完整示例。 请考虑来自第1章1.7节的TNY例子,该例计算了一个整数的阶乘,我们把它重新放在程序 清单8-1中。 程序清单81TINY程序示例 in TINY language computes factorial fact 1; x:=x-1 unt10 程序清单8-2是这个例子的三地址码。这个代码包含了许多三地址码的不同形式。首先,内 置的输入和输出操作符read和write已被直接翻译成一地址指令。其次,这里有一个条件 转移指令1££a1se,它通常被用来翻译i语句和循环语句,它包含两个地址:被检测的条 诸如1、2的名字仅仅意味着是这种代码通常类型的代表实际上,如果像这里一样使用源代码名字的话 三地址码中的临时变量名必须区别于在实际的源代码中所用的名字。t2 = b - 3 t3 = t1 + t2 三地址码要求编译器产生临时变量名,在这个例子中的是 t 1、t 2和t 3。这些临时变量对应于 语法树的内部节点而表示计算值,在这个例子中用临时变量 t 3表示根节点值 。这里并没有说 明如何在内存中分配这些临时变量;它们通常将被分到寄存器中,但也有可能保存在活动记录 里面(参见第7章“临时栈”的讨论)。 三地址码仅代表了从左至右的语法树线性化,因为首先列出了相对于根的左子树的求值的 代码,编译器在某种情况下希望用另一种顺序也是有可能的。我们注意到对于三地址码来说, 是有可能使用另一顺序,即(临时变量有不同的意思): t1 = b-3 t2 = 2*a t3 = t2+t1 很明显,上面所示的这种三地址码形式对于表示所有语言,即使是最小的程序语言的特性也是 不够的。例如一元操作符(如负号)就需要一个三地址码的变种(包含两个地址)如: t2 = -t1 为适应标准程序语言的使用结构,必须为每个结构改变三地址码的形式。如果语言中含有 不常见到的特性,那么就必须为表达的这种特性发明另一种三地址码形式。这就是三地址码之 所以没有标准形式的原因(正如语法树没有标准形式一样)。 在这一章余下的章节中我们将逐个处理一些程序语言共有的结构,并显示怎样将这些结构 翻译成三地址码。为了知道其结果,我们给出一个用 T I N Y语言编写的完整示例。 请考虑来自第1章1 . 7节的T I N Y例子,该例计算了一个整数的阶乘,我们把它重新放在程序 清单8 - 1中。 程序清单8-1 TINY程序示例 程序清单 8 - 2是这个例子的三地址码。这个代码包含了许多三地址码的不同形式。首先,内 置的输入和输出操作符 r e a d和w r i t e已被直接翻译成一地址指令。其次,这里有一个条件 转移指令i f _ f a l s e,它通常被用来翻译 i f语句和循环语句,它包含两个地址:被检测的条 第 8章 代 码 生 成 3 0 7 下载 诸如t 1、t 2的名字仅仅意味着是这种代码通常类型的代表。实际上,如果像这里一样使用源代码名字的话, 三地址码中的临时变量名必须区别于在实际的源代码中所用的名字
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有