0% acharam este documento útil (0 voto)
61 visualizações28 páginas

Compiladores

1) O documento introduz os conceitos de compiladores e tradutores de linguagens de programação, destacando as diferenças entre linguagens compiladas e interpretadas. 2) É explicado que compiladores traduzem código-fonte para código de máquina enquanto interpretadores fazem isso em tempo de execução. 3) As principais fases de um compilador são apresentadas: análise léxica, sintática, semântica, geração de código intermediário e otimização.

Enviado por

NATALY Oliveira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
61 visualizações28 páginas

Compiladores

1) O documento introduz os conceitos de compiladores e tradutores de linguagens de programação, destacando as diferenças entre linguagens compiladas e interpretadas. 2) É explicado que compiladores traduzem código-fonte para código de máquina enquanto interpretadores fazem isso em tempo de execução. 3) As principais fases de um compilador são apresentadas: análise léxica, sintática, semântica, geração de código intermediário e otimização.

Enviado por

NATALY Oliveira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy