Vous êtes sur la page 1sur 29

COMPILADO

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;

Integer i1, i2, i3 ;


String s1, s2, s3;
Integer i4, i5, i6;
Real r1, r2, r3, r4;

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));

if (5 > r2) then


All (s1, s2);
else

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

If ((r1 <> 20) or (i1 <= 30) or (r3


0040: #tmp11 := (r1 <> 20)
> 30,5) or (i1 >= 0)) then

Begin
R2 := r3 + 1;
End ;
All (s1, s2);

End;
End.

0041:
0042:
0043:
0044:
0045:
0046:
0047:
0048:
0049:
0050:
0051:

#tmp12 := (i1 <= 30)


#tmp13 := (r3 > 30,5)
#tmp14 := (i1 >= 0)
#tmp15 := #tmp11 or #tmp
#tmp16 := #tmp15 or #tmp
#tmp17 := #tmp16 or #tmp
if not #tmp17 goto 0050
begin
r2 := r3 + 1
All (s1, s2)
FIM.

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.

Lembre-se que a otimizao pode ser


feita vrias vezes, otimizando
cdigos otimizados, mas no tantas
para no deixar o compilador lento.

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;

Grafos Dirigidos Acclicos


Um Grafo Dirigido Acclico GDA
tambm uma representao
intermediria de um compilador
Um (GDA) para uma expresso identifica
as sub-expresses comuns existentes na
mesma
Como uma rvore sinttica, um GDA
possui um n para cada sub-expresso
de uma expresso
Um n interior representa um operador
e os filhos representam seus operandos

Grafos Dirigidos Acclicos


A diferena entre um GDA e uma
rvore sinttica (AS) que, um n de
um GDA representando uma subexpresso comum, possui mais de
um pai
O GDA fornece as mesmas informaes
da AS, porm de maneira mais
compacta.

As regras semnticas podem criar os

Grafos Dirigidos Acclicos


Exemplo: a := b * -c + b*-c
rvore Sinttica

GDA

raiz

raiz

+
*
b

a
*

meno
s

meno
s

N que
representa
uma
subexpress
o comum
possui mais
de um pai

*
b

menos
U

Grafos Dirigidos Acclicos


Exerccio 1
Montar o GDA para a seguinte
expresso:
X = (a + b) * (a b)

Grafos Dirigidos Acclicos


Exerccio 1: X = (a + b) * (a b)
#t1 := a + b
#t2 := a b
#t3 := t1 * t2
X := t3

a
b

Grafos Dirigidos Acclicos


Exerccio 2
Montar o GDA para a seguinte
expresso:
(a + b) * a + a + (a + b) * c

Otimizao por GDA


Primeiro passo identificar os blocos
bsicos do programa, que consiste em
blocos sequenciais (sem estruturas de
repetio ou recursos).
O lider do bloco o primeiro comando
Uma exceo: o ltimo comando do bloco
pode ser uma estrutura de repetio.
Agora seguir os passos:

Otimizao por GDA


Passos 01: Criar uma lista L vazia;
Passo 02: Escolha um n n do GDA
que no esteja em L tal que, se
existem arestas incidentes a n, essas
se originam em nodos que j esto
em L. Adicione n a L. Se adicionou,
v ao passo 3. Caso no exista n
nesta condio, encerre o otimizador.

Otimizao por GDA


Passos 03:
n = ltimo n adicionado a L;
Se (a aresta mais a esquerda que
se origina em n incide em um no
interno m que no est em L) e
(todos os predecessores diretos de m
esto em L) ento adicione m a L e
repita o passo 3. Seno volte ao
passo 2

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

Vous aimerez peut-être aussi