Sie sind auf Seite 1von 48

COMPILADO

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

Traduo de uma sentena


posicao := inicial + taxa *
60
Tabela de Smbolos

1 id1
2 id2
3 Id
3
4

posicao
inicial
taxa

Analisador
Lxico
id1 := id2 + id3 * 60
Analisador Sinttico

Traduo de uma sentena


Analisador Sinttico

+
Analisador
Semntico

Estas etapas podem ser


realizadas atravs de
aes semnticas
inseridas dentro do
analisador sinttico

+
Gerador de Cdigo
Intermedirio

temp1 :=
inttoreal( 60 )
temp2 := id3 *
temp1
temp3 := id2 +
temp2

Traduo de uma sentena


Gerador de Cdigo
Intermedirio

temp1 :=
inttoreal( 60 )
temp2 := id3 *
temp1
temp3 := id2 +
temp2
id1
:= temp3
Otimizador de Cdigo

posicao := inicial + taxa


* 60

Linguagem Intermediria

O objetivo de se realizar a gerao


de cdigo intermedirio permitir a
realizao de otimizaes.

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

Linguagens intermedirias de nvel mdio


Linguagens intermedirias de baixo nvel
Prximas da linguagem alvo

Um compilador pode gerar mais de uma


destas representaes durante o
processo de compilao

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

Cdigo de Trs Endereos


composto por uma seqncia de
instrues envolvendo operaes
binrias ou unrias e uma atribuio
O nome trs endereos est associado
especificao, em uma instruo, de no
mximo trs operandos: dois para os
operadores binrios e uma para o
resultado. Exemplo:

t1 = -c
t2 := b * t1
c := t2

Cdigo de Trs Endereos


O cdigo de trs endereos uma
seqncia de enunciados da forma
geral
x := y op z
Onde, x, y e z so nomes, constantes
ou objetos de dados temporrios
criados pelo compilador
op est no lugar de qualquer
operador

Cdigo de Trs Endereos


Assim,
expresses
envolvendo
diversas operaes so decompostas
nesse cdigo em uma srie de
instrues, eventualmente com a
utilizao de variveis temporrias
introduzidas na traduo.
Dessa forma, obtm-se um cdigo mais
prximo da estrutura da linguagem
assembly

Cdigo de Trs Endereos


No cdigo de trs endereos no so
permitidas expresses aritmticas
construdas, j que s h um
operador, logo, uma expresso da
forma x + y * z poderia ser traduzida
na seqncia
t1 := y * z
t2 := x + t1
Os temporrios so construdos para
os ns interiores da rvore sinttica.

Cdigo de Trs Endereos


Uma possvel especificao de uma
linguagem de trs endereos envolve
quatro tipos bsicos de instrues:
Instrues de atribuio
Acesso indexado e indireto
Desvios
Invocao de rotinas

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 atribuio Exemplo


Por exemplo, a instruo em
linguagem de alto nvel:
a = b + c * d;
seria traduzida nesse formato para
as instrues:
t1 := c * d
a := b + t1

Acesso Indexado e Indireto


Para atribuies indexadas, as duas formas
bsicas so
x := y[i]
x[i] := y
A forma x := y[i] atribui x o valor
armazenado i posies de memria a partir do
endereo de memria y
A forma x[i] := y atribui o valor y posio de
memria com deslocamento i partir do
endereo de memria x

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

Invocao de rotina Exemplo


Por exemplo, considere a chamada
de uma funo f que recebe trs
argumentos e retorna um valor:
f(a, b, c);

Invocao de rotina Exemplo


Neste exemplo em C, esse valor de
retorno no utilizado. De qualquer
modo, a expresso acima seria
traduzida para
param a
param b
param c
t1 := call f,3

Invocao de rotina Exemplo


Onde o nmero aps a vrgula indica
o nmero de argumentos utilizados
pelo procedimento f.
Com o uso desse argumento
adicional possvel expressar sem
dificuldades as chamadas aninhadas
de procedimentos.

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

Implementao de cdigo de Trs


Endereos
A representao interna das
instrues em cdigos de trs
endereos d-se na forma de
armazenamento em:
Tabelas com quatro colunas(quadrplas)
Tabelas com trs colunas (triplas)

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

Das könnte Ihnen auch gefallen