Beruflich Dokumente
Kultur Dokumente
RES
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br
GERADOR
INTERMEDIR
IO DE CDIGO
ROBERTO TENORIO FIGUEIREDO
www.osfedera.com
tenorio.petrolina@bol.com.br
Gerador de Cdigo
Intermedirio
Vamos agora explorar as questes envolvidas
na transformao do cdigo fonte em uma
possvel representao intermediria
Essa fase nem sempre realizada.
Em Assembly essa fase no existe.
Em Java essa fase evidente.
Em C e Pascal a fase existe, mas no
percebida.
Gerador de Cdigo
Intermedirio
A
maioria
dos
compiladores
comerciais realizam a gerao de
uma representao intermediria
entre o cdigo fonte e o cdigo de
mquina
Esta representao intermediria
chamada de linguagem intermediria
Fases de um Compilador
Programa Fonte
Analisador Lxico
Tabela
de
Smbolos
Analisador
Sinttico
Analisador
Semntico
Gerador de Cdigo
Intermedirio
Otimizador de Cdigo
Gerador de Cdigo
Programa Objeto
Tratador
de erros
1 id1
2 id2
3 Id
3
4
posicao
inicial
taxa
Analisador
Lxico
id1 := id2 + id3 * 60
Analisador Sinttico
+
Analisador
Semntico
+
Gerador de Cdigo
Intermedirio
temp1 :=
inttoreal( 60 )
temp2 := id3 *
temp1
temp3 := id2 +
temp2
temp1 :=
inttoreal( 60 )
temp2 := id3 *
temp1
temp3 := id2 +
temp2
id1
:= temp3
Otimizador de Cdigo
Linguagem Intermediria
Linguagem Intermediria
Existe uma variedade de linguagens
intermedirias atualmente
Quando se est projetando um
compilador, certamente a deciso de
qual linguagem intermediria utilizar
crucial
Linguagem Intermediria
Dependendo da linguagem
intermediria, otimizaes de cdigo
podero:
ser mais facilmente serem
implementadas
ser mais difceis de serem
implementadas
demandar mais tempo de computao
se as linguagens intermedirias forem
inapropriadas
impedir a otimizao
Linguagem Intermediria
Outro ponto importante
observarmos quo independente de
mquina a linguagem intermediria
.
Quanto mais dependente de mquina,
ser mais difcil de se implementar
certas otimizaes
Linguagem Intermediria
Durante o processo de compilao,
inicialmente gera-se uma primeira
representao intermediria, na qual
so aplicadas otimizaes.
Em seguida, esta representao
otimizada convertida em outra
representao
intermediria,
conveniente para a aplicao de
outras otimizaes
Linguagem Intermediria
As linguagens intermedirias podem ser
classificadas em:
Linguagens intermedirias de alto nvel
Prximas da linguagem fonte
Linguagem Intermediria
As linguagens intermedirias podem
pertencer as seguintes categorias:
Representaes grficas: rvores ou
grafos sintticos;
Notao ps-fixada ou pr-fixada;
Cdigos de trs endereos: qudruplas e
triplas;
Representao grfica
Uma possvel forma de
representao intermediria a
rvore sinttica
rvores Sintticas
Numa rvore sinttica os operadores e as
palavras chaves no figuram como folhas,
ao contrrio, so associados a um n
raiz
interior
a
+
Exemplo: Para a expresso *
*
a := b * -c + b*-c
teremos:
meno
s
meno
s
rvores Sintticas
rvores sintticas permitem que a
gerao de cdigo seja desacoplada
da anlise sinttica
Notao ps e pr Fixadas
Nas notaes ps-fixadas, o operador
aparece depois dos operandos.
Nas notaes pr-fixadas, o operador
aparece antes dos operandos.
Essas notaes podem ser
generalizadas para vrios operandos.
Notao ps e pr Fixadas
Exemplo:
Infixada
(a + b) * c
a * (b + c)
a+b*c
Psfixada
ab+c*
abc+*
abc*+
Prfixada
*+abc
*a+bc
+a*bc
t1 = -c
t2 := b * t1
c := t2
Instrues de atribuio
So aquelas nas quais o resultado de
uma operao armazenado na
varivel especificada esquerda do
operador de atribuio, aqui
denotado por :=
H trs formas para esse tipo de
instruo:
Na primeira, a varivel recebe o
resultado de uma operao binria
x := y op z
Instrues de atribuio
Na segunda, o resultado pode ser obtido
a partir da aplicao de um operador
unrio:
x := op y;
Na terceira forma, pode ocorrer uma
simples cpia de valores de uma
varivel para outra:
x := y
Instrues de Desvio
As instrues de desvio podem
assumir duas formas bsicas.
Uma instruo de desvio
incondicional tem o formato:
goto (L)
onde L um rtulo simblico que
identifica uma linha do cdigo.
Instrues de Desvio
A outra forma de desvio o desvio
condicional, com o formato:
if x opr y goto (L)
onde:
opr um operador relacional de comparao
(<, <=, ... etc)
(L) o rtulo da linha que deve ser executada
se o resultado da aplicao do operador
relacional for verdadeiro;
caso contrrio, a linha seguinte executada.
Instrues de Desvio
Por exemplo, a seguinte iterao em
C
while (i++ <= k) {
x[i] = 0;
}
x[0] = 0;
Instrues de Desvio
Poderia ser traduzida em:
L1: if i > k goto (L2)
i := i + 1
x[i] := 0
goto (L1)
_L2: x[0] := 0
Invocao de rotinas
A invocao de rotinas ocorre em
duas etapas:
Inicialmente, os argumentos do
procedimento so registrados com a
instruo param.
Aps a definio dos argumentos, a
instruo call completa a invocao
da rotina
Invocao de rotinas
A instruo return indica o fim de
execuo de uma rotina.
Opcionalmente, esta instruo pode
especificar um valor de retorno, que
pode ser atribudo na linguagem
intermediria a uma varivel como
resultado de call
Atribuies de ponteiro e
endereo
As instrues em formato
intermedirio tambm utilizam um
formato prximo quele da
linguagem C:
x := &y
w := *x
*x := z
Qudruplas
Na abordagem que utiliza
qudruplas, cada instruo
representada por uma linha na
tabela com a especificao do:
Operador
Primeiro argumento
Segundo argumento
e do resultado.
Qudruplas
Por exemplo, a traduo da expresso
a = b + c * d;
resultaria no seguinte trecho da tabela:
operador
arg1
arg2
resultado
t1
t1
Qudruplas
Para algumas instrues, como
aquelas
envolvendo
operadores
unrios ou desvio incondicional,
algumas
das
colunas
estariam
vazias.
Triplas
Na outra forma de representao, por triplas,
evita-se a necessidade de manter nomes de
variveis temporrias ao fazer referncia s linhas
da prpria tabela no lugar dos argumentos.
1
2
operador
*
+
arg1
arg2
c
b
(1)
Triplas
Nesse caso, apenas trs colunas so
necessrias, uma vez que o resultado
est sempre implicitamente
associado linha da tabela.
Backpatching
O principal problema de se criar um
gerador intermedirio de cdigo na
gerao de expresses lgicas e
comandos de controle, pois o cdigo
deve incluir comandos de desvio
para endereos que, em geral, ainda
no so conhecidos.
Isso inviabiliza a gerao do cdigo
em um passo nico.
Backpatching
Backpatching o preenchimento dos
endereos ainda no conhecidos.
Para implementao o backpatching
necessrio:
Manter uma lista de endereos;
Adicionar um ndice da lista no utilizado
no lugar de um endereo desconhecido;
DVIDAS