Three address code

Abbozzo
Questa voce sull'argomento linguaggi di programmazione è solo un abbozzo.
Contribuisci a migliorarla secondo le convenzioni di Wikipedia.

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) che rappresenta l'operazione.

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

dove x (risultato), y (operando1) e z (operando2) sono variabili (temporanee o meno) e gli operandi possono anche essere delle costanti. Il simbolo op {\displaystyle \operatorname {op} } indica un generico operatore (ad esempio un operatore aritmetico).

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

t 1 := y × z {\displaystyle t_{1}:=y\times z}

p := x + t 1 {\displaystyle p:=x+t_{1}}

Nel momento in cui si desidera rappresentare delle istruzioni più complicate, comprendendo più degli operandi previsti, è possibile appoggiarsi a delle variabili temporanee. Di fatto il codice seguente, scritto in C

int main(){
    int x = 3;
    int y = (2+x)*5
}

Viene rappresentato con il Three Address Code come riportato di seguito:

x := 3;
t_0 := 2 + x;
y := t_0*5;

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

Esempio

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: