首页 > 解决方案 > 这个等式的三地址代码是什么?

问题描述

我的方程是 x = y+z;

我已经看到,在解决 x = y+zx,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;

标签: compiler-constructionintermediate-code

解决方案


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 寄存器。


推荐阅读