Código de três endereços

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Exemplo de Código de três endereços e um DAG correspondente para uma expressão aritmética

Em ciência da computação, o código de três endereços é uma forma de representar código intermediário usado por compiladores para auxiliar na implementação das transformações voltadas a melhorar o código.[1] Um código de três endereços é uma representação linear de um Grafo acíclico dirigido (DAG).[2] Cada instrução em um código de três endereços pode ser descrita como uma 4-tupla: (operador, operando1, operando2, resultado).

Cada declaração tem a forma geral de:

\text{resultado} := \text{operando}_1 \, \operatorname{operador} \, \text{operando}_2\,

tal como:

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

onde x, y e z são variáveis, constantes ou variáveis temporárias geradas pelo compilador. op representa qualquer operador, por exemplo, um operador aritmético.

Expressões que contenham mais de uma operação fundamental, tais como:

p := x + y \times z\,

não são representáveis em código de três endereços como uma única instrução. Em vez disso, elas são decompostas em uma série equivalente de instruções, tais como

t_1 := y \times z\,

p := x + t_1\,

O termo código de três endereços é usado, mesmo que algumas instruções usem mais ou menos de dois operandos. As principais características do código de três endereços são de que cada instrução implementa exatamente uma operação fundamental, e que a origem e o destino pode se referir a qualquer registro disponível.

Exemplo[editar | editar código-fonte]

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

O programa C anterior, traduzido em código de três endereços, poderia ser algo como o seguinte:

      i := 0                  ; atribuição
L1:   if i >= 10 goto L2      ; salto condicional
      t0 := i*i
      t1 := &b                ; endereço da operação
      t2 := t1 + i            ; t2 contém o endereço de b[i]
      *t2 := t0               ; armazenamento através de ponteiro
      i := i + 1
      goto L1
L2:

Outro exemplo:

if(a<b)
{
x=x+1;
 
}
else
if(c<d)
{
y=y+1
}
1: if(a<b) then goto 4
2: if(c<d) then goto 7
3: go to next
4: t1=x+1
5: x=t1
6: go to next
7: t2=y+1
8: t2=y
9: go to next
10: ; next é a próxima linha após os comandos da instrução


Referências

  1. Crespo, Rui Gustavo. Processadores de Linguagens: da Concepção à Implementação (em português). Lisboa, Portugal: IST Press, 1998. 435 pp. p. 247. ISBN 972-8469-01-2
  2. Aho, Alfred V.; Lam, Monica S.; Sethi, Ravi; Ullman, Jeffrey D.. Compiladores: Princípios, técnicas e ferramentas (em português). 2ª ed. São Paulo: Addison Wesley (Pearson), 2008. 634 pp. p. 232. ISBN 972-85-88639-24-9

Ligações externas[editar | editar código-fonte]