COMPILADORES
09
Prof. Marcos
GERAÇÃO DE CÓDIGO
Código Intermediário
Os vários tipos de código intermediário
fazem parte de uma das seguintes
categorias:
o Representações gráficas: árvore e
grafo de sintaxe;
o
Notação pós-fixada ou pré-fixada;
o
Código de três-endereços.
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Exemplo:
Seria Traduzido:
a=b+c
a=a+b
a=b
a=b+c*d
a := b + c
a := + b
a := b
_t1 := c * d
a := b + _t1
GERAÇÃO DE CÓDIGO
Código de Três Endereços
As Instruções de desvio são traduzidas em:
Goto _L onde: _L seria um label
Exemplo:
If x oplog y goto _L
…
_L …
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Exemplo:
a=b+c
e=c+d+b
Seria Traduzido
em:
a := b + c
_t1 := c + d
e := _t1 + b
OTIMIZZAÇÃO: eliminando expressões comuns
a := b + c
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Seria Traduzido em:
Exemplo:
while(I < 10*j)
{
a[i] = i + 2 * j;
++I;
}
…
_L1: _t1 := 10 * j
if i >= _t1 goto _L2
_t2 := 2 * j
a[i] := i + _t2
i := i + 1
goto _L1
_L2: ...
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Seria Traduzido em:
OBSERVE que o valor
das expressões
_t1 := 10 * j e _t2 := 2 * j
nãp se alteram ,
podendo serem
movidas pára fora do
laço, ficando:
_L1: _t1 := 10 * j
if i >= _t1 goto _L2
_t2 := 2 * j
a[i] := i + _t2
i := i + 1
goto _L1
_L2: ...
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Seria Traduzido em:
OBSERVE que o valor
das expressões
_t1 := 10 * j e _t2 := 2 * j
nãp se alteram ,
podendo serem
movidas pára fora do
laço, ficando:
_t1 := 10 * j
_t2 := 2 * j
_L1: if i>=_t1 goto _L2
a[i] := i + _t2
i := i + 1
goto _L1
_L2: ...
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Converta para código de três endereços
a) a = 2 * y + z * d
b) for(i = 1; i <= n ; ++i)
x = x * i;
GERAÇÃO DE CÓDIGO
Código de Três Endereços
Converta para código de três endereços
a) a = 2 * y + z * d
_t1 := 2 * y
_ t2 := z * d
a := _t1 + _t2
GERAÇÃO DE CÓDIGO
Código de Três Endereços
b) for(i = 1; i <= n ; ++i)
x = x * i;
i := 1
_L1: if i > n goto _L2
x := x * i
i :- i + 1
goto _L1
_L2: ...
GERAÇÃO DE CÓDIGO
Otimização de Código
Melhorar o código intermediário efetuando
transformações para simplificá-lo:
 tempo de execução
 uso de memória
 tamanho do código executável
GERAÇÃO DE CÓDIGO
Otimização de Código
CÓDIGOS DE TRÊS ENDEREÇOS - Exemplo
Valor := valinicial + taxa * 60
_t1 := int to real(60)
_t2 := id3 * _t1
_t3 := id2 + _t2
id1 = _t3
_t1 := id3 * 60.0
id1 := id2 + _t1
GERAÇÃO DE CÓDIGO
Código de Máquina
D2 08 D 123 D 456
Representa a instrução para mover o
valor que está no endereço 456 para
o endereço 123
GERAÇÃO DE CÓDIGO
Código de Máquina
GERAÇÃO DE CÓDIGO
Código de Máquina
• Gera, a partir do código intermediário
(árvore sintática) o código para a
máquina-alvo.
• É nessa fase de compilação que as
propriedades da máquina-alvo se
tornam o fator principal.
GERAÇÃO DE CÓDIGO
Código de Máquina
• Gera, a partir do código intermediário
(árvore sintática) o código para a
máquina-alvo.
• É nessa fase de compilação que as
propriedades da máquina-alvo se
tornam o fator principal.