Você está na página 1de 57

Compiladores

Compiladores

Profa. Beatriz Trinchão Andrade


beatriz@ufs.br

Departamento de Computação - UFS

Profa. Beatriz Trinchão Andrade 1 / 54


Compiladores

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 2 / 54
Compiladores
Introdução

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 3 / 54
Compiladores
Introdução

Vimos na aula anterior:

I Por que estudar compiladores?


I Quais são os pré-requisitos?

Profa. Beatriz Trinchão Andrade 4 / 54


Compiladores
Introdução

Introdução

I Linguagens de programação

Profa. Beatriz Trinchão Andrade 5 / 54


Compiladores
Introdução

Introdução

I Linguagens de programação
I Notação para descrição de computação
I Linguagem deve ser traduzida para uma forma executável por
um computador

Profa. Beatriz Trinchão Andrade 5 / 54


Compiladores
Introdução

Compiladores

I Compiladores
I Sistemas de software que fazem essa tradução
I Programa em linguagem-fonte → programa em
linguagem-objeto ou erros
I Relatar erros

Profa. Beatriz Trinchão Andrade 6 / 54


Compiladores
Histórico

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 7 / 54
Compiladores
Histórico

Histórico

I Arquitetura de John von Neumann (fim dos anos 40)


I Computador de programa armazenado
I Escrita de sequências de código (programas)
I Inicialmente em linguagem de máquina
C7 06 0000 0002 (Intel 8x86)

Profa. Beatriz Trinchão Andrade 8 / 54


Compiladores
Histórico

Histórico

C7 06 0000 0002

I Evolução para linguagem de montagem (assembly)


I Instruções e localizações de memória têm formas simbólicas

Profa. Beatriz Trinchão Andrade 9 / 54


Compiladores
Histórico

Histórico

MOV X, 2
I Montador (assembler) faz a tradução da linguagem de
montagem para a de máquina
I Linguagem de montagem é dependente da máquina

Profa. Beatriz Trinchão Andrade 10 / 54


Compiladores
Histórico

Histórico

I Em 1952, Grace Hopper escreve um compilador para a


linguagem de programação do sistema A-0
I Linguagem de alto nı́vel
I Mais próxima da linguagem natural ou matemática
I Independente de máquina

X = 2
I Linguagem Fortran
I Desenvolvida por John Backus (IBM) entre 1954 e 1957

Profa. Beatriz Trinchão Andrade 11 / 54


Compiladores
Histórico

Histórico

I Noam Chomsky
I Estudos da estrutura da linguagem natural
I Construção de compiladores mais simples e parcialmente
automática
I Classificação das linguagens de acordo com complexidade de
suas gramáticas (hierarquia de Chomsky)
I Décadas de 1960 e 1970: estudo de algoritmos para
reconhecimento de linguagens livres de contexto (parsing)

Profa. Beatriz Trinchão Andrade 12 / 54


Compiladores
Histórico

Histórico

I Técnicas de otimização
I Estudos da estrutura da linguagem natural
I Automatização da análise sintática (geradores de analisadores
sintáticos)
I Geradores de sistemas de varredura (analisadores léxicos)
I Ambientes de desenvolvimento integrado (IDEs)

Profa. Beatriz Trinchão Andrade 13 / 54


Compiladores
Contexto de um compilador

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 14 / 54
Compiladores
Contexto de um compilador

Contexto de um compilador

Profa. Beatriz Trinchão Andrade 15 / 54


Compiladores
Contexto de um compilador

Contexto de um compilador

I Pré-processador
I Coleta de código distribuı́do em diferentes arquivos
I Deleção de comentários
I Substituição de macros
I Montador (assembler)
I Recebe código em Assembly
I Traduz para código de máquina relocável (referências e
endereços de memórias são simbólicos)

Profa. Beatriz Trinchão Andrade 16 / 54


Compiladores
Contexto de um compilador

Contexto de um compilador

I Editor de Ligação (organizador, linker)


I Coleta código compilado separadamente (ou montado como
arquivos-objeto distintos)
I Gera um arquivo diretamente executável
I Diferença entre código objeto e código de máquina executável
I Conecta um programa-objeto ao código para a biblioteca de
funções padrão e recursos fornecidos pelo SO
I Dependente do SO e do processador

Profa. Beatriz Trinchão Andrade 17 / 54


Compiladores
Contexto de um compilador

Contexto de um compilador

I Carregador (loader)
I Reúne todos os arquivos de objeto executáveis na memória
para execução
I Resolve os endereços realocáveis
I Geralmente é parte do SO

Profa. Beatriz Trinchão Andrade 18 / 54


Compiladores
Contexto de um compilador

Programas relacionados a compiladores

I Interpretador
I Também é um tradutor de linguagens
I Execução direta do programa-fonte
I Editor (IDEs)
I Depurador
I Registra muita ou toda a informação do código-fonte

Profa. Beatriz Trinchão Andrade 19 / 54


Compiladores
Contexto de um compilador

Programas relacionados a compiladores

I Gerenciador de perfil
I Coleta estatı́sticas de um programa-objeto durante sua
execução (número de chamadas a um procedimento, ou
porcentagem de tempo de execução gasto por cada um)
I Gerenciador de projeto

Profa. Beatriz Trinchão Andrade 20 / 54


Compiladores
A estrutura de um compilador

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 21 / 54
Compiladores
A estrutura de um compilador

Partes de um compilador

I Análise (front end)


I Divisão do programa fonte em partes
I Estrutura gramatical é imposta
I Criação de uma representação intermediária (árvores
sintáticas) e da tabela de sı́mbolos
I Sı́ntese (back end)
I Construção do programa alvo

Profa. Beatriz Trinchão Andrade 22 / 54


Compiladores
A estrutura de um compilador

Fases de um compilador

I Subdivisão das partes


I Podem ser agrupadas
I Representações intermediárias não precisam ser construı́das
I Tabela de sı́mbolos é usada em todas as fases

Profa. Beatriz Trinchão Andrade 23 / 54


Compiladores
A estrutura de um compilador

Fases de um compilador

Profa. Beatriz Trinchão Andrade 24 / 54


Compiladores
A estrutura de um compilador
Análise Léxica

Análise Léxica

Profa. Beatriz Trinchão Andrade 25 / 54


Compiladores
A estrutura de um compilador
Análise Léxica

Análise Léxica ou leitura (scanning)

I Agrupa caracteres em sequências significativas


I Lexemas
I Para cada lexema, produz um token

Profa. Beatriz Trinchão Andrade 26 / 54


Compiladores
A estrutura de um compilador
Análise Léxica

Análise Léxica

I Exemplo:
a[index] = 4 + 2

Profa. Beatriz Trinchão Andrade 27 / 54


Compiladores
A estrutura de um compilador
Análise Léxica

Análise Léxica

I Exemplo:
a[index] = 4 + 2
I Tokens

Profa. Beatriz Trinchão Andrade 28 / 54


Compiladores
A estrutura de um compilador
Análise Sintática

Análise Sintática

Profa. Beatriz Trinchão Andrade 29 / 54


Compiladores
A estrutura de um compilador
Análise Sintática

Análise Sintática

I Determina os elementos estruturais do programa e seus


relacionamentos
I Agrupa os tokens do programa fonte em frases gramaticais
I Reconhece a estrutura gramatical do programa-fonte
I Representada por uma árvore gramatical
I Árvore gramatical = árvore de parser = árvore de derivação
I Devolve uma árvore sintática mais simples
I Precedência

Profa. Beatriz Trinchão Andrade 30 / 54


Compiladores
A estrutura de um compilador
Análise Sintática

Análise Sintática
I Árvore gramatical para
a[index] = 4 + 2
I Exemplo simplificado de gramática: ”Gramatica.txt”

Profa. Beatriz Trinchão Andrade 31 / 54


Compiladores
A estrutura de um compilador
Análise Sintática

Análise Sintática

I Árvore sintática abstrata


I Representação condensada

Profa. Beatriz Trinchão Andrade 32 / 54


Compiladores
A estrutura de um compilador
Análise Semântica

Análise Semântica

Profa. Beatriz Trinchão Andrade 33 / 54


Compiladores
A estrutura de um compilador
Análise Semântica

Análise Semântica

I Significado do programa
I Atributos que podem ser determinados antes da execução,
mas que não devem ser expressos como sintaxe
I Semântica estática
I Declarações, verificação de tipos
I Reúne informações sobre os tipos
I Salvas na árvore ou na tabela

Profa. Beatriz Trinchão Andrade 34 / 54


Compiladores
A estrutura de um compilador
Análise Semântica

Análise Semântica

Profa. Beatriz Trinchão Andrade 35 / 54


Compiladores
A estrutura de um compilador
Geração de Código Intermediário

Geração de Código Intermediário

I Código intermediário ou representação intermediária


I Qualquer representação interna usada pelo compilador

Profa. Beatriz Trinchão Andrade 36 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário

Profa. Beatriz Trinchão Andrade 37 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário

I Uma das fases de otimização


I Tipos e posicionamento das fases de otimização podem variar
I Otimizador de Código Fonte
I Melhorias que dependem apenas do código fonte

