【问题标题】:What is a three address code for this equation?这个等式的三地址代码是什么?
【发布时间】:2020-01-04 20:35:55
【问题描述】:

我的方程是 x = y+z;

我已经看到,在解决 x = y+z x,y,z 是变量的问题时,这些变量通常会转换为三个地址代码,如下所示: t1 = y+z; x = t1;

我的疑问是当 x = y+z 本身是一个三地址代码时,因此我们为什么使用临时变量。

例如转换

for(int i=1; i<10; i++) x = y+z;

3地址码:

i = 1
l1: if(i>=10) goto l2
    t1 = y+z;
    x = t1;
    goto l1;
l2:

为什么我们不能写 x = y+z 而不是 t1 = y+z 和 x = t1;

【问题讨论】:

  • 使用临时对象是标准且“幼稚”的做法。在实现优化器时,通常需要在课程中获得额外学分来识别这种不需要临时的特殊情况。
  • @Someprogrammerdude 谢谢。我明白了,两者都是正确的。我没有足够的声望点来结束这个问题。如果能关闭就更好了。

标签: compiler-construction intermediate-code


【解决方案1】:

x = y + z 是一个三地址码。

没有。这是一个4地址代码。

通常,“三”意味着我们必须另外考虑寄存器变量或时间变量。

可能的等价物是:

y = <some value>
z= <some value>
T1 = z
T1 += y
x = T1

一些开发者使用类似汇编器的语法:

Move y, <some value>
Move z, <some value>
Move T1, z
Add T1, y
Move x, T1

您可能知道,为了使用中间代码(或三个地址代码表达式)需要考虑一些重要的事情:

  • “三”是指限制,不是规则,可以少,比如一两个操作数。

    x++; x = y; x = y + z;

  • 开始将常量、数字或变量视为“位置”,每个操作数或地址代码(“邮政信箱”)代表计算机内存中的一个位置。

  • 至少有一个变量,是结果的目标位置。

    w = a * 2;

  • 同样的目标变量可以用作源操作数。

    x = x * y; y = y + 1;

  • 三个地址代码表达式是简短的数学表达式,其编写方式与常用表达式类似,但元素较少,因为它们意味着要翻译成汇编代码。

除了使用不只是 1、2 或 3 个位置之外,还有一些操作,在任何位置都无法完成,通常时间变量代表一个 CPU 寄存器。

【讨论】:

  • @umicat 有参考资料吗?根据 Alfred V. Aho、Monica S. Lam、Ravi Sethi、Jeffrey D. Ullman 所著的《编译器 - 原理、技术和工具》一书:第 99 页:x = y op z 是一个三地址代码,其中 x、y 和 z可以是名称、常量或编译器生成的临时变量。再次在 Pg: 366 中,作者使用 x=y+z 作为三地址码来解释 Quadruples。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多