Escolar Documentos
Profissional Documentos
Cultura Documentos
sendo
id1 --> Montante
id2 --> DepósitoInicial
1
Universidade Estadual do Centro-Oeste – UNICENTRO
Curso de Ciência da Computação
Professora Sandra Mara Guse Scós Venske
não há nenhum problema em gerar o código com o algoritmo simples, já que a melhoria feita acima
pode ser feita durante a fase de otimização de código. Assim sendo, o compilador pode deduzir que a
conversão de 60 (de inteiro para real) pode ser realizada uma vez em tempo de compilação, podendo
ser eliminada a operação IntToReal. Da mesma forma, temp3 transmite seu valor a id1 uma única
vez, então pode-se substituir temp3 por id1, eliminando o último enunciado.
A representação intermediária é utilizada pelos módulos de retaguarda de um compilador para
geração do código-alvo.
O código de três endereços é uma seqüência de enunciados da forma geral
x := y op z
sendo
x, y, e z são nomes, constantes ou objetos de dados temporários criados pelo compilador;
op é qualquer operador (aritmético de ponto fixo ou flutuante, lógico).
x + y * z
poderia ser traduzida na seqüência
t1 := y * z
t2 := x + t1
sendo t1 e t2 nomes temporários
gerados pelo compilador.
O código de três endereços é uma representação linearizada de uma árvore sintática, no qual os
nomes explícitos correspondem aos nós interiores do grafo.
A representação de árvore sintática para a := b * -c + b * - c aparece na Figura 1.
2
Universidade Estadual do Centro-Oeste – UNICENTRO
Curso de Ciência da Computação
Professora Sandra Mara Guse Scós Venske
t1 := -c
t2 := b * t1
t3 := -c
t4 := b * t3
t5 := t2 + t4
a := t5
Nota-se que os nomes das variáveis aparecem diretamente nos comandos de três endereços.
Exemplo 1: x = x + 3 + 4
Código de Três endereços:
T1 = X + 3
X = T1
T2 = T1 + 4
Exemplo 2: Geração de código para uma função de Fatorial em código de três endereços pode ser
vista na Figura 4.
3
Universidade Estadual do Centro-Oeste – UNICENTRO
Curso de Ciência da Computação
Professora Sandra Mara Guse Scós Venske
Exemplo 3:
while (i < 10*j)
{
a[i] = i + 2*j;
++i;
}
Código de três endereços:
L1: t1 := 10 * j
if i >= _t1 goto L2
t2 := 2 * j
a[i] := i + t2
i := i + 1
goto L1
L2: ...
Fonte:
AHO, Alfred V.; SETHI, Ravi; ULLMAN, Jeffrey D. Compiladores: Princípios, Técnicas e
Ferramentas. São Paulo: Guanabara Koogan, 1995.
JOSÉ, João Neto. Introdução à Compilação. Rio de Janeiro: LTC, 1987.