Académique Documents
Professionnel Documents
Culture Documents
RES
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br
OTIMIZADOR
DE CDIGO
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br
Gerador de Cdigo
Intermedirio
Antes de falarmos do Otimizador,
vamos ver como deve ficar o
resultado do gerador de cdigo
intermedirio do nosso trabalho.
Gerador de Cdigo
Intermedirio
Exemplo:
Program teste;
0001:
0002:
0003:
0004:
0005:
Program teste
Integer i1, i2, i3
String s1, s2, s3
Integer i4, i5, i6
Real r1, r2, r3, r4
Gerador de Cdigo
Intermedirio
Begin
Begin
I4 := 10;
i4 := 20;
I2 := 30;
R1 := 1,5;
I5 := i4;
R2 := r1;
R3 : i1 + r1;
0006:
0007:
0008:
0009:
0010:
0011:
0012:
0013:
0014:
r1
Begin
Begin
I4 := 10
I4 := 20
I2 := 30
R1 := 1,5
I5 := i4
R2 := r1
R3 : i1 +
Gerador de Cdigo
Intermedirio
R4 := (i1 / 10) * (r1 + i2);
R4 := (r4) + ((i1 / 15,2) *
(r1 + i2));
0015:
0016:
0017:
0018:
0019:
0020:
0021:
0022:
0023:
0024:
0025:
0026:
#tmp1 := i1 / 10
#tmp2 := r1 + i2
R4 := #tmp1 * #tmp2
#tmp4 := i1 / 15,2
#tmp5 := r1 + i2
#tmp3 := #tmp4 * #tmp5
R4 := r4 + #tmp3
#tmp6 := (5 > r2)
if not #tmp6 goto 0026
all (s1, s2)
goto 0041
else
Gerador de Cdigo
Intermedirio
Begin
0027: begin
while (r2 < 100) do
0028: #tmp7 := (r2 < 100)
0029: if not #tmp7 goto 0032
R2 := r2 + 1;
0030: r2 := r2 + 1
repeat
0031: goto 0028
0032: repeat
Begin
0033: begin
R2 := r2 + 2;
0034: r2 := r2 + 2
0035: r3 := r3 + 3
R3 : r3 + 3;
0036: #tmp8 := (r1 = 20)
0037: #tmp9 := (r3 < 30)
End ;
0038: #tmp10 := #tmp7 or #tmp8
until ( (r1 = 20) or (r3 <0039: if not (#tmp10) goto 0032
30));
End ;
Gerador de Cdigo
Intermedirio
Begin
R2 := r3 + 1;
End ;
All (s1, s2);
End;
End.
0041:
0042:
0043:
0044:
0045:
0046:
0047:
0048:
0049:
0050:
0051:
Gerador de Cdigo
Intermedirio
Observaes:
Expresses booleanas e rotinas sempre
entre parnteses e apenas eles vem
entre parnteses.
Os end; no aprecem.
Nenhuma linha tem ponto-e-vrgula
As variveis temporrias sempre sero:
#tmpx onde x um valor sequencial
iniciado em 1
OTIMIZADOR
A funo bsica do otimizador
tornar o cdigo mais eficiente.
A gerao de um cdigo timo um
problema indecidvel, o que se faz
utilizar heursticas, pra tornar o
cdigo o melhor possvel.
OTIMIZADOR
Geralmente, a otimizao divide-se
em:
Otimizao do cdigo intermedirio.
Otimizao do cdigo objeto.
OTIMIZADOR
Existem diversas heursticas e
tcnicas para otimizao. Veremos
duas:
Otimizao de blocos sequenciais de
cdigo intermedirio por reduo do
nmero de instrues atravs de grafos
acclicos orientados;
Transformaes de expresses
aritmticas visando ao uso otimizado de
registradores;
GDA
raiz
raiz
+
*
b
a
*
meno
s
meno
s
N que
representa
uma
subexpress
o comum
possui mais
de um pai
*
b
menos
U
a
b
Otimizao de
Registradores
Essa tcnica exige formao da
rvore sinttica e que as expresses
aritmticas satisfaam as seguintes
restries:
No deve existir operandos repetidos na
expresso;
Todos os operadores so binrios (dois
operandos);
Otimizao de
Registradores
Para cada n n da rvore sinttica, deve
ser colocado um rtulo. O rtulo um
nmero inteiro que indica a quantidade de
acumuladores
necessrios
para
a
avaliao da subrvore gerada por n como
raiz.
Com os ns estabelecidos, cria-se uma
rotina recursiva chamada COD(i,n), onde n
o rtulo de um n e i um nmero entre 1
e n.
Otimizao de
Registradores
Inicialmente a rotina chamada com
n = raiz e i = 1.
Passo 01: Se n um n terminal
(folha da rvore sinttica), v ao
passo 2, se no v ao passo 3.
Otimizao de
Registradores
Passo 2: COD (n, i) := LOAD X, Ai
Onde X o nome do n e Ai o isimo acumulador.
Passo 3:
N (t)
N1 (l1)
N2 (l2) (X)
Otimizao de
Registradores
Se l2 = 0 ento
COD (n,i) = COD (n1,i)
Opt Ai, X, Ai
Se (l1 < l2) e (l1 < N) ento
COD (n,i) = COD (n2,i)
COD(n1,i+1)
OPt Ai+1, Ai, Ai
Otimizao de
Registradores
Se (l2 <= l1) e (l2 < N) ento
COD (n,i) = COD (n1,i)
COD(n2,i+1)
OPt Ai, Ai+1, Ai
Otimizao de
Registradores
Se (N <= l1) e (N <=i2) ento
COD (n,i) = COD (n2,i)
T := Novotmp;
Store Ai, T
COD(n1,i)
OPt Ai, T, Ai
Store: guardar Ai em T
DVIDAS