Compiladores Aula 1. Celso Olivete Júnior.

Documentos relacionados
Compiladores Aula 1. Celso Olivete Júnior.

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores. Conceitos Básicos

Projeto de Compiladores

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Linguagens de Programação Aula 3

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Introdução à Programação

Compiladores. Introdução à Compiladores

Autômatos e Linguagens

Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17

Linguagens de Programação Classificação

As fases de um compilador

Compiladores. Fabio Mascarenhas

As fases de um compilador

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Conceitos de Linguagens de Programação

Analisador Léxico parte II

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Paradigmas de Programação

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

Conteúdo. Introdução a compiladores Tradução x Interpretação Processo de Compilação

PROGRAMAÇÃO I. Introdução

COMPILAÇÃO. Ricardo José Cabeça de Souza

Introdução. Tradutores de Linguagens de Programação

Introdução à Programação Aula 03. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

Introdução a Ciência da Computação

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Métodos de implementação de linguagens. Kellen Pinagé

Construção de Compiladores. Construção de Compiladores. Motivação. Motivação. Contexto Histórico. Classificações: Gerações 09/03/2010

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Como construir um compilador utilizando ferramentas Java

Aula 23: Noções de Compilação, Montagem, Link-edição, e Interpretação

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

INE5317 Linguagens Formais e Compiladores. Ricardo Azambuja Silveira INE-CTC-UFSC URL:

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Programação de Computadores:

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

3. Linguagem de Programação C

Introdução à Computação: Máquinas Multiníveis

Aula 2 - Programação de Computadores - CI208 1/21

INE5622 INTRODUÇÃO A COMPILADORES

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Prof. Adriano Maranhão COMPILADORES

Programação de Computadores IV. Introdução a Linguagens de Programação Simone Martins SLIDES CEDIDOS POR BRUNO MARQUES 1

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Ferramenta para Desenvolvimentode Sistemas EmbarcadosUtilizando Linguagem de Alto Nível p.1/25

Breve Histórico & Conceitos Básicos

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Síntese. Prof. Geovane Griesang

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior

IV.2 Aspectos Léxicos Convencionais

Sistemas Operacionais

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

CAP. VI ANÁLISE SEMÂNTICA

Análise Sintática Introdução

CAP. VII GERAÇÃO DE CÓDIGO

Revisão: linguagens de programação

Introdução à Computação

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Tecnólogo em Análise e Desenvolvimento de Sistemas. Sistemas Operacionais (SOP A2)

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 1ª Parte Prof. Sandra Pais Soares

Capítulo 1. Aspectos Preliminares

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR

Algoritmos e Programação

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Linguagens de Programação Aula 11

Compiladores Ambiente de Execução

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Informática I. Aula 9. Aula 9-17/05/2006 1

Introdução as Máquinas de Autômatos

Como construir um compilador utilizando ferramentas Java

Algoritmos Computacionais

Algoritmos e Programação

Lembrando análise semântica. Compiladores. Implementação de esquemas de tradução L-atribuídos. Exemplo de implementação top-down (1)

Ambiente de desenvolvimento

Conceitos de Linguagens de Programação

Tokens, Padroes e Lexemas

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Construção de Compiladores

Compiladores e Computabilidade

Conceitos de Linguagens de Programação

SCC 605 Teoria da Computação e Compiladores

Linguagens Formais e Autômatos 02/2016. LFA Aula 01 24/10/2016. Celso Olivete Júnior.

Classificação das linguagens de programação

Análise Léxica II. Eduardo Ferreira dos Santos. Setembro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 30

Compiladores Aula 12. Celso Olivete Júnior.

Compiladores. J.L.Rangel - Compiladores - 1-1

Fundamentos de Sistemas Operacionais

Transcrição:

Aula 1 Celso Olivete Júnior olivete@fct.unesp.br

Tópicos da disciplina Introdução à compilação Analisador léxico Analisador sintático descendente Analisador sintático ascendente Análise semântica Geração de código intermediário Ambientes de execução Geração de código objeto 2

Metodologia Aulas expositivas teórico-práticas Exercícios práticos Projetos em grupos (análise individual) 3

Avaliação Mb = (Pb*6 + Tb*4) / 10 Onde: Mb = Médias Bimestrais do primeiro e segundo bimestre. Pb = Prova Bimestral. Tb = Média das notas das atividades desenvolvidas intra e extra classe no semestre. Exame final: toda a matéria 4

Estrutura da disciplina Introdução à compilação Analisador léxico Analisador sintático descendente Analisador sintático ascendente Análise semântica Geração de código intermediário Ambientes de execução Geração de código objeto Prova 1 / Apres. projeto Prova 2 / Apres. projeto 5

