You are on page 1of 12

1

Compiladores
Compilao
Como visto anteriormente, um programa
escrito numa linguagem qualquer pode ser
processado por um compilador ou um
interpretador
Compilao
Quando compilado, o programa normalmente
faz parte do processo de gerao de um
programa executvel
Com exceo da compilao de cdigo para mquinas
virtuais, como o caso de Java, .NET, e no caso de
compiladores que realizem tradues entre linguagens
de alto nvel
2
2
Compilao
Este processo ocorre em duas etapas:
A compilao que traduz o cdigo-fonte escrito em
alguma linguagem em cdigo-objeto
A linkedio que rene todos os cdigos-objeto do
programa juntamente com as bibliotecas usadas e
gera um arquivo executvel
Ex.: C, C++, Pascal
3
4
Compilao
A compilao realizado em vrias fases:
Anlise
Analise Lxica
Analise Sinttica
Anlise Contextual
Sntese
Gerao de Cdigo Intermedirio
Otimizao de Cdigo (opcional)
Gerao de Cdigo Objeto
Na anlise so realizadas vrias verificaes
em busca de erros enquanto que a sntese
responsvel pela gerao do cdigo-objeto
Estas fases implementam os aspectos
associados especificao de uma linguagem
Sintaxe
Restries Contextuais
Semntica
3
Numa compilao tradicional
Compilao
5
Fases estudadas
Nesta disciplina
Plataforma .NET
Compilao
6
4
7
Compilao
Plataforma Java
Compilao
Exemplo de compilador com
mltiplas linguagens-fonte e
capaz de gerar cdigo-
objeto para vrios tipos de
mquinas-alvo diferentes
Tendncia futura para a
construo de novos
compiladores
8
5
Compiladores
Fases da Compilao
Fases da Compilao
Anlise Lxica
Tem como objetivo analisar os dados de entrada
(cdigo-fonte) a fim de converter a sequencia de
caracteres em uma lista de tokens
A anlise dos tokens baseada em mquinas de
estado que varrem o cdigo e formam os tokens
presentes
Autmatos finitos so utilizados para reconhecer os
possveis tokens que a linguagem pode dar suporte
Esta fase verifica se os caracteres lidos pertencem
ou no ao alfabeto da linguagem
Os comentrios e caracteres brancos (espao,
tabulao, quebra de linha) so descartados
durante a leitura 10
An. Lxica An. Lxica An. Lxica An. Lxica int soma = 10 ; int soma = 10;
6
Fases da Compilao
Anlise Sinttica
Tem como objetivo verificar se a corretude do
programa validando suas estruturas (comandos,
declaraes, expresses,...) com as regras
sintticas da linguagem (parsing)
Recebe como entrada a lista de tokens fornecida
pela anlise lxica e gera uma rvore sinttica
(AST) que uma representao do cdigo-fonte
Usaremos um trecho de cdigo da linguagem Mini-
Triangle do livro-texto adotado na disciplina para
exemplificar parsing e gerao da rvore sinttica
11
let
var n : integer;
var c: char
in
begin
c := &;
n := n + 1
end
Fases da Compilao
AST
12
n
sequentialDeclaration
Program
LetCommand
VarDeclaration VarDeclaration
Ident. Ident.
integer
SimpleT.
c
Ident.
char
SimpleT.
sequentialCommand
AssignCommand AssignCommand
Ident.
CharExpr.
CharLit.
&
SimpleV.
c
Ident.
...
7
13
Fases da Compilao
1
+
Program
LetCommand
sequentialCommand
AssignCommand
IntExpr.
Op.
BinaryExpr.
...
IntLit.
SimpleV.
n
Ident.
n
Ident.
SimpleV. VnameExpr.
...
Anlise Contextual
Tem como objetivo a aplicao das regras de
escopo e de tipo sobre o programa
Recebe como entrada a rvore sinttica fornecida
pela anlise sinttica e atualiza esta mesma rvore
com os resultados geradas da aplicao das regras
mencionadas acima
AST decorada = AST + regras de escopo e tipo
aplicadas aos ns
Aplica regras de tipo sobre os identificadores para:
Detectar identificadores sem declaraes
Resolver identificadores com mais de um escopo
Aplica regras de tipo sobre as expresses para:
Determinar o tipo de uma expresso a partir de suas
sub-expresses
Verificar se os termos de uma expresso so ou no
compatveis
14
Fases da Compilao
8
AST decorada
15
Fases da Compilao
n
sequentialDeclaration
Program
LetCommand
VarDeclaration VarDeclaration
Ident. Ident.
integer
SimpleT.
c
Ident.
char
SimpleT.
sequentialCommand
AssignCommand AssignCommand
Ident.
CharExpr.
CharLit.
&
SimpleV.
c
Ident.
...
: int : char
: char : char
: char
16
Fases da Compilao
1
+
Program
LetCommand
sequentialCommand
AssignCommand
IntExpr.
Op.
BinaryExpr.
...
IntLit.
SimpleV.
n
Ident.
n
Ident.
SimpleV. VnameExpr.
...
: int
: int
: int
: int
: int
: int
: int
9
Gerao de cdigo
Tem como objetivo atribuir significado s
construes da linguagem de programao
Os significados so modelados atravs de funes
semnticas que so definidas para gerarem
instrues na linguagem destino semanticamente
equivalentes quelas da linguagem-fonte
Para tal, normalmente utilizam-se templates de
cdigo na linguagem destino
17
Fases da Compilao
let
var n : integer;
var c: char
in
begin
c := &;
n := n + 1
end
PUSH 2
LOADL 38
STORE 1[SB]
LOAD 0[SB]
LOADL 1
CALL add
STORE 0[SB]
POP 2
HALT
Compiladores
Passos da Compilao
10
Passos da Compilao
Um passo a travessia completa do
programa-fonte ou de uma representao do
mesmo (AST)
Um compilador de passo nico realiza uma nica
travessia no programa
Um compilador de mltiplos passos realiza diversas
travessias
O projeto de um compilador diretamente
relacionado com o nmero de passos que ele
realiza
Numa linguagem como C, declaramos tudo antes de
usar, pois o compilador trabalha em passo nico
Em Java, porm, podemos declarar atributos e
mtodos em quaisquer ordem pois o compilador
Java realiza mais de uma travessia na compilao
19
Compilador de passo nico
O mdulo principal do compilador chama o
analisador sinttico que realiza suas atividades
juntamente com as da anlise contextual e gerao
de cdigo (chamando os mdulos correspondentes),
medida que l e analisa o programa (em blocos)
Os blocos analisados precisam ser apropriados para
serem analisados sintatica e contextualmente e
ainda para ser possvel a gerao de cdigo
correspondente
20
Passos da Compilao
Analisador
Sinttico
Analisador
Contextual
Gerador de
Cdigo
Mdulo
Principal
11
Compilador de mltiplos passos
O mdulo principal do compilador chama cada um
dos mdulos responsveis pela anlise sinttica,
anlise contextual e gerao de cdigo
Neste sentido, o programa-fonte processado em
etapas distintas (uma de cada vez)
21
Passos da Compilao
Mdulo
Principal
Analisador
Sinttico
Analisador
Contextual
Gerador de
Cdigo
Passos em projeto de compiladores
Existem alguns aspectos importantes que devem
ser discutidos antes de se iniciar a construo de
um compilador
Velocidade
O compilador precisa ser o mais eficiente possvel?
A velocidade neste caso, sinnimo de sucesso ou
fracasso para o projeto em questo?
Neste aspecto, um compilador de passo nico possui
vantagem sobre o de mltiplos passos
Espao
A mquina onde ser executado o compilador possui
memria insuficiente?
A aquisio de memria adicional neste caso
impeditivo ao sucesso do projeto?
Neste aspecto, um compilador de mltiplos passos
possui vantagem sobre o de passo nico
22
Passos da Compilao
12
Modularidade / Flexibilidade
O compilador a ser construdo precisa ser modular e
extensvel?
A manuteno do compilador ser uma tarefa
frequente?
Neste aspecto, um compilador de mltiplos passos
possui vantagem sobre o de passo nico
Caractersticas da linguagem fonte
A linguagem possui estruturas que necessitam mais
de uma travessia (passo) para anlise?
Como mencionado anteriormente, linguagens como C
e Java possuem estruturas completamente diferentes
que eventualmente precisam ou no de mais de uma
travessia no cdigo-fonte para a verificao de erros
23
Passos da Compilao

You might also like