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.