2
Compiladores
Um compilador é um programa que traduz um programa escrito numa linguagem fonte para outro equivalente escrito numa linguagem alvo.
Compiladorprograma
fonteprograma
alvo
mensagensde erro
3
esqueleto do programa fonte
pre-processador
programa fonte
COMPILADOR
programa alvo em assembler
montador
código de máquina relocável
carregador
código de máquina absoluto
bibliotecas, arquivos,objetos relocáveis
O contexto de um compilador
4
Análise e Síntese
Análise
– Divide o programa fonte em partes
– cria uma representação intermediária (árvores sintáticas)
Síntese
– constrói o programa alvo
:=m
dptp
+*60
Ferramentas que fazem análise:• Editores de estruturas• Pretty printers• Verificadores estáticos• Interpretadores• Formatadores de texto• Interpretadores de consultas
5
Análise do programa fonte
• Análise léxica (linear ou scanning)
• Análise sintática (hierárquica ou gramatical)
• Análise semântica (restrições sensíveis ao contexto: tipos, coerções, ... )
6
Análise LéxicaCaracteres são agrupados em Tokens
montante := deposito_inicial + taxa_de_juros * 60
É decomposto nos seguintes tokens:• Identificador montante • Símbolo de atribuição :=• Identificador deposito_inicial• Sinal de adição• Identificador taxa_de_juros• Sinal de multiplicação• Número 60
7
Análise Sintática
• Agrupa os tokens do programa fonte em frases gramaticais.
• Reconhece a estrutura gramatical do programa fonte a qual é representada por uma árvore gramatical.(árvore gramatical = árvore de parser = árvore de derivação)
• Devolve uma árvore sintática (sintaxe abstrata)
8
Árvore de derivação (gramatical)
enunciado de atribuição
:=identificador
identificador
identificador
montante
deposito_inicial
taxa_de_juros 60
expressão
expressão expressão+
*expressão expressão
número
9
Árvore sintática
Uma árvore sintática (ou sintaxe abstrata) é uma representação condensada da árvore gramatical
:=
montante
deposito_inicial
taxa_de_juros 60
+
*
10
Definição da Sintaxe dos programas• A estrutura gramatical dos programas é expressa
recursivamente • Por exemplo, podemos definir expressões pelas
regras:– Qualquer identificador é uma expressão.– Qualquer número é uma expressão.– Se expressão1 e expressão2 são expressões, então
também o são– expressão1 + expressão2– expressão1 * expressão2– (expressão1)
• Formalismo usado: GLCs.
11
Qual é divisão entre léxico e sintático?
• Construções léxicas requerem somente de algum mecanismo de repetição– Em geral, tudo o que se pode descrever com
expressões regulares
• Construções sintáticas requerem recursividade
12
Análise Semântica
• Verifica erros semânticos detectáveis estaticamente– verificação de tipos, resolução de sobrecarga, coerção,
variáveis inicializadas antes de serem usadas, ...
:=
montante
deposito_inicial
taxa_de_juros
60
REAL-ADD
REAL-MULT
inttoreal
As fases de um Compiladorprograma fonte
analisador léxico
analisador sintático
analisador semântico
gerador de código intermediário
otimizador de código
gerador de código
gerenciador da tabela de símbolos
tratador de erros
programa alvo
14
Passagens
Por eficiência, é comum que várias fases sejam agrupadas numa única passagem
15
O agrupamento das fases• front-end (vanguarda)
– as fases que dependem mais do programa fonte• análise léxica, sintática e semântica e geração de código
intermediário.
• back-end (retaguarda)– as fases que dependem mais do programa alvo
• geração e otimização de código
• Interface entre vanguarda e retaguarda– Código intermediário
16
Portabilidade e Modularidade
Java
ML
Pascal
C
C++
Sparc
MIPS
Pentium
Alpha
Java
ML
Pascal
C
C++
Sparc
MIPS
Pentium
Alpha
CódigoIntermediário
vanguardas retaguardas
17
Os primos do compilador• Pré-processadores
– processadores de macros,
– inclusão de arquivos,
– extensões de linguagens (p.e. linguagens de consulta embutidas)
– Lings. de Marcação com páginas dinâmicas (JSP, ASP, ....)
• Montadores (Ensambladores) produzem código de máquina relocável
18
Ferramentas
• Geradores de analisadores gramaticais
• Geradores de analisadores léxicos
• Dispositivos de tradução dirigida pela sintaxe
• Dispositivos de fluxo de dados
• Geradores de tradutores dirigidos por semântica
19
Resumo• O que é um compilador
– Análise sintática, análise semântica e síntese
– O contexto de um compilador
• As fases de um compilador
• Ferramentas
Referências: Capítulos 1 do Dragão e do Tigre