Profa. Beatriz Trinchão Andrade 38 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário


I Otimizações feitas na árvore ou em uma versão linearizada da
mesma
I A expressão 4+2 pode ser computada pelo compilador
(empacotamento constante)

Profa. Beatriz Trinchão Andrade 39 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário


I Exemplo com código de três endereços:
I Passo 1
t = 4 + 2
a[index] = t

Profa. Beatriz Trinchão Andrade 40 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário


I Exemplo com código de três endereços:
I Passo 1
t = 4 + 2
a[index] = t

I Passo 2
t = 6
a[index] = t

Profa. Beatriz Trinchão Andrade 40 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Intermediário

Otimizador de Código Intermediário


I Exemplo com código de três endereços:
I Passo 1
t = 4 + 2
a[index] = t

I Passo 2
t = 6
a[index] = t

I Passo 3
a[index] = 6

Profa. Beatriz Trinchão Andrade 40 / 54


Compiladores
A estrutura de um compilador
Gerador de Código

Gerador de Código

Profa. Beatriz Trinchão Andrade 41 / 54


Compiladores
A estrutura de um compilador
Gerador de Código

Gerador de Código

I Gera código para a máquina alvo a partir do código


intermediário
I Foco nas propriedades da máquina
I Uso de instruções da máquina
I Decisões sobre representação de dados
I Exemplo: como armazenar inteiros para gerar código com
indexação?

Profa. Beatriz Trinchão Andrade 42 / 54


Compiladores
A estrutura de um compilador
Gerador de Código

Gerador de Código

I Exemplo com uma linguagem de montagem hipotética


I Convenções de C e inteiros com 2 bytes
I Exemplo

Profa. Beatriz Trinchão Andrade 43 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Alvo

Otimizador de Código Alvo

Profa. Beatriz Trinchão Andrade 44 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Alvo

Otimizador de Código Alvo

I Melhora do código alvo


I Escolha do modo de endereçamento
I Substituição de instruções lentas por instruções mais rápidas
I Eliminação de operações redundantes ou desnecessárias

Profa. Beatriz Trinchão Andrade 45 / 54


Compiladores
A estrutura de um compilador
Otimizador de Código Alvo

Otimizador de Código Alvo

I Exemplo:
I Uso de instrução de deslocamento ao invés de multiplicação
I Uso de modo de endereçamento mais poderoso

Profa. Beatriz Trinchão Andrade 46 / 54


Compiladores
Observações

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 47 / 54
Compiladores
Observações

Observações:

I Descrição dos passos é esquemática


I Compiladores apresentam variações em seus detalhes de
organização
I Fases descritas aqui estão presentes na maioria dos
compiladores

Profa. Beatriz Trinchão Andrade 48 / 54


Compiladores
Observações

Análise Léxica vs. Análise Sintática

I Construções léxicas requerem somente algum mecanismo de


repetição
I Em geral, tudo o que se pode descrever com expressões
regulares
I Construções sintáticas requerem recursividade
I Fases trabalham em conjunto

Profa. Beatriz Trinchão Andrade 49 / 54


Compiladores
Exercı́cios

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 50 / 54
Compiladores
Exercı́cios

Exercı́cios

I Analise a IDE que você usa e identifique onde estão as


configurações que definem as chamadas: ao compilador, ao
depurador, à ligação (linker) e ao carregamento (loader).
I Durante a aula, eu menciono o Valgrind como uma
ferramenta que analisa a execução de programas. Pesquise
outros gerenciadores de perfil.
I Em uma linguagem de sua escolha (escreva qual foi a
escolhida), dê dois exemplos de cada um dos seguintes erros:
I Léxico
I Sintático
I Semântico

Profa. Beatriz Trinchão Andrade 51 / 54


Compiladores
Exercı́cios

Exercı́cios

I Leia o arquivo Gramatica.txt e verifique como seu uso na


sequência de tokens vista em aula pode gerar a árvore do slide
30.
I Por que é feita uma multiplicação por 2 no slide 42?

Profa. Beatriz Trinchão Andrade 52 / 54


Compiladores
Referências

Sumário
Introdução
Histórico
Contexto de um compilador
A estrutura de um compilador
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimizador de Código Intermediário
Gerador de Código
Otimizador de Código Alvo
Observações
Exercı́cios
Referências
Profa. Beatriz Trinchão Andrade 53 / 54
Compiladores
Referências

Referências:

I Livro do Dragão, cap. 1.


I Livro do Louden, cap. 1.

Profa. Beatriz Trinchão Andrade 54 / 54

Você também pode gostar