Projeto Grupos com 3 a 4 participantes Avaliação do projeto será na forma de apresentação Notas individuais 6

Pré-requisitos Disciplinas: Programação Teoria da computação Linguagens formais e autômatos Teoria dos grafos 7

Bibliografia básica AHO, A V., ULLMAN, J.D. e SETHI, R., : Princípios, Técnicas e Ferramentas, LTC, 2008. PRINCE, A. M. A. e TOSCANI, S. S., Implementação de Linguagens de Programação:, Editora Sagra- Luzzatto, 2001. CRESPO, R. G. Processadores de Linguagens: Da Concepção à Implementação, 2ª ed.,ist Press, 2001. MENEZES, P. F. B., Linguagens Formais e Autômatos, Editora Sagra-Luzzatto, 2001. 8

Motivação : uma das principais ferramentas do cientista/engenheiro da computação Técnicas de compilação se aplicam a projetos gerais de programas Editores de texto, sistemas de recuperação de informação, reconhecimento de padrões, processamento de línguas. 9

Motivação Utilização de conceitos e métodos de diversas disciplinas Algoritmos Linguagens de programação Teoria das linguagens Engenharia de software Arquitetura de computadores Linguagens de Baixo Nível 10

Objetivo Fazer um Compilador!!! ERROS!!! mensagens begin if x = 5 then... entrada saída 1100111 0011100011 Prog. Fonte Compilador Prog. objeto 11

Objetivo Executando o programa objeto Fornece entradas de dados 1100111 0011100011 Produzir saídas Prog. objeto 12

Código fonte Objetivo Compilador!!! Análise Léxica abstração tokens e lexemas Análise Sintática Árvore sintática abstrata Análise Semântica implementação AST decorada Geração de Código Código Máquina 13

Na aula de hoje... Compilador: o que é, para que serve e estrutura geral 14

Roteiro Introdução Compilação Fases da compilação Estrutura geral de um compilador Definição de linguagens de programação Classificação de compiladores 15

Introdução Definição: lê um programa em uma linguagem fonte e o traduz em um programa em uma linguagem-alvo (objeto) Linguagem-fonte: Pascal, C Linguagem-alvo: linguagem de montagem (assembly), código de máquina 16

Introdução Definição: lê um programa em uma linguagem fonte e o traduz em um programa em uma linguagem-alvo (objeto) Linguagem-fonte: Pascal, C Linguagem-alvo: linguagem de montagem (assembly), código de máquina ERROS!!! mensagens begin if x = 5 then... input output 1100111 0011100011 Código Fonte Compilador Programa 17

