49
Compiladores – IF688 • Professor: André Santos • Home page do curso: http://www.cin.ufpe.br/~if688

Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Embed Size (px)

Citation preview

Page 1: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Compiladores – IF688

• Professor: André Santos• Home page do curso:

http://www.cin.ufpe.br/~if688

Page 2: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Motivação

• Conhecimento das estruturas e algorítmos usados na implementação de linguagens: noções importantes sobre uso de memória, eficiência, etc.

• 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.

• Geradores e analisadores de código.

Page 3: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Motivação

• A disciplina de compiladores faz uso de um grande número de conceitos estudados em outras disciplinas do curso: linguagens de programação, algorítmos, linguagens formais, arquitetura, engenharia de software.

Page 4: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Compilador

• Programa que lê um programa escrito em uma linguagem (fonte) e o traduz para uma outra linguagem (destino), reportando erros quando eles ocorrem.

Page 5: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Linguagens

• Linguagem fonte: C, Pascal, Java, Fortran, etc.

• Linguagem destino: linguagem de máquina (assembler) de um processador, de uma máquina virtual (e.g. Java ou .NET), ou qualquer outra linguagem (e.g. C).

Page 6: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Compilador

Programa fonte

Programa destino

Processadores de Linguagens: Compilador

Page 7: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Programa destinoentrada saída

Execução de um programa

Page 8: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

InterpretadorPrograma fonte

saída

Processadores de Linguagens: Interpretador

entrada

Page 9: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

MáquinaVirtual

Programa intermediáriosaída

Compilador Híbrido

entrada

Tradutor

Programa fonte

Page 10: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

compilador

preprocessador assembler

Linker /Loader

Programa fonte

Programa fonte modificado

Programa em assembler

Código objeto (relocável)

Código objeto (executável)

Bibliotecas /código objeto

Sistema de processamento de uma linguagem

Page 11: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Programas auxiliares do processo de compilação

• Preprocessadores: processam macros, incluem de arquivos, suportam compilação condicional e extensão de linguagens.

• Assemblers: servem como uma pequena abstração da arquitetura da máquina-destino. São na realidade um tradutor /compilador simples, de dois passos, que gera código relocável.

Page 12: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Programas auxiliares do processo de compilação (cont.)

• Carregadores (loaders) e linkeditores (linkers)– Ajustam o código relocável, resolvem

referências externas.

Page 13: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Compilação: Análise e Síntese

• Análise: quebra o código fonte em suas partes, e cria uma representação intermediária do programa.Verifica erros e constrói tabela de símbolos.

• Síntese: Constroi o programa-destino a partir da representação intermediária.

Page 14: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fases de um compilador

Analisador léxico

stream de caracteres

Código de máquina

Analisador sintático

Analisador semântico

Ger. de código intermediário

Otimizador de código

Gerador de código

stream de tokens

árvore sintática

árvore sintática

representação intermediária

representação intermediária

Page 15: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise: front-end do compilador (até geração de código intermediário)

Síntese: back-end do compilador

Page 16: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise do programa fonte

• Análise léxica – lê a seqüencia de caracteres e a organiza como tokens – sequencias de caracteres com algum significado

• Análise sintática – agrupa caracteres ou tokens em uma estrutura hierárquica com algum significado

• Análise semântica – verifica se os componentes de um programa se encaixam de forma a ter um significado adequado.

Page 17: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Programas baseados em análise

• Editores de programa dirigidos à sintaxe (comuns nos IDEs, como no Eclipse e Visual Studio)

• Pretty-printers• Interpretadores

Page 18: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Exemplo do processo de compilação

Page 19: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise léxica ou Scanning

• Lê os caracteres de entrada e agrupa-os em sequencias chamadas lexemas.

• Para cada lexema o analisador léxico produz como saída um token da forma

<nome do token, valor do atributo>

que é passado para a fase seguinte.

Page 20: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Exemplo

• position = initial + rate * 60

<identificador, 1><=><identificador, 2><+><identificador, 3><*><number, 60>

Page 21: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Tabela de Símbolos

identificador tipo …

1 position …

2 initial …

3 rate …

… … … …

Page 22: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise sintática ou parsing

• A partir dos tokens cria uma estrutura em árvore (árvore sintática) que representa a estrutura gramatical do programa.

Page 23: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Árvore Sintática

• position = initial + rate * 60

<id,2>

<id,3>

*

+

=

<id,1>

60

Page 24: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise semântica

• Verifica o programa em relação a possíveis erros semânticos e guarda informações adicionais

Page 25: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Exemplo: verificação de tipos

A expressão

x = x + 3.0

está sintaticamente correta, mas pode estar semanticamente certa ou errada, dependendo do tipo de x.

Page 26: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Análise Semântica

<id,2>

<id,3>

*

+

=

<id,1>

60

inttofloat

Page 27: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Código intermediário

• Idealmente deve ser fácil de produzir e também de traduzir para a linguagem-destino.

• Na prática, se está gerando código para uma máquina abstrata.

• Por exemplo, Three-address-code: usa três operandos por instrução, cada um como se fosse um registrador.

Page 28: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Código intermediário - exemplo

t1 = inttofloat(60)t2 = id3 * t1t3 = id2 + t2id1 = t3

Page 29: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Otimização de código

• Realiza transformações no código visando melhorar sua performance em aspectos de tempo de execução, uso de memória, tamanho do código executável etc.

Page 30: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Otimização de código - exemplo

t1 = inttofloat(60)t2 = id3 * t1t3 = id2 + t2id1 = t3

t2 = id3 * 60.0id1 = id2 + t2

Page 31: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Geração de código

• Realiza a alocação de registradores (se necessária) e a tradução do código intermediário para a linguagem-destino.

Page 32: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Geração de código

LDF R2, id3MULF R2, R2, #60.0LDF R1, id2ADDF R1, R1, R2STF id1, R1

Page 33: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Tabela de Símbolos

• Estrutura de dados usada para guardar identificadores e informações sobre eles: – alocação de memória, – tipo do identificador, – escopo (onde é válido no programa)– se for um procedimento ou função: número e

tipo dos argumentos, forma de passagem dos parâmetros e tipo do resultado.

Page 34: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Tabela de Símbolos

identificador tipo …

1 position …

2 initial …

3 rate …

… … … …

Page 35: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Organizando fases em passos

• Fases: visão lógica de um compilador• Em uma implementação as fases podem ser

agrupadas em um ou mais passos• Passos: número de vezes em que se passa

pelo mesmo código. • Por exemplo, em um assembler são

necessários pelo menos dois passos.

Page 36: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

C

x86

Front-end

Separação entre front-end e back-end para criação de múltiplos compiladores

código intermediário

Back-end

Front-endFront-end

Front-end

C#Pascal Fortran

Page 37: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Pascal

x86

Front-end

ARM

Separação entre front-end e back-end para criação de múltiplos compiladores

código intermediário

MIPS

.NET

Back-end Back-end

Back-end Back-end

Page 38: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

C

x86

Front-end

ARM

Separação entre front-end e back-end para criação de múltiplos compiladores

código intermediário

MIPS

.NET

Back-end Back-end

Back-end Back-end

Front-endFront-end

Front-end

C#Pascal Fortran

Page 39: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Ferramentas auxiliares para a construção de compiladores

• Scanner generators, baseados em expressões regulares. Exemplo: lex

• Parser generators, baseados em gramáticas livres de contexto. Exemplo: yacc

• Engenhos de tradução dirigida por sintaxe, geram rotinas para navegar na parse tree e gerar código intermediário

• Geradores de geradores de código (template matching)

• Toolkits de construção de compiladores

Page 40: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Contexto Histórico

• Demanda por linguagens de mais alto nível que linguagem de máquina e assembler.

• Nos anos 1950, compiladores eram programas notadamente difíceis de se escrever.

• Avanço teórico e de técnicas e ferramentas de implementação tornaram possível implementar compiladores muito mais facilmente.

Page 41: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Classificações: Gerações

① Linguagens de máquina② Linguagens de montagem (Assembly languages)③ Fortran, Cobol, Lisp, C, C++, C#, Java④ SQL, Postscript (Domain Specific Languages)

Page 42: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Classificações: Paradigma

Imperativo “como” Conceito de estado e comandos que mudam o

estado C, C++, C#, Java

Declarativo “o quê” ML, Haskell, Prolog

Page 43: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Classificações

Von Neumann: C, Fortran, Pascal Orientadas a Objetos: Simula 67, Smalltalk, C++,

C#, Java, Ruby Scripting Languages: Awk, JavaScript, Perl,

PHP, Python, Ruby, Tcl

Page 44: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

Estático x Dinâmico: Estático: em tempo de compilação Dinâmico: em tempo de execução

Page 45: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

Ambientes e Estados

nomes locais (variáveis)

ambiente estado

valores

Page 46: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

Escopo estático e estrutura de Blocos

Controle de Acesso Explícito public, private, protected

Page 47: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

• Escopo Dinâmico • Exemplo: macros em C

#define a (x+1)int x = 2;void b() {int x = 1; printf(%d\n”, a); }void c() {printf(“%d\n”, a); }void main() { b(); c(); }

Page 48: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

• Mecanismos de passagem de parâmetro– Por valor (call by value)– Por referência (call by reference)– Por nome (call by name)– Por necessidade (call by need)

Page 49: Compiladores – IF688 Professor: André Santos Home page do curso: if688 if688

Fundamentos de Linguagens de Programação

• Sinônimos (Aliasing)