Você está na página 1de 22

COMPILADO

RES
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

GERAO DE
CDIGO OBJETO
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br

Gerao de Cdigo Objeto


O cdigo objeto deve:
Ser correto e de alta qualidade;
Fazer uso efetivo dos recursos da mquina;
Executar eficientemente;

Gerar um cdigo que atenda o mximo


(timo) dos requisitos acima um
problema indecidvel, por isso, usa-se
heursticas para obter um cdigo bom.

Consideraes do Projeto de um
Gerador Final
Forma do cdigo gerado;
Seleo de instrues de mquina;
Escolha da ordem de ativao;
Alocao de registradores;

Forma do Cdigo
O cdigo objeto pode ser gerado em:
1. Linguagem Absoluta de mquina;
2. Linguagem relocvel;
3. Assembly;

1. Linguagem Absoluta de Mquina


Armazenam variveis em reas fixas de memria
tornando o processo mais rpido, contudo, essas
regies podem ser bloqueadas.
A gerao de um programa em linguagem absoluta de
mquina tem a vantagem de que o programa objeto
pode ser armazenado numa rea de memria fixa e ser
imediatamente executado.
utilizada em compiladores didticos, em ambientes
universitrios, onde altamente conveniente diminuir o
custo de compilao.
Os compiladores que geram cdigo absoluto e
executam-no imediatamente so conhecidos como load

2. Linguagem Relocvel
A gerao de cdigo em linguagem de mquina
relocvel permite a compilao separada de
subprogramas.
Mdulos e objetos relocveis podem ser ligados e
carregados por um Ligador-Carregador.
Essa estratgia d flexibilidade para compilar
subrotinas separadamente e para chamar outros
programas previamente compilados.

3. Assembly
A traduo para linguagem assembly facilita o processo
de gerao de cdigo, pois ela prxima ao cdigo
intermedirio de trs endereos.
So geradas instrues simblicas e podem ser usadas
as facilidades de macro instrues.
O preo pago um passo adicional:
Traduo para linguagem de mquina.
uma estratgia razovel, especialmente, para
mquinas com pouca memria, nas quais o compilador
deve desenvolver-se em vrios passos.

Seleo de Instrues de
Mquina
A escolha da seqncia de
apropriada pode resultar em um
cdigo mais curto e mais rpido;

Escolha da Ordem de
Ativao
A determinao da melhor ordem
para execuo das instrues um
problema
indecidvel.
Algumas
computaes
requerem
menos
registradores
para
resultados
intermedirios.
Exemplo:

X:= Fatorial (n) ;


X := X + 1;
Y := n + 2;

Escolha da Ordem de
Ativao
A determinao da melhor ordem
para execuo das instrues um
problema
indecidvel.
Algumas
computaes
requerem
menos
registradores
para
resultados
intermedirios.
Exemplo:

X:= Fatorial (n) ;


Y := n + 2;
X := X + 1;

Alocao de Registradores
Instrues com registradores so mais curtas e mais
rpidas do que instrues envolvendo memria.
Portanto, o uso eficiente de registradores muito
importante.
A atribuio tima de registradores a variveis
muito difcil, e muito problemtica quando a mquina
trabalha com registradores aos pares (para instrues
de diviso e multiplicao), ou prov registradores
especficos para endereamentos e para dados.

Alocao de Registradores
Operao de diviso nos computadores IBM/360 e IBM/370:
D r, m
O dividendo de 64 bits deve estar armazenado em um par de registradores
par-mpar, representado por r.
m contm o divisor.
Aps a diviso, o registrador par contm o resto e o mpar contm o
quociente.

t = a + b L R0, a
A R0, b
t = t + c A R0, c
t = t / d SRDA R0, 32
desloca o dividendo para R1 e limpa R0
D R0, d
St R1, t

Mquina Objeto
Familiaridade com a mquina e com o conjunto de
instrues pr-requisito para projetar um bom gerador de
cdigo.
Formato das instrues:

op fonte, destino

Instrues:
ADD R1, R2 R2 = R2 + R1 (adio)
SUB R1, R2 R2 = R2 R1 (subtrao)
MUL R1, R2 R2 = R2 * R1 (multiplicao)
DIV R1, R2 R2 = R2 / R1 (diviso)
LOAD M, R Registrador = Memria (carrega)
STORE R, M Memria = Registrador (armazena)
COPY R1, R2 R2 = R1 (cpia)

Mquina Objeto
a := b + c

LOAD b, R0 R0 = b
LOAD c, R1 R1 = c
ADD R1, R0 R0 = R0 + R1
STORE R0, a a = R0

a := b + c * d

LOAD d, R0 R0 = d
LOAD c, R1 R1 = c
MUL R0, R1 R1 = R1 * R0
LOAD b, R0 R0 = b
ADD R1, R0 R0 = R0 + R1
STORE R0, a a = R0

Gerador de Cdigo
Simplificado
Para utilizao do gerador
simplificado, deve-se assumir o
seguinte:
Para
cada
operador
do
cdigo
intermedirio, existe um operador no
cdigo objeto;
Resultados computados podem ser
deixados em registradores tanto tempo
quanto desejado, salvando-os somente
se o registrador necessrio ou
imediatamente antes de uma chamada

Gerador de Cdigo
Simplificado
Cdigos timos para o comando a := b + c
1- Supondo b em Ri e c em Rj, e o resultado
podendo ser deixado em Ri, tem-se:
ADD Rj, Ri custo = 1
2- Supondo b em Ri e c na memria, tem-se:
ADD c, Ri custo = 2

Gerador de Cdigo
Simplificado
Cdigos timos para o comando a := b +
c
3- Se c seja usado (como operando) , temse:
LOAD c, Rj
ADD Rj, Ri custo = 3

Informao de Prximo-uso
O objetivo de computar o prximo
uso de uma varivel procurar
manter essa varivel em registrador
se ela estiver viva.
Varivel Viva: uma varivel dita
viva em uma linha i, de um bloco de
comandos, se ela aparece em uma
linha maior que i desse bloco. Caso
contrrio, dita morta.

Descritores
O algoritmo de gerao de cdigo final
manipulam descritores que informam o
que contm cada registrador e onde.
Descritor de registradores: mapeia os
registradores do sistema;
Descritor de endereos: informa onde o
valor de uma varivel pode ser encontrado.
Se em um registrador, endereo de
memria ou pilha (essa informao tambm
pode estar em uma tabela de smbolos);

Exemplo de Cdigo Final


Cdigo gerado para o comando: d := (a b) + (a c) + (a c)

DVIDAS