A fase de otimização do código intermediário vem logo após a fase de geração desse código e tem por objetivo tornar o código intermediário mais apropriado para a produção de código objeto (código de máquina) eficiente, tanto em relação ao tamanho como ao tempo de execução. Uma das técnicas de otimização de código intermediário consiste em identificar segmentos sequencias do programa, chamados blocos básicos, e representá-los através de grafos dirigidos e submetê-los a um processo de otimização. Apresente o código de três endereços não otimizado da seguinte sequência de comandos, sobre a gramática livre de contexto G5.
x = a * b + c - d y = e / a * b + c - d z = a * b + e + c – d
G5 = ({A, E, T, F, V}, {a, b, c, d, e, x, y, z, =, +, -, *, /, (, )}, P5, A) P5 = {A → V = E E → T + E | T - E | T T → F * T | F / T | F F → ( E ) | V V → a | b | c | d | e | x | y | z}
Solução da Questão 05
Árvore de derivação da sequência de comandosÁrvore de sintaxe da sequência de comandosÁrvore de sintaxe em pós-ordem da sequência de comandos
Código de três endereços não otimizado, representado por quádruplas
oper
arg1
arg2
result
(0)
*
a
b
T1
(1)
-
c
d
T2
(2)
+
T1
T2
T3
(3)
=
T3
x
(4)
*
a
b
T4
(5)
/
e
T4
T5
(6)
-
c
d
T6
(7)
+
T5
T6
T7
(8)
=
T7
y
(9)
*
a
b
T8
(10)
-
c
d
T9
(11)
+
e
T9
T10
(12)
+
T8
T10
T11
(13)
=
T11
z
Grafo Acíclico Dirigido
Código de três endereços otimizado, representado por quádruplas