三个地址码(TAC/3AC)

Car*_*los 5 compilation intermediate-language

在做一些阅读时,我遇到了"中间语言"和"3AC"这两个术语.

据我所知,IL是源代码编译过程中的中间"步骤".更具体地说,我正在阅读字节码(Java)和C.

我解释它的方式(纠正我,如果错了)是;

源代码1(例如Lisp) - >中间语言(C) - >汇编语言 - >机器码

源代码2(例如Java) - >字节码 - > Java虚拟机

基于此,我很难看到三地址代码(TAC/3AC)在哪里发挥作用,以及它的用途.

Car*_*los 8

三地址代码(TAC)是大多数编译器中使用的中间表示.它本质上是一种通用的汇编语言,属于中级IR的低端.2,3或4地址代码的某些变体通常用作IR,因为它很好地映射到大多数汇编语言.

TAC指令最多可以有三个操作数.操作数可以是二进制算术运算符的两个操作数,第三个是结果位置,或者是与零比较的操作数和要分支到的第二个位置,依此类推.例如,下面的顶部是算术表达式,底部是TAC指令的翻译:

//Expresion
        a = b * c + b * d;
//3AC
        _t1 = b * c;
        _t2 = b * d;
        _t3 = _t1 + _t2;
        a = _t3;
Run Code Online (Sandbox Code Playgroud)

资料来源:http://web.archive.org/web/20151010192637/http : //www.dound.com/courses/cs143/handouts/17-TAC-Examples.pdf