Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução à Compiladores
1
Tradutor de linguagens de programação
2
LP compilada e interpretada
• Fluxo de execução de programas compilados e interpretados
• Operação gerenciada pelo SO
3
LP compilada e interpretada
• Compiladores
• Um compilador interpreta um código fonte (alto nível) e gera
um código em linguagem objeto (linguagem de máquina ou
executável)
• O código gerado pode ser executado uma ou mais vezes
(arquivo .exe)
• Uma vez compilado, o programa pode ser executado
indefinidamente, sem a necessidade de uma nova
compilação, até que o código fonte seja alterado
• Exemplo de linguagem compilada
• Linguagem C, Pascal, etc...
4
LP compilada e interpretada
• Interpretadores
• O interpretador traduz o código fonte instrução a instrução
enquanto ele vai sendo executado
• Toda vez que o programa for novamente executado, todo o
processo de interpretação deve ser feito
• Exemplo de linguagem interpretada
• JavaScript, PHP, etc...
• compilada
• Linguagem C, Pascal, etc...
5
LP compilada e interpretada
• Compiladores vs. interpretadores
• Vantagens de códigos compilados
• Geralmente são mais rápidos, pois não requerem a conversão para
linguagem de máquina em tempo de execução
• Depois de compilados, podem ser executados indefinidamente
• Nova compilação apenas se o código fonte for alterado
7
O que é um compilador?
• Nesse processo de tradução, há duas tarefas básicas
a serem executadas por um compilador:
• Análise: em que o texto de entrada (na linguagem fonte) é
examinado, verificado e compreendido
• Síntese: ou geração de código, em que o texto de saída (na
linguagem objeto) é gerado, de forma a corresponder ao
texto de entrada
8
O que é um compilador?
• Um dos modelos possíveis para a construção de
compiladores faz a separação total entre o front-end,
encarregado da fase de análise, e o back-end,
encarregado da geração de código, de forma que:
• O front-end e back-end se comuniquem apenas através da
representação intermediária
• O front-end depende exclusivamente da linguagem fonte
• O back-end depende exclusivamente da linguagem objeto
9
O que é um compilador?
• Essa ideia visa simplificar a implementação de várias
linguagens de programação para várias máquinas:
• Basta escrever um front-end para cada linguagem, e um
back-end para cada máquina
10
O que é um compilador?
• Um compilador típico consiste de algumas fases onde
cada uma passa sua saída para as fases seguintes
11
Fases de Compilação
Programa Fonte
Analisador Léxico
Analisador Sintático e
Semântico
Gerador de Código
Tabela de Símbolos Manipulador de Erros
Intermediário
Otimizador de Código
Intermediário
Gerador de Código
Programa Objeto
12
Análise Léxica
• Também chamada de scanner
• Agrupa caracteres em símbolos (ou tokens)
• Entrada: fluxo de caracteres
• Saída: fluxo de símbolos
• Símbolos são:
• Palavras reservadas, identificadores de variáveis e
procedimentos, operadores, pontuação, ...
13
Análise Léxica
Por exemplo, os caracteres na instrução de atribuição position =
initial + rate * 60 seria agrupada nos seguintes tokens:
• O identificador position
• O símbolo de atribuição =
• O identificador initial
• O símbolo de adição +
• O identificador rate
• O símbolo de multiplicação *
• O número 60
14
Análise Sintática
• Também chamada de parser
• Agrupa símbolos em unidades sintáticas
• Ex: os 3 símbolos A+B podem ser agrupados em uma
estrutura chamada expressão
• Expressões depois podem ser agrupados para formar
comandos ou outras unidades
• Saída: representação árvore de parse do programa
15
Análise Sintática
Assigment
statement
identifier expression
:=
expression
position expression +
*
expression expression
identifier
identifier
initial number
rate
Árvore de parse para position := initial + rate * 60 60
16
Análise Semântica
17
Gerador de código intermediário
• Usa as estruturas produzidas pelo analisador
sintático e verificadas pelo analisador
semântico para criar uma sequência de
instruções simples (código intermediário)
• Está entre a linguagem de alto nível e a
linguagem de baixo nível
18
Gerador de código intermediário
• Considere que temos um único registrador
acumulador
• Considere o comando de atribuição
x := a + b * c, pode ser traduzido em:
t1:= b*c
t2:= a+t1
x:= t2
• Pode-se fazer um gerador de código relativamente
simples usando regras como:
19
Gerador de código intermediário
• O comando de atribuição
x := a + b * c
Gera o código
1 Load b { t1:= b*c}
2 Mult c
3 Store t1
4 Load a { t2:= a+t1}
5 Add t1
6 Store t2
7 Load t2 { x:=t2}
8 Store x
21
Otimizador de Código
• Independente da máquina
• Melhora o código intermediário de modo que o
programa objeto seja menor (ocupe menos
espaço de memória) e/ou mais rápido (tenha
tempo de execução menor)
• A saída do otimizador de código é um novo
código intermediário
22
Gerador de código
• Produz o código objeto final
• Toma decisões com relação à:
• Alocação de espaço para os dados do programa
• Seleção de quais registradores serão usados, etc.
• Definição de quais registradores serão usados, etc.
23
Gerador de código
• Várias considerações têm que ser feitas:
• Há vários tipos de instruções correspondendo a vários tipos
de dados e a vários modos de endereçamento
• Há instruções de soma específicas, por exemplo para
incrementar/decrementar de 1
• Algumas somas não foram especificadas explicitamente:
• Cálculo de endereço de posições em vetores
• Incremento/decremento registrador de topo de pilha
• Local onde armazenar variáveis
• Alocação de registradores
24
Otimizador peephole
25
Tabela de símbolos
• É uma estrutura de dados usada para guardar
informações a respeito de todos os nomes
usados pelo programa e registrar informações
importantes associadas a cada um, tais como
seu tipo (inteiro, real, etc.), tamanho, escopo,
etc
26
Manipulador de erros
• É ativado sempre que for detectado um erro no
programa fonte
• Deve avisar o programador da ocorrência do erro
emitindo uma mensagem, e ajustar-se novamente à
informação sendo passada de fase a fase de modo a
poder completar o processo de compilação
• Mesmo que não seja mais possível gerar código objeto, a
análise léxica e sintática deve prosseguir até o fim
27
Onde aprender mais
28