Three address code

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:S 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:=yopz

dove x (risultato), y (operando1) e z (operando2) sono variabili (temporanee o meno) e gli operandi possono anche essere delle costanti. Il simbolo 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:

t1:=y×z

p:=x+t1

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: