Você está na página 1de 28

Universidade Federal de Pelotas

Curso de Engenharia da Computação


Introdução à Engenharia da Computação

Introdução à Compiladores

Profa. Míriam Blank Born


mbborn@inf.ufpel.edu.br

1
Tradutor de linguagens de programação

• 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

• Vantagens de linguagens interpretadas


• Maior rapidez para escrita, modificação e execução dos códigos
• Códigos podem ser parcialmente executados
• Maior flexibilidade
6
O que é um compilador?

• Um compilador é um programa que lê um


programa escrito em uma linguagem
(linguagem fonte) e a traduz em um programa
equivalente em outra linguagem (linguagem
alvo).

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

• Ou seja, para implementar m linguagens em n


máquinas, precisamos fazer m front-ends e n back-
ends, em vez de mn compiladores completos

10
O que é um compilador?
• Um compilador típico consiste de algumas fases onde
cada uma passa sua saída para as fases seguintes

• As principais fases são: análise léxica (ou scanner),


análise sintática (ou parser), análise semântica,
otimização, gerador de código e otimização peephole
(remove instruções redundantes)

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

• Verifica se estruturas sintáticas, embora


corretas sintaticamente, têm significado
inadmissível na linguagem

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

1- Toda operação aritmética (binária) gera 3 instruções:


Instrução Exemplo: b * c
Carrega o primeiro operando no acumulador Load b
Usa a instrução correspondente a
operação com o segundo operando, Mult c
deixando o resultado no acumulador
Armazena o resultado em
Store t1
uma temporária nova

2- Um comando de atribuição gera sempre duas instruções:


Instrução Exemplo: x := t2
Carraga o valor da expressão no acumulador Load t2
Armazena o resultado na variável Store x
20
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.

• Projetar um gerador de código que produza


programas objetos eficientes é uma das tarefas mais
difíceis no projeto de um compilador

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

• Módulo adicional de otimização de código


dependente de máquina

• Este otimizador tem por objetivo melhorar o


código de máquina para melhor aproveitar os
recursos específicos da arquitetura

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

COMPILADORES – Princípios, Técnicas e Ferramentas. Alfred


V. Aho; Monica S. Lam; Ravi Sethi; Jeffrey D. Ullman.
Segunda Edição. Editora Prentice-Hall.

28

Você também pode gostar