Projeto de Compiladores



Documentos relacionados
Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Projeto de Compiladores

Compiladores I Prof. Ricardo Santos (cap 1)

Introdução aos Compiladores

Compiladores. Conceitos Básicos

Introdução à Programação

Compiladores. Introdução à Compiladores

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Conceitos de Linguagens de Programação

Noções de compilação

Compiladores. Introdução

Compiladores Aula 1. Celso Olivete Júnior.

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

Linguagens de Programação Aula 3

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

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

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

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

PROGRAMAÇÃO I. Introdução

EA876 - Introdução a Software de Sistema

Autômatos e Linguagens

Paradigmas de Programação

Compiladores. Prof. Bruno Moreno

Linguagens de Programação Classificação

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

As fases de um compilador

3. Linguagem de Programação C

CAP. VI ANÁLISE SEMÂNTICA

Linguagens e Compiladores

As fases de um compilador

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

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

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

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

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

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

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

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.

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

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

Compiladores. Análise Semântica

Algoritmos e Programação

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

INE5622 INTRODUÇÃO A COMPILADORES

PLANO DE UNIDADE DIDÁTICA- PUD

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível.

Compiladores e Computabilidade

Programação de Computadores:

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

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

Ambiente de desenvolvimento

Memória. Arquitetura de Von Neumann. Universidade do Vale do Rio dos Sinos Laboratório I Prof.ª Vera Alves 1 CPU. Unidade de controle ULA

Linguagens de Programação

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

Paradigmas de Linguagem de Programação. Aspectos Básicos

Compiladores Ambiente de Execução

Introdução à Computação

Capítulo 1. Aspectos Preliminares

LAPRO I. Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Informática - FACIN. Prof. Dr. Rafael Garibotti

Programação I A Linguagem C. Prof. Carlos Alberto

CAP. VII GERAÇÃO DE CÓDIGO

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

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

Compiladores. Fabio Mascarenhas

Como construir um compilador utilizando ferramentas Java

Compiladores. Análise Semântica

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

Compiladores Ambiente de Execução

Fundamentos de Programação 1

Sistemas Operacionais

CAP. VII GERAÇÃO DE CÓDIGO

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

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

Compiladores Análise Semântica

Compiladores Análise Semântica

Algoritmos. Prof. Jonatas Bastos Site:

Transcrição:

Projeto de Compiladores FIR Faculdade Integrada do Recife João Ferreira 26 e 27 de fevereiro de 2007

Agenda da Aula Revisão Linguagem de Programação Tradutores Compilador As Fases de Um Compilador

Linguagem de Programação Comunicação entre o programador e o computador Notação formal para expressar algoritmos Computador Linguagem de baixo nível (bits) Humanos Linguagem baseada em instruções de alto nível (comandos)

Tradução Alto/Baixo Nível Linguagem de Alto Nível int conta = 0;? 00110101 010100

Tradutor Compiladores Performance superior Otimização do código Baixa portabilidade Interpretador Não gera código executável Geralmente tem implementação mais simples Geralmente são menores Alta portabilidade JIT Just in Time Compilation

Compilador código-fonte compilador programa objeto mensagens de erro dados programa objeto resultado

Interpretador código-fonte tradutor programa intermediário Interpretador (VM) resultado dados mensagens de erro

Enquanto isso na Web... Várias linguagens são usadas para adicionar conteúdo dinâmico Uma boa parte é executada simultaneamente! Browser Interpretador VBScript Control / HTML Java Virtual Machine (JVM) script Interpretador HTML applet script Comunicação HTML page Control / HTML Interpretador JavaScript

Contexto de Um Compilador esqueleto do programa-fonte pré-processador assembler programa-fonte compilador código-objeto (relocável) carregador/ link-editor bibliotecas, arquivos objetos relocáveis programa-alvo (ling. de montagem) código-executável

As Fases de Um Compilador programa-fonte Análise do programa-fonte análise léxica Síntese análise sintática gerenciador da tabela de símbolos análise semântica gerador de código intermediário tratamento de erros otimizador de código gerador de código programa-destino

Gerenciamento da Tabela de Símbolos Informalmente é chamado de fase Estrutura de dados para armazenamento e recuperação de identificadores Informações sobre Alocação de Memória Tipo dos Identificadores Escopo dos Identificadores (Procedimento/Função) Número e Tipo dos Argumentos e Retorno (Procedimento/Função) Forma de Passagem de Parâmetros Nem sempre as informações são preenchidas ao mesmo tempo

Gerenciamento da Tabela de Símbolos position := initial + rate * 60 Tabela de Símbolos identificador tipo 1 position... 2 initial... 3 rate...............

Detecção e Impressão de Erros Informalmente é chamada de fase Erros podem ser encontrados em qualquer fase do compilador O ideal é que mesmo após um erro seja encontrado o compilador prossiga Opcionalmente o compilador pode apresentar alternativas para a correção do erro encontrado

Detecção e Impressão de Erros Eclipse

Modelo Análise-Síntese A compilação pode ser dividida em duas partes Análise divide e estrutura o código-fonte criando uma representação intermediária Síntese monta o código desejado a partir da representação intermediária compilador código fonte programa objeto Análise Síntese

Análise É uma tarefa relativamente simples Divide o programa-fonte em suas partes constituintes Cria uma representação intermediária do programa-fonte Inclui possíveis mecanismos de préprocessamento

Análise Outras ferramentas utilizam técnicas de análise: Editores de estrutura Verificadores de sintaxe Formatadores para impressão Fases 1. Léxica 2. Hierárquica 3. Semântica

Análise Léxica (Scanning) Caracteres são lidos da esquerda para direita e agrupados em tokens (seqüência de caracteres que possui um significado). for while if Espaços em branco são eliminados.

Análise Léxica (Exemplo) position := initial + rate * 60 Identificadores position initial rate Operador de atribuição := Operadores + * Número 60 identificador tipo id 1 position... id 2 initial... id 3 rate...............

Análise Sintática (Parsing) Tokens são agrupados hierarquicamente em frases gramaticais que serão utilizadas pelo compilador para sintetizar a saída do programa. As operações do código-fonte são reconhecidas e armazenadas em uma estrutura hierárquica chamada árvore sintática Cada nó representa uma operação Cada nó-filho representa os argumentos da operação

Análise Sintática (Parsing) Regras recursivas expressam a estrutura hierárquica do programa Exemplo Um identificador é uma expressão Um número é uma expressão Se expr 1 e expr 2 são expressões, então também o serão: expr 1 + expr 2 expr 1 * expr 2 (expr 1 )

Árvore Sintática (Exemplo) := position := initial + rate * 60 position id 1 + initial id 2 * rate id 3 60

Análise Semântica Verificações a fim de assegurar que os componentes do programa estão agrupados corretamente de acordo com a semântica da linguagem Procura erros semânticos (de significado) no programa. 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.

Análise Semântica (Exemplo) := position := initial + rate * 60 id 1 + id 2 * id 3 inttoreal 60

Síntese Constrói o programa alvo a partir da representação intermediária produzida pela análise Utiliza a maior parte das técnicas especializadas É uma tarefa relativamente complexa

Geração de Código Intermediário Idealmente deve ser fácil de produzir e também de traduzir para a linguagem-destino. Na prática, está gerando código para uma máquina abstrata. Three-address-code usa memória como registrador uso extensivo de nomes temporários usa apenas operações simples pode utilizar menos do que 3 endereços

Geração de Código Intermediário (Exemplo) position := initial + rate * 60 temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 = temp3

Otimização de Código Melhorar o código intermediário através de transformações Melhorar = tempo de execução uso de memória tamanho do código executável

Otimização de Código (Exemplo) temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 = temp3 position := initial + rate * 60 temp1 := id3 * 60.0 id1 := id2 + temp1

Geração de Código Última fase Responsável por produzir o código-alvo Alocação de memória para cada variável usada no programa Cada instrução intermediária é traduzida numa seqüência de instruções de máquina

Geração de Código (Exemplo) temp1 := id3 * 60.0 id1 := id2 + temp1 position := initial + rate * 60 MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 F Floating-point # Constant

Exemplo Completo position := initial + rate * 60 análise léxica id1 := id2 + id3 * 60 análise sintática := id + 1 * id 2 id 60 3 análise semântica gerador de código intermediário temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 otimizador de código temp1 := id3 * 60.0 id1 := id2 + temp1 := + id 1 id 2 id 3 * intotoreal 60 gerador de código MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1

Agrupamento de Fases Passo é a leitura e escrita completa do código-fonte Fase Passo Interfaces Vanguarda Retaguarda Passo Compilação em Passo Único Compilação em Múltiplos Passos

Compilação em Passo Único O Analisador Sintático realiza/chama as atividades de Análise Contextual e Geração de Código à medida que lê e reconhece o programa Driver do Compilador Analisador Sintático Analisador Contextual Gerador de Código

Compilação em Passo Único Pascal foi criada para ser implementada através de um compilado de passo único Todo identificador deve ser declarado antes de ser utilizado! var n:integer; procedure inc; begin n:=n+1 end? procedure inc; begin n:=n+1 end; Variável não declarada! var n:integer;

Compilação em Múltiplos Passos Módulo principal (driver) chama cada um dos passos responsáveis pela análise sintática, análise contextual e geração de código. Driver do Compilador Analisador Sintático Analisador Contextual Gerador de Código

Compilação em Múltiplos Passos Java permite que identificadores sejam usados antes de serem declarados Exige um compilador com pelo menos 2 passos class Pessoa { String getnome() { return this.nome; } void setnome(string pnome) { this.nome = pnome; } } String nome;

Pontos Relevantes no Projeto de Um Compilador Considerações I/O (input/output) consomem tempo Fases = Memória Compilador de um passo tem como vantagem Velocidade Espaço Compilador de múltiplos passos tem como vantagem Modularidade Flexibilidade Transformações/otimizações de programas Características da linguagem fonte podem inviabilizar o uso de um passo único Se permite o uso de uma função antes da sua definição; GOTO.

Pontos Relevantes no Projeto de Um Compilador Velocidade Memória Modularidade Flexibilidade Otimização Global Passo Único melhor programas maiores pior pior impossível Múltiplos Passos pior (potencialmente) programas menores melhor melhor possível Linguagem Compiladores de passo único não são possíveis para todas as linguagens de programação

Programas Auxiliares do Processo de Compilação Preprocessador Processamento de macros Inclusão de arquivos Compilação condicional Extensão de linguagens Montador (assembler) Abstração da arquitetura da máquina-destino. É na realidade um tradutor/compilador simples, de dois passos, que gera código relocável. Carregador (loader) e linkeditores (linker) Ajustam o código relocável, resolvem referências externas.

Resumo Linguagem de Programação Tradutor Fases Análise Léxica Análise Sintática Análise Semântica Geração de Código Intermediário Otimização de Código Geração de Código Agrupamento de Fases Pontos Relevantes no Projeto de Um Compilador Programas Auxiliares

Pra Finalizar... Onde encontro material para estudar? Livro UFRGS (Capítulo 1) Livro do dragão (Capítulos 1 e 2) WEB!

Só mais uma coisa... Tarefa de Casa 1. Fazer um resumo sobre os principais tipos de linguagem de programação quanto a geração (1ª, 2ª, 3ª, 4ª, 5ª,...) citando características e exemplos 2. Fazer um resumo sobre os principais paradigmas de programação (Imperativo, Orientado a Objetos, Lógico e Funcional) citando características e exemplos Entrega na próxima aula

Até a próxima semana!