Vous êtes sur la page 1sur 47

Universidade Federal da Bahia

Instituto de Matemática
Departamento de Ciência da Computação
Disciplina: MATA61 – Compiladores

Cliquez pour modifier le style du titre


Compiladores

Profa. Vaninha Vieira

Salvador, Ago/2019
Cliquez pour modifier le style du titre

Parte 0 - Sobre o curso


Motivação do Curso

§  Conhecimento das estruturas, técnicas e algoritmos


usados na implementação de linguagens

§  Aplicabilidade freqüente na solução de problemas


que exigem alguma forma de tradução entre
linguagens ou notações

§  Implementação de linguagens para um domínio


específico

3
Arquitetura Geral de um Compilador

4
Objetivos

§  Introdução à construção de linguagens e


compiladores
§  Noções básicas de compiladores, interpretadores e
analisadores
§  Análise
•  Análise léxica, sintática e semântica
§  Síntese
•  Geração de código
•  Estratégias para otimização de código
5
Porque Estudar o Funcionamento dos
Compiladores?
§  Especificação / Implementação de L.P.
•  Uso geral: novas, extensões e atualizações
•  Específico: Tempo Real, robótica, descrição de HW, SO, BD,
Protocolos, Interfaces
§  Entender melhor as Linguagens de Programação
•  Escolha e uso mais racional/eficiente
§  Uso de técnicas / ferramentas em outros sistemas
•  Processamento de texto, linguagens naturais
§  Teoria densa, mas aplicada
•  Sintetiza linguagens formais
§  Interface com diversas disciplinas:
•  SO, arquitetura, ling. Formais, T. Computação, programação

6
Plano do Curso

q Introdução à compilação de programas


q Representações de linguagens
q Análise Léxica
q Análise sintática
q Análise semântica
q Geração de código
q Técnicas de otimização de código
q Ambientes de execução
q Tópicos Avançados e estudo de casos

7
Metodologia e Dinâmica das Aulas

§  A disciplina será trabalhada buscando uma participação


efetiva dos alunos na descoberta e compreensão dos
conteúdos
§  As aulas incluirão
•  Sessões expositivas
•  Apresentação e análise de estudo de casos, ferramentas,
seminários, vídeos e artigos selecionados
•  Desenvolvimento de projetos práticos

8
Bibliografia

§  Livros – Bibliografia Basica


•  AHO, A. et al. Compiladores: princípios, técnicas e ferramentas. 2a
edição, Addison-Wesley, 2008.
•  LOUDEN, K. C.. Compiladores: Princípios e Práticas. Editora
Thompson Pioneira, 1a edição, 2004.
•  PRICE, Ana Maria e TOSCANI, Simão Sirineo. Implementação de
linguagens de programação: Compiladores. Ed.Sagra-Luzzatto/
UFRGS – Série Livros Didáticos. 2a. Ed. 2001.
•  WATT, D. A. e BROWN, D. F. Programming Language Processors in
Java. Prentice-Hall, 2000.
•  RICARTE, I. Introdução à Compilação, Editora Campus, 2008.
§  Artigos
§  Sites na Internet
Existem muitos recursos disponiveis na internet!! 9
Avaliação (sujeito a mudanças)

Pi – Provas conceituais (individual)


Projeto – Projeto de um Compilador (equipes de 2-3 pessoas)
Outros – Seminário + O que ocorrer

§  NF = 0,3 * P1 + 0,3 * P2 + 0,3* Projeto + 0,1 * Outros

10
Cliquez pour modifier le style du titre

Tradução de Linguagens

Grande parte dos slides a seguir foram adaptados a partir dos cursos
dos professores: Lais Salvador, UFBA e André Santos, UFPE.
O que é uma Linguagem de Programação?

§  Notação formal para expressar algoritmos


§  Um método padronizado para expressar instruções
para um computador
§  Permite que um programador especifique
•  sobre quais dados o computador vai atuar
•  como estes dados serão armazenados ou transmitidos e
•  quais ações devem ser tomadas sob várias
circunstâncias

12
Evolução das LP’s quanto ao
Nível de Abstração
A area de um triângulo
Linguagem Natural
é igual a b*h/2

class Triangle {
Linguagem de Alto Nivel ...
float surface()
return b*h/2;
}

LOAD r1,b
Linguagem Simbolica LOAD r2,h
MUL r1,r2
DIV r1,#2
RET

00010010010001010010010
Linguagem de Maquina
01110110010101101001...
13
Alguns conceitos suportados por
linguagens de alto nível
§  Uso de expressões, usando notação semelhante à
matemática;
§  tipos de dados primitivos e compostos;
§  estruturas de controle como if-then-else, while,
for etc.;
§  declarações de variáveis, tipos, funções,
procedimentos etc.;
§  abstração: o que é feito X como é feito;
§  encapsulamento (ou abstração de dados):
classes, pacotes, módulos (orientação a objetos).

14
Aspectos na concepção de uma linguagem

§  Sintaxe: gramática (forma)


§  Semântica: significado
§  Pragmática (ex.: metodologias)
§  Processadores:
§  Sistemas que manipulam programas expressos em
alguma linguagem de programação
•  ambientes visuais, editores...
•  Tradutores

15
Tradutor

§  Recebe um texto expresso em uma linguagem fonte e


gera um texto semanticamente equivalente em uma
linguagem destino.
•  Chinês para inglês
•  Java para C
•  Java para x86

Texto-Fonte Texto-Objeto
(redigido em ling. fonte) Tradutor (redigido em ling. objeto)

16
O que é um compilador?

§  Um tipo de tradutor


§  Um dos módulos básicos do software de um computador
•  Software de aplicação x Software básico

§  Função: efetuar, automaticamente, a tradução de


textos, redigidos em
uma determinada linguagem de programação, para alguma outra forma
que viabilize sua execução pelo computador
•  em geral, em linguagem de máquina

Programa-Fonte Programa-Objeto
(Ling. Alto Nível) Compilador (Ling. Baixo Nível)

17
Compilador

§  Traduz de uma linguagem de alto nível para uma linguagem


de baixo nível
•  C para Assembler
•  Java para C
•  Java para x86

Programa-Fonte Programa-Objeto
(Ling. Alto Nível) Compilador (Ling. Baixo Nível)

18
Atividades adicionais do compilador

1. Detecção e recuperação de erros


2. Permite a inclusão de comentários no código
fonte, facilitando a compreensão.
As linhas de comentário são reproduzidas no código-
objeto?
3. Comandos de controle de compilação

19
Outros Tipos de Processadores de
Linguagem

§  Tradutor
§  Compilador
§  Filtro
§  Pré-processador
§  Montador
§  Interpretador

20
Filtro

§  Traduz de uma linguagem de alto nível para outra


linguagem de alto nível (muito semelhante à linguagem fonte)
•  C para C++

Programa-Fonte Programa-Objeto
(Ling. Alto Nível A) Filtro (Ling. Alto Nível B)

21
Pré-Processador

§  Traduz entre 2 dialetos de uma mesma linguagem


§  Antes da compilação
§  Converte um texto fora de formato para uma forma
padronizada
§  Extensões da linguagem

Programa-Fonte Pré- Programa-Objeto


(Ling. Alto Nível A) processador (Ling. Alto Nível A)

22
Montador

§  Traduz de uma linguagem de montagem para o código de


máquina correspondente
•  Assembler para x86

Programa-Fonte Programa-Objeto
(Ling. Montagem) Montador (Ling. Maquina)

23
Montador X Compilador

§  Montador
§  1:1 à Uma instrução de máquina para cada instrução em
linguagem assembler

§  Compilador
§  1:M à Cada linha de comando da linguagem de alto-nível
produz várias instruções de máquina

24
Interpretador

25
Cliquez pour modifier le style du titre

Compilador x Interpretador
Compilador x Interpretador

27
Compilador x Interpretador

28
Interpretador x Compilador

§  Interpretador §  Compilador


•  Programa fonte à executa •  Programa fonte à programa
imediatamente objeto
•  Lê, analisa e executa as •  Tempo de espera pela
instruções, uma de cada vez compilação
•  Mais Lento à Execução (ling •  Execução dos programas com
alto nível) até 100x mais lenta máxima performance, em
que a versão compilada linguagem de máquina
•  Mais flexível à podem interagir
com o ambiente mais facilmente
•  Mais portável

Uso de máquinas virtuais


Tecnologias de compilação JIT (just in time)
- Interpretação em blocos (ao invés de linha a linha)
- Melhor dos mundos: portabilidade + flexibilidade + rapidez
29
Exemplos de Linguagens
Interpretadas x Compiladas
§  Interpretadas §  Compiladas
§  Funcionais §  Imperativas
•  Lisp, Scheme... •  Fortran, Pascal, C
§  baseadas em Lógica §  Orientadas a Objeto
•  Prolog, ...
•  C++, Eiffel
§  Orientada a objetos
§  Funcionais
•  Ruby, Python, PHP
•  Common LISP, ML
§  de Script
•  JavaScript, Shell, Perl, SQL,
LUA

Just in time (Híbridas)


- Java, .NET
30
Cliquez pour modifier le style du titre

Arquitetura de um Compilador e
Processo de Compilação
Relacionamento dos compiladores com outros
elementos de um sistema de programação

HARDWARE

Linguagem de máquina Sistema Operacional

Montadores Compiladores/interpretadores
Ling. de baixo nível Ling. de alto nível

Ling. para resolução de problemas específicos

INTERFACE COM USUÁRIO


32
O processo de Compilação

Compilador

begin
if x = 5 then
...
1100111
+ params output 0011100011

Programa Fonte Programa Objeto

Análise Síntese
parte o programa fonte em Constrói o programa alvo
peças constituintes criando desejado (em código de
uma representação máquina) a partir da
intermediaria do programa. representação intermediaria.
33
Analise e Sintese

Análise

Análise Análise
Análise
Léxica Semântica
Sintática

Geração do Otimização
Código do Código

Síntese

A parte da síntese é a que requer técnicas mais especializadas. 34


Fases de Compilação

Código
fonte Análise Léxica

implementação
Tokens e
Lexemas
abstração

Análise Sintática Árvore


sintática Análise Semântica

Árvore
decorada

Código
Geração de Código
alvo
35
Análise Léxica (Scanning)

§  Código fonte -> sequência de tokens


•  Símbolos como identificadores, literais,
operadores, palavras-chave, pontuação etc.

if (n == 0) { if LPAR id assign
"n"
return 1;
} else {
... intLit RPAR LCUR return
} "0"

intLit comm RCUR else


"1"

36
Análise Sintática (Parser)

§  Agrupa caracteres ou Tokens em uma estrutura


hierárquica com algum significado
§  Determina se uma dada cadeia de entrada
pertence ou não à linguagem definida por uma
gramática

A seguinte construção
é válida? int y = 0,k = 0;
int x = y+++k;
37
Análise Sintática (Parser)

38
Análise Semântica (Contextual)

§  Verifica se o programa está de acordo com as


restrições contextuais da linguagem fonte

§  Em uma linguagem com tipos estáticos e ligação


estática:
•  Verifica regras de escopo
•  Verifica regras de tipos

§  Duas fases:


•  Identificação
•  Verificação

39
Análise Semântica (Contextual)

40
Geração de Código Intermediário

§  Usa as estruturas produzidas pelo analisador


sintático e verificadas pelo analisador semântico
para criar uma seqüência de instruções simples
seqüência de instruções simples (código
intermediário)
§  Está entre a linguagem de alto nível e a linguagem
de baixo nível

41
Geração de Código Intermediário

§  Código de Três Endereços

42
Otimização 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.

43
Geração de Código Objeto

§  Produz o código objeto final


§  Toma decisões com relação à:
•  Alocação de espaço para os dados do programa;
•  Seleção da forma de acessá-los;
•  Definição de quais registradores serão usados, etc.
§  Projetar um gerador de código que produza
programas objeto eficientes é uma das tarefas mais
difíceis no projeto de um compilador

44
Fases de um compilador

45
Para Casa

§  Fazer revisão de LFA


Revisão e
Estudo •  Alfabeto
•  Cadeia
•  Fechamento de um conjunto
•  Regra de produção
•  Expressões regulares
•  Gramáticas
§  Regulares e Livre de Contexto
§  Com atributos

46
Universidade Federal da Bahia
Instituto de Matemática
Departamento de Ciência da Computação
Disciplina: MATA61 – Compiladores

Cliquez pour modifier le style du titre


Compiladores

Profa. Vaninha Vieira

Salvador, Ago/2019

Vous aimerez peut-être aussi