Ybadoo - Soluções em Software Livre
Turmas
2º Semestre de 2025

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 = {AV = E
ET + E | T - E | T
TF * T | F / T | F
F → ( E ) | V
V → a | b | c | d | e | x | y | z}
Árvore de derivação
Árvore de derivação da sequência de comandos
Árvore de sintaxe
Árvore de sintaxe da sequência de comandos
Árvore de sintaxe em pós-ordem
Á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
 operarg1arg2result
(0)*abT1
(1)-cdT2
(2)+T1T2T3
(3)=T3 x
(4)*abT4
(5)/eT4T5
(6)-cdT6
(7)+T5T6T7
(8)=T7 y
(9)*abT8
(10)-cdT9
(11)+eT9T10
(12)+T8T10T11
(13)=T11 z
Grafo Acíclico Dirigido
Grafo Acíclico Dirigido
Código de três endereços otimizado, representado por quádruplas
 operarg1arg2result
(0)*abT1
(1)-cdT2
(2)+T1T2T3
(3)=T3 x
(4)/eT1T4
(5)+T4T2T5
(6)=T5 y
(7)+eT2T6
(8)+T1T6T7
(9)=T7 z