Three address code

Da Wikipedia, l'enciclopedia libera.

In informatica il Three Address Code (abbreviato in TAC o 3AC) è una forma di rappresentazione del codice intermedio utilizzata dai compilatori. Ogni istruzione nel 3AC può essere descritta dalla quadrupla (operatore, operando1, operando2, risultato), ed è espressa come:

x := y \, \operatorname{op} \, z

dove x, y e z sono variabili, costanti o variabili temporanee generate dal compilatore. op rappresenta un generico operatore (ad esempio un operatore aritmetico).

Le espressioni che contengono più di una operazione fondamentale, come

p := x + y \times z

non sono rappresentabili in 3AC come singola istruzione, ma vanno scomposte in una serie equivalente di operazioni fondamentali:

t_1 := y \times z

p := x + t_1

Il termine Three Address Code viene utilizzato anche quando alcune operazioni utilizzano più (o meno) di due operandi. La caratteristica principale del 3AC è infatti che ogni istruzione implementa esattamente una operazione fondamentale.

Una versione più raffinata del 3AC è data dallo static single assignment form (SSA).

Esempio[modifica | modifica wikitesto]

int main(void)
{
    int i;
    int b[10];
    for (i = 0; i < 10; ++i) {
        b[i] = i*i; 
    }
}

Il precedente esempio in C, tradotto in Three Address Code, avrebbe indicativamente la forma seguente:

      i := 0                  ; assegnamento
L1:   if i < 10 goto L2       ; salto condizionato
      goto L3                 ; salto incondizionato
L2:   t0 := i*i
      t1 := &b                ; indirizzo dell'operazione
      t2 := t1 + i            ; t2 contiene l'indirizzo di b[i]
      *t2 := t0               ; salvataggio tramite dereferenziazione del puntatore
      i := i + 1
      goto L1
L3: