39
Universidade Cat ´ olica de Pelotas Introduc ¸ ˜ ao aos Compiladores Andr ´ e Rauber Du Bois [email protected] 1

Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

Embed Size (px)

Citation preview

Page 1: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

Universidade Catolica de Pelotas

Introducao aos Compiladores

Andre Rauber Du [email protected]

1

Page 2: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

MOTIVACAO

• Entender os algor ıtmos e estruturas usados para seimplementar linguagens de programacao

• Conhecimento pode ser usado para resolver varios tipos deproblemas: editores de texto, conversores de arquivos, etc.

• Uso do conhecimento adquirido em varias disciplinas do cursode Ciencia da Computacao: Algor ıtmos e Estruturas deDados, Linguagens Formais, Arquitetura de Hardware, etc.

MOTIVACAO 2

Page 3: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

MOTIVACAO

• Conhecimento Util: como escolher uma linguagem adequadapara resolver um problema espec ıfico, comparar eficiencia delinguagens, gerenciamento de memoria

• Provavelmente uma das disciplinas mais interessantes docurso de Ciencia da Computacao

MOTIVACAO 3

Page 4: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

CURSO DE COMPILADORES

1. Compiladores

2. Fases de um Compilador

• Analise Lexica

• Analise Sintatica

• Analise Semantica

• Geracao de Codigo Intermediario

• Otimizacao de Codigo Intermediario

• Geracao de Codigo Alvo

3. Traducao Dirigida Por Sintaxe

4. Sistemas de Tempo de Execucao

5. Gerencia de Memoria

6. CONSICO (Congresso Simulado de Compiladores)

CURSO DE COMPILADORES 4

Page 5: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

INTRODUCAO

• Linguagens de Programacao

• Compiladores

• Fases de um Compilador

– Analise Lexica

– Analise Sintatica

– Analise Semantica

– Geracao de Codigo Intermediario

– Otimizacao de Codigo Intermediario

– Geracao de Codigo Alvo

INTRODUCAO 5

Page 6: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

LINGUAGENS

• Linguagem de programacao: Meio de comunicacao entre oprogramador e o computador

• Fornece ligacao entre o pensamento humano e a precisaorequerida pela maquina

• O desenvolvimento de um programa e mais facil se alinguagem estiver mais prox ıma do problema a ser resolvido(Linguagem de Alto N ıvel)

LINGUAGENS 6

Page 7: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

LINGUAGENS (CONT.)

• Computadores entendem apenas sua propria linguagem demaquina (Linguagem de Baixo N ıvel). Zeros e Uns.

• Programas hoje em dia sao geralmente escritos emLinguagens de Alto N ıvel

• Programas escritos em linguagens de alto n ıvel devem sertraduzidos para linguagem de maquina atraves decompiladores/interpretadores

LINGUAGENS (CONT.) 7

Page 8: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

EVOLUCAO DAS LINGUAGENS DE PROGRAMACAO

1. Linguagem de Maquina

• Computadores eram programados em linguagem de maquina,usando operacoes de maquina primitivas, formadas por umcodigo de operacao e dois enderecos de registradores oumemoria

• Inicialmente usando zeros e uns: 00010000 0000011100000101

• Problemas: dif ıcil de ler, escrever, modificar, fortemente sujeitaa erros

EVOLUCAO DAS LINGUAGENS DE PROGRAMACAO 8

Page 9: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

2. Linguagem de Montagem

• Oferece uma notacao simbolica, sao usados nomes ao invesde codigo binario (b = a + 2 )

MOV a, R1

ADD #2, R1

MOV R1, b

• Linguagem Assembly

• Montador / assembler: transforma o programa em Assemblypara linguagem de maquina

• Uma instrucao em assembly equivale a uma instrucao emlinguagem de maquina

EVOLUCAO DAS LINGUAGENS DE PROGRAMACAO 9

Page 10: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

2. Linguagem de Alto Nıvel

• Maior n ıvel de abstracao:

let s = (a+b+c)/2

in sqrt (s*(s-a)*(s-b)*(s-c) )

• Ao inves de:

LOAD R1 a; ADD R1 b; ADD R1 c; DIV R1 #2;

LOAD R2 R1; LOAD R3 R1; SUB R3 a;

MULT R2 R3; LOAD R3 R1; SUB R3 b;

MULT R2 R3; LOAD R3 R1; SUB R3 c;

MULT R2 R3; LOAD R0 R2; CALL sqrt;

EVOLUCAO DAS LINGUAGENS DE PROGRAMACAO 10

Page 11: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

TRADUTORES DE LINGUAGEM

• Montadores (Assemblers)

• Macro-Assemblers

• Compiladores

• Interpretadores

TRADUTORES DE LINGUAGEM 11

Page 12: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

COMPILADORES

COMPILADOR: programa que le um programa escrito em umalinguagem fonte e o traduz para um programa equivalente numa

outra linguagem (linguagem alvo)

FONTEPROGRAMA PROGRAMA

ALVO

MENSAGENS DE ERRO

COMPILADOR

COMPILADORES 12

Page 13: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

Fases de Um Compilador

FONTEPROGRAMA PROGRAMA

ALVO

MENSAGENS DE ERRO

Análise Síntese

• Analise: reconhece o programa e divide em suas partesconstituintes criando uma representacao intermediaria domesmo

• S ıntese: Constroi o programa alvo desejado, a partir darepresentacao intermediaria

• Tambem conhecidas como Front-end e Back-end docompilador

COMPILADORES 13

Page 14: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

FASES DO COMPILADOR

programa fonte

Léxico Analisador

Analisador Sintático

Analisador Semântico

Gerador de CódigoIntermediário

programa alvo

Otimizadorde Código

Geradorde Código

Análise (Front−End)Síntese (Back−End)

Tabela de Simbolos

FASES DO COMPILADOR 14

Page 15: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE

• Operacoes sao reconhecidas e registradas numa estruturachamada de Arvore Sintatica

• Cada no representa uma operacao e seus filhos representamos argumentos da operacao

• Exemplo: montante := deposito inicial +

taxa de juros * 60

60deposito_inicial

montante

:=+

*

taxa_de_juros

ANALISE 15

Page 16: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE

• Varios tipos de software realizam algum tipo de analise:

– Editores de Programas

– Pretty Printers

– Interpretadores

ANALISE 16

Page 17: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

TIPOS DE ANALISE

• Analise Lexica: programa e lido (escaneado) e agrupado emtokens i.e., sequencias de caracteres com um significadocoletivo

• Analise Sintatica: tokens sao agrupados hierarquicamente emuma arvore sintatica (baseda na gramatica da linguagem)

• Analise Semantica: o programa e verificado para garantir queos componentes de um programa se combinam de formasignificativa

TIPOS DE ANALISE 17

Page 18: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE LEXICA

• Fazer a leitura do programa fonte, e traduz ı-lo para umasequencia de sımbolos lexicos, tambem chamados de tokens.Exemplo:

montante = deposito_inicial +taxa_de_juros * 60

Tokens:

1. O identificador montante

2. O s ımbolo de atribuicao :=

3. O identificador deposito inicial

4. O sinal de adicao +

5. O identificador taxa de juros

6. O sinal de multiplicacao *

ANALISE LEXICA 18

Page 19: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

7. O n umero 60

Os espacos e linhas sao ignorados

ANALISE LEXICA 19

Page 20: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE SINTATICA

• Verifica se o programa foi escrito respeitando as regrasgramaticais da linguagem

• Agrupa tokens do programa fonte em frases gramaticais, quesao usadas pelo compilador para gerar a sa ıda

• A gramatica e geralmente definida usando regras recursivas

Exemplo: Regras Recursivas para Expressoes:

1. Qualquer identificador e uma expressao

2. Qualquer numero e uma expressao

3. Se expressao1 e expressao2 sao expressoes, entao tambem osao

expressao1 + expressao2

expressao1 * expressao2

ANALISE SINTATICA 20

Page 21: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

Exemplo: Enunciado de uma linguagem de programacao

• Se identificador1 e um identificador e expressao2 e umaexpressao, entao

identificador1 := expressao2

e um enunciado

• Gramatica livre de contexto

ANALISE SINTATICA 21

Page 22: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

Arvore Gramatical Exemplo: montante := deposito inicial +

taxa de juros * 60

enunciado deatribuicão

:=

identificador

montante

expressão

expressão

identificador

deposito_inicial

expressão

expressão expressão

identificador número

60taxa_de_juros

+

*

ANALISE SINTATICA 22

Page 23: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE SEMANTICA

• Verifica erros semanticos e de tipos

• Exemplo: detecta que um n umero real esta sendo usado paraindexar um vetor

• Normalmente, valores em uma linguagem sao classificadospor tipos

• Operacoes possuem regras de tipo, definindo os tipos dosoperandos e resultado

• Uma operacao usando um tipo errado gera um erro de tipo

ANALISE SEMANTICA 23

Page 24: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

EXEMPLO DE REGRAS DE TIPO

• Operador +

Se os dois operandos sao do tipo Int o resultado deve ser dotipo Int

• Operador While E do C

E deve possuir tipo Bool

EXEMPLO DE REGRAS DE TIPO 24

Page 25: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE SEMANTICA (CONT.)

• A semantica da linguagem pode permitir algumas coercoes detipo

• Exemplo: montante := deposito inicial +

taxa de juros * 60

60deposito_inicial

montante

:=+

*

taxa_de_juros

ANALISE SEMANTICA (CONT.) 25

Page 26: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

ANALISE SEMANTICA (CONT.)

• Exemplo: montante := deposito inicial +

taxa de juros * 60

deposito_inicial

montante

:=+

*

taxa_de_juros intToReal 60

ANALISE SEMANTICA (CONT.) 26

Page 27: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

TABELA DE S IMBOLOS

• A Tabela de Sımbolos e uma estrutura de dados que contemum registro para cada identificador, com campos contendoseus atributos

• Atributos: tipo, memoria reservada, se e um procedimento,n umero e tipo dos argumentos, tipo de retorno etc.

• A tabela permite encontrar rapidamente cada registro,armazenar e recuperar dados do mesmo

• A tabela e preenchida e usada por todas as fases

var montante, deposito_inicial: real;

– Os identificadores sao inseridos na tabela durante aanalise lexica,mas o tipo nao e conhecido no momento emque e inserido

TABELA DE S IMBOLOS 27

Page 28: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

FASE DE ANALISE (FRONT-END)

:=

id1

id2id3 60

+*

id1 := id2 + id3 * 60

Analisador Léxico

montante := deposito_inicial + taxa_de_juros + 60

:=

id1

id2id3

+*

60

intToReal

Analisador Semântico

Analisador Sintático

Back − End

código de máquina

TABELA DE SIMBOLOS1 montante | ...2 deposito_inicial | ...3 taxa_de_juros | ...

FASE DE ANALISE (FRONT-END) 28

Page 29: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

GERACAO DE CODIGO INTERMEDIARIO

• Alguns compiladores, depois da fase de Analise, geram umarepresentacao intermediaria do programa final

• Propriedades do Codigo Intermediario: Facil de produzir,otimizar e traduzir para a linguagem alvo

• Vantagens

– Portabilidade: O codigo intermediario e independente deplataforma, por isso pode ser traduzido para diversasmaquinas

– Simplifica a implementacao do compilador, resolvendogradativamente o problema de transformar o codigo de alton ıvel em codigo de baixo n ıvel

– Facilita otimizacao do codigo final

GERACAO DE CODIGO INTERMEDIARIO 29

Page 30: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

EXEMPLO DE CODIGO INTERMEDIARIO

• Codigo de tres enderecos: sequencia de instrucoes, cada umapossuindo no maximo tres operandos

• Muito mais facil de se traduzir para codigo de maquina

montante := deposito_inicial + taxa_de_juros * 60

temp1 := inttoreal (60)

temp2 := id3 * temp1

temp3 := id2 + temp2

id1 := temp3

EXEMPLO DE CODIGO INTERMEDIARIO 30

Page 31: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

OTIMIZACAO DE CODIGO

• Serve para melhorar o codigo intermediario

temp1 := id3 * 60.0

id1 := id2 + temp1

• A conversao de 60 para real pode ser feita durante acompilacao, eliminanto a instrucao inttoreal

• temp3 era usada apenas para transmitir seu valor para id1

por isso pode ser eliminada

• Existem varias transformacoes simples que podem ser usadaspara melhorar o codigo final

• Compiladores Otimizantes gastam boa parte do tempo decompilacao na faze de otimizacao

OTIMIZACAO DE CODIGO 31

Page 32: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

GERACAO DE CODIGO

• E a fase final do compilador que gera codigo de maquina oucodigo de montagem (assembly)

• As instrucoes do codigo intermediario sao traduzidas parainstrucoes de maquina e registradores sao associados asvariaveis

• Exemplo:

montante := deposito_inicial + taxa_de_juros * 60

temp1 := id3 * 60.0

id1 := id2 + temp1

pode ser traduzido para

MOVF id3, R2

MULF #60.0, R2

GERACAO DE CODIGO 32

Page 33: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

MOVF id2, R1

ADDF R2, R1

MOVF R1, id1

GERACAO DE CODIGO 33

Page 34: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

FASE DE S INTESE (BACK-END)

:=

id1

id2id3

+*

60

intToReal

montante := deposito_inicial + taxa_de_juros + 60

TABELA DE SIMBOLOS1 montante | ...2 deposito_inicial | ...3 taxa_de_juros | ...

Front−End

temp1 := inttoreal (60)temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3

temp1 := id3 * 60.0id1:= id2 + temp1

MOVF ID3, R2MULF #60.0, R2(...)gerardor de código intermediário

otimizador de código

gerador de código

FASE DE S INTESE (BACK-END) 34

Page 35: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

DETECCAO DE ERROS

• Cada fase da compilacao pode encontrar erros. Para se darmensagens de erro mais completas, o compilador nao paraassim que encontra o primeiro erro no codigo.

• Analise Lexica: erro quando encontra token invalido. Ex: nomevariavel comecando com n umero

• Analise Sintatica: erro quando o fluxo de tokens viola asregras da linguagem. Ex: Esquecer o BEGIN e END no Pascal.

• Analise Semantica: sintaxe correta mas significado errado. Ex:erro de tipo. Somar o nome de um array com o nome de umprocedimento. :-)

DETECCAO DE ERROS 35

Page 36: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

CONTEXTO DE UM COMPILADOR

• Alem do compilador, varios outros programas podem sernecessarios para se criar um programa alvo executavel.

• Exemplo1: o programa pode estar dividido em modulos

• Exemplo2: a linguagem alvo pode nao ser linguagem demaquina

CONTEXTO DE UM COMPILADOR 36

Page 37: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

UM SISTEMA DE PROCESSAMENTO DE LINGUAGEM

programa fonte

programa

programa objeto em linguagem de montagem

compilador

montador

carregador

bibliotecas

pré−processador

código de máquina relocável

código de máquina absoluto

UM SISTEMA DE PROCESSAMENTO DE LINGUAGEM 37

Page 38: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

INTERPRETADORES

• Primo do compilador

• Gera codigo intermediario, que e executado por um programaou maquina virtual, sem gerar codigo de maquina

Tradutor Interpretador(Máquina Virtual)

programaintermediário

resultadosfonteprograma

• Alguns interpretadores nao geram codigo intermediario,apenas executam as instrucoes presentes no codigo fonte,assim que encontradas, uma por vez. Ex: interpretador dalinguagem BASIC

INTERPRETADORES 38

Page 39: Universidade Catolica´ de Pelotas - Chebre · Analise´ Lexica´ Analise´ Sintatica ... Analise´ Semantica:ˆ o programa e´verificado para garantir que os componentes de um programa

INTERPRETADORES

• O tempo de traducao da linguagem em um Interpretador, emuito mais rapido do que em um compilador, ja que nao enecessario gerar codigo de maquina

• O tempo de execucao em um interpretador e geralmente muitomais longo do que se usando codigo compilado paralinguagem de maquina

• Interpretador e muito mais facil de usar e possui mensagensde erro melhores ja que o processo de interpretacao e feitoproximo ao codigo fonte

INTERPRETADORES 39