compiler-construction - 这个等式的三地址代码是什么?
问题描述
我的方程是 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;
解决方案
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 寄存器。
推荐阅读
- amazon-web-services - DDoS 攻击处理策略
- ruby-on-rails - Dockerized sidekiq 中的 Rails 后台作业重复计划
- javascript - 如何使用等待反应 discord.js 来回移动帮助页面
- api - CodeMirror, Invoke 内置粘贴功能
- r - 将 ID 分配给具有 NA 的列
- python - Python Dataframe 根据它们所属的组对行进行求和和排名
- applescript - 将值作为参数传递给处理程序
- java - docker image: openjdk:15: 如何在其中安装 python
- vue.js - 在 vue ant 设计步骤中包含一个独立的组件
- spring-batch - 春季批处理主从多个作业并行