Introdução Tradutor de uma linguagem mais abstrata (origem) para uma mais concreta (destino). Exemplo: public class HelloWorld { public static void main(string[] args) { System.out.println("Hello"); }} javac javap public class HelloWorld extends java.lang.object{ public HelloWorld(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/object."<init>":()v 4: return public static void main(java.lang.string[]); Code: 0: getstatic #2; //Field java/lang/system.out:ljava/io/printstream; 3: ldc #3; //String Hello 5: invokevirtual #4; //Method java/io/printstream.println:(ljava/lang/string;)v 8: return } 18

Introdução Tradutor de uma linguagem mais abstrata (origem) para uma mais concreta (destino). Exemplo: assembly... t2 = id3 * 60.0 id1 = id2 + t2 Gerador de código LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1 19

Introdução Outro exemplo de bytecodes 20

Funcionalidades... o programador poderia escrever direto na linguagem destino(código objeto)? Fácil? Rápido? 21

Funcionalidades Facilitar programação (abstração) Checar certos tipos de erros e vulnerabilidades Gerar código portável Otimizar código Velocidade, tamanho, etc. 22

Etapas de um compilador Código fonte Análise Léxica abstração tokens e lexemas Análise Sintática Árvore sintática abstrata Análise Semântica implementação AST decorada Geração de Código Código Máquina 23

Funcionalidades 24

História Antigamente a programação era feita em código de máquina Programação em linguagem máquina Rapidez execução versus desenvolvimento complicado Necessidade de um montador Nãohámágica! Finalmente, linguagens de mais alto nível 25

História Primeiros compiladores começaram a surgir no início dos anos50 Trabalhos iniciais: tradução de fórmulas aritméticas em código de máquina eram considerados programas muito difíceis de construir Primeiro compilador Fortran (permitia a declaração de identificadores com até 6 caracteres) FORmula TRANslation System 26

História FORmula TRANslation System: cartão perfurado 27

História Desde então, técnicas sistemáticas para construção de compiladores foram identificadas Reconhecimento de cadeias, gramáticas, geração de linguagem Desenvolvimento de boas linguagens e ambientes de programação C, C++, linguagens visuais 28

História Desenvolvimento de programas para produção automática de compiladores lex, flex Lex Gerador de analisadores léxicos (UNIX) Flex Gerador de analisadores léxicos (LINUX / Windows) Entrada: Arquivo de descrição do analisador léxico Saída: Programa na linguagem C que realiza a análise léxica Outros geradores de analisadores: TPly TP Lex / Yacc Gera um programa em PASCAL JavaCC Para linguagem Java Flex++ ou Flexx => Para linguagem C++ (orientado a objetos) 29

História Atualmente, um aluno de graduação pode construir um compilador rapidamente Ainda assim, programa bastante complexo Estimativa de código acima de 10.000 linhas 30

História Com isso, tornou-se uma área de grande importância 1957: Fortran primeiros compiladores para processamento de expressões aritméticas e fórmulas 1960: Algol primeira definição formal de linguagem, com gramática na forma normal de Backus (BNF), estruturas de blocos, recursão, etc. 31

História Com isso, tornou-se uma área de grande importância 1970: Pascal tipos definidos pelos usuários 1985: C++ orientação a objetos, exceções 1995: Java compilação instantânea (traduz bytecodes para código de máquina e executa), melhorando o tempo e execução do programa. Portabilidade 32

Organização de um compilador Compilador, interpretador e máquina virtual Entrada de dados Prog. fonte Compilador Prog. Objeto Saída Ex: Pascal, C,... Entrada Prog. fonte Interpretador Saída Ex: PHP, javascript,... Prog. fonte Compilador Entrada de dados Cód. Intermediário bytecodes Máquina virtual Saída Ex: Java 33

Compilador, interpretador e máquina virtual Vantagens versus desvantagens Entrada de dados Prog. fonte Compilador Prog. Objeto Saída Ex: Pascal, C,... Entrada Prog. fonte Interpretador Saída Ex: PHP, javascript,... Prog. fonte Compilador Entrada de dados Cód. Intermediário bytecodes Máquina virtual Saída Ex: Java 34

Organização de um compilador Prog. fonte Entrada Compilador, interpretador e máquina virtual Compilador Prog. fonte Interpretador Entrada de dados Prog. Objeto Saída Saída Ex: Pascal, C,... Foco em compiladores Ex: PHP, javascript,... Prog. fonte Compilador Entrada de dados Cód. Intermediário bytecodes Máquina virtual Saída Ex: Java 35

Processo de compilação subdivisão de um programa fonte Programa fonte pré-processador assembler Programa fonte modificado compilador Código objeto(relocável) Editor de ligação Carregador Bibliotecas/ código objeto Programa em assembler Código objeto(executável) 36

Processo de compilação pré-processador assembler origem compilador Como funciona essa caixa-preta? linker-loader destino 37

Processo de compilação Compilação: duas fases análise e síntese 1.análise (front-end): Cria representações intermediárias do programa (subdivisões) Verifica presença de certos tipos de erro ERROS!!! análise mensagens begin if x = 5 then... input Código Fonte 38

Processo de compilação Compilação: duas fases 2. síntese (back-end): Constrói o programa destino a partir de representações intermediárias ERROS!!! análise mensagens síntese begin if x = 5 then... input output 1100111 0011100011 Código Fonte Prog. objeto 39

Etapas de um compilador Código fonte Análise Léxica abstração tokens e lexemas Análise Sintática Árvore sintática abstrata Análise Semântica implementação AST decorada Geração de Código Código Máquina 40

Processo de compilação 41

Processo de compilação Compilação: duas fases 1.análise (front-end): Cria representações intermediárias do programa (subdivisões) Verifica presença de certos tipos de erro 2. síntese (back-end): Constrói o programa destino a partir de representações intermediárias 42

Processo de compilação 1) Análise 1.1) Análise léxica Organiza caracteres de entrada em grupos, chamados tokens Erros: tamanho máximo da variável excedido, formação de identificadores, caracteres inválidos.. 1.2) Análise sintática Organiza tokens em uma estrutura hierárquica Erros: falta de(, ), =, identificador inválido... 43

Processo de compilação Análise 1.3) Análise semântica Checa se o programa respeita regras básicas de consistência Erro: tipos inconsistentes atribuir uma string em uma variável inteira 44

Processo de compilação 1) análise 1.1) Análise léxica Lê os caracteres de entrada (scanner) e os agrupa em sequências chamadas lexemas (tokens) Os tokens são consumidos na fase seguinte (análise sintática) Programa fonte Analisador léxico (scanner) GetToken() token Analisador sintático (parser) para análise semântica Tabela de Símbolos (identificadores e constantes) 45

Processo de compilação 1) análise 1.1) Análise léxica A tabela de símbolos é utilizada para diferenciar palavras e símbolos reservados da linguagem (while, for, :=, >, <) de identificadores definidos pelo usuário Tabela de símbolos Lexema (lido) Token (tipo) ; <PONTO_VIRG> ou ; aux while <IDENTIFICADOR> Palavra reservada 46

Processo de compilação 47

Processo de compilação 1) análise 1.1) Análise léxica A tabela de símbolos também é utilizada para armazenar o tipo e o valor das variáveis e o seu escopo Tabela de símbolos Lexema (lido) Token (tipo) valor ; <PONTO_VIRG> ou ; - aux <IDENTIFICADOR> 10 while Palavra reservada - 48

Processo de compilação 1) análise 1.1) Análise léxica. Exemplo: expr = a + b * 60 Analisador Léxico Tabela de Símbolos <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <numero, 60> nome 1 expr - 2 a - 3 b - tipo 49

Processo de compilação 1) análise 1.1) Análise léxica Reconhecimento e classificação dos tokens Pode ser feito com o uso de expressões regulares e autômatos finitos 50

Processo de compilação 1) análise 1.1) Análise léxica Reconhecimento e classificação dos tokens Exemplos de expressões regulares letra [A-Z] [a-z] dígito [0-9] dígitos dígito dígito* identificador letra[letra dígito]* 51

Processo de compilação 1) análise 1.1) Análise léxica Reconhecimento e classificação dos tokens Exemplos de autômatos finitos Estado inicial 0 Exemplo para > e >= > 6 = 7 Exemplo para identificadores outro 8 * letra ou dígito Estado inicial 0 letra 10 outro 2 * 52

Processo de compilação 1) análise 1.2) Análise sintática Utiliza os tokens produzidos pela análise léxica e verifica a formação do programa com o uso de GLC (gramáticas livres de contexto) A partir dos tokens cria uma representação intermediária tipo árvore (árvore sintática) mostra a estrutura gramatical da sequência de tokens 53

Processo de compilação 1) análise 1.2) Análise sintática expr = a + b * 60 <identificador, 1>, <=>, <identificador, 2>, <+>, <identificador, 3>, <*>, <numero, 60> Analisador Sintático <id,1> = <id,2> + Árvore sintática: Percorrendo a árvore e consultando a GLC é possível verificar se a expressão pertence à linguagem Nó interior representa uma operação Nó filho representa um argumento * <id,3> 60 54

Processo de compilação 1) análise 1.3) Análise semântica Utiliza a árvore sintática e a tabela de símbolos para: Consistência semântica (significado) do prog. fonte em relação à linguagem. Exemplo: verificação de tipos A expressão x = x + 3.0; está sintaticamente correta, mas pode estar semanticamente errada, dependendo do tipo de x. 55

Processo de compilação Compilação: duas fases 1.análise (front-end): Cria representações intermediárias do programa Verifica presença de certos tipos de erro 2. síntese (back-end): Constrói o programa destino a partir de representações intermediárias 56

Processo de compilação 2) síntese Geração de código: Recebe como entrada uma representação intermediária (fases da análise léxica e sintática) e transforma em uma linguagem objeto Alocação de memória, uso de registradores 57

Processo de compilação 2) síntese Geração de código: Código intermediário Exemplos de representações: 3 endereços: cada instrução usa não mais que três operandos Pilha: operandos são acessíveis apenas a partir da pilha 58

Processo de compilação 2) síntese Geração de código: Código intermediário Exemplo: 3 endereços id1 = id2 + id3 * inttofloat(60) t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 59

Processo de compilação 2) síntese Otimizador de código Realiza transformações no código com objetivo de melhorar algum aspecto relevante tempo de execução, consumo de memória, tamanho do código executável, etc. 60

Processo de compilação 2) síntese Otimizador de código t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 t2 = id3 * 60.0 id1 = id2 + t2 61

Processo de compilação 2) síntese Geração de código Consiste em traduzir o código intermediário para a linguagem-destino (p.ex, assembly)... t2 = id3 * 60.0 id1 = id2 + t2 Gerador de código destino LDF R2, id3 MULF R2, R2, #60.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1 62

Bibliografia AHO, A. V.; LAM, M. S.; SETHI, R.; ULLMAN, J. D. princípios, técnicas e ferramentas, 2008 Capítulo 1. 63

Na próxima aula... Revisão de linguagens formais. 64