Autômatos e Linguagens

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

Histórico e Conceitos

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. Conceitos Básicos

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

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

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

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

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

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

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

CP Compiladores I Prof. Msc.. Carlos de Salles

Introdução à Programação

Linguagens de Programação Aula 3

Compiladores I Prof. Ricardo Santos (cap 1)

Conceitos de Linguagens de Programação

FACULDADE LEÃO SAMPAIO

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

Compiladores. Introdução

Projeto de Compiladores

Introdução aos Compiladores

II.1 Conceitos Fundamentais. Uma delas é programar o =>

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

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

Compiladores. Introdução à Compiladores

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

Capítulo 1. Aspectos Preliminares

Compiladores Aula 1. Celso Olivete Júnior.

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica

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

Revisão: linguagens de programação

Projeto de Compiladores

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

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.

Compiladores. Prof. Bruno Moreno

Paradigmas de Programação

Noções de compilação

Noções de compilação

Conceitos de Linguagens de Programação - Características. Paavo Soeiro

Programação de Computadores

Introdução à Computação para Engenharia MAC2166 Prof. Dr. Paulo Miranda IME-USP. Aula 1 Introdução à Computação

EA876 - Introdução a Software de Sistema

Programação de Computadores

Programação de Computadores

Algoritmos e Programação

Algoritmos e Programação

PROGRAMAÇÃO I. Introdução

Compiladores. Análise Léxica

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Introdução à Computação

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

Compiladores. Fabio Mascarenhas

Programação de Computadores:

PROGRAMAÇÃO ORIENTADA A OBJETOS I -CONCEITOS PRELIMINARES. Prof. Angelo Augusto Frozza, M.Sc.

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR

Fundamentos de Programação 1

Pró-Reitoria Acadêmica Diretoria Acadêmica Assessoria Pedagógica da Diretoria Acadêmica

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

INE5421 LINGUAGENS FORMAIS E COMPILADORES

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

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

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

FACULDADE ZACARIAS DE GÓES SISTEMAS DE INFORMAÇÃO ADRIEL ALMEIDA CAFÉ PROCESSO DE COMPILAÇÃO

Linguagens de Programação

3. Linguagem de Programação C

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

Histórico e Conceitos

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

Introdução parte II. Compiladores. Mariella Berger

Interfaces de Vanguarda do Compilador

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

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

Linguagens de Programação

INE5622 INTRODUÇÃO A COMPILADORES

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

Introdução à Computação

Introdução à Computação

Programação I Apresentação

Infraestrutura de Hardware. Funcionamento de um Computador

Introdução. Compiladores Análise Semântica. Introdução. Introdução. Introdução. Introdução 11/3/2008

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

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

Programação Estruturada Aula - Introdução a Linguagem de Programação

As fases de um compilador

Linguagens e Compiladores

Paradigmas de Linguagem de Programação

Paradigmas de Linguagens Computacionais (PLC) (Apresentação da disciplina)

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

Linguagens de Programação Classificação

Algoritmos e Programação

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

Visão Geral... e conceitos básicos

1 Introdução à Programação O que é? Para que serve?... 1

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

Aula teórica 7. Preparado por eng.tatiana Kovalenko

Transcrição:

Autômatos e Linguagens Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Agosto, 2016 1 / 41

Sumário 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores 4 A estrutura de um compilador 2 / 41

Compiladores 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores 4 A estrutura de um compilador 3 / 41

Compiladores Linguagens Teoria de linguagens formais [UNICER, 2001]: Estudo das características, propriedades e aplicações da linguagem formal; Representação da estrutura: sintaxe; Determinação do signicado: semântica. É necessário estudar as linguagens formais no domínio da matemática. uma linguagem é uma forma de comunicação, usada por sujeitos de uma determinada comunidade; uma linguagem é o conjunto de SÍMBOLOS e REGRAS para combinar esses símbolos em sentenças sintaticamente corretas; uma linguagem é formal quando pode ser representada através de um sistema com sustentação matemática. 4 / 41

Compiladores Símbolo Símbolo: entidade abstrata sem denição formal; Ex.: letras, dígitos, etc. Ordenação lexicofráca [UNICER, 2001]: igualdade ou precedência; Usados como elementos atômicos em denições de sintaxe. 5 / 41

Compiladores Alfabeto Denição: sequência nita de símbolos; Exemplos: β = {0, 1}; Γ = {a, b, c, d, e, f }. Uma palavra sobre um alfabeto β é uma sequência nita de símbolos de β. Ex.: (1, 1, 0, 0, 1) (tupla); Representamos apenas como 11001. 6 / 41

Compiladores Alfabetos e palavras ρ denota o número de símbolos da palavra ρ. Ex.: 11001 = 5 Uma linguagem sobre um alfabeto β é um conjunto de palavras sobre β. Ex.: L = {1 p p é primo} = {11, 111, 11111, 1111111,...} 7 / 41

Compiladores Computador formal Figura 1.1: Exemplo de computador formal [Pinto, 2016] 8 / 41

Compiladores Processadores de linguagem Figura 1.3: Executando o programa objeto [Aho et al., 2007] Figura 1.2: Um compilador [Aho et al., 2007] 9 / 41

Compiladores Interpretador Ao invés de produzir linguagem de máquina, o interpretador executa diretamente as operações especicadas no programa fonte sobre as entradas do usuário; Normalmente o programa objeto é mais rápido; O interpretador oferece melhor diagnóstico de erros. Figura 1.4: Um interpretador [Aho et al., 2007] 10 / 41

Compiladores Compiladores Java O programa Java primeiro gera código intermediário: bytecode; Os bytecodes são interpretados por uma máquina virtual; Conceito de compilação universal. Figura 1.5: Um compilador híbrido [Aho et al., 2007] 11 / 41

Compiladores Pré-processamento Alguns outros programas podem ser necessários para a geração do executável; O pré-processador é responsável por coletar o programa fonte e, possivelmente, expandir macros em comandos na linguagem fonte. Figura 1.6: Um sistema de processamento de linguagem [Aho et al., 2007] 12 / 41

Compiladores Modelo de análise e síntese A análise impõe um modelo gramatical para o código; Caso esteja sintaticamente mal formado ou semanticamente incorreto, deve informar qual é o erro; Gera também a tabela de símbolos, passada para a próxima etapa junto com a apresentação intermediária; A parte de síntese constrói o programa objeto a partir da tabela de símbolos e da representação intermediária; A compilação é organizada em fases, onde cada etapa transforma a representação anterior para a próxima camada. 13 / 41

Compiladores Fases Figura 1.7: Fases do compilador [Aho et al., 2007] 14 / 41

Linguagens de programação 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores 4 A estrutura de um compilador 15 / 41

Linguagens de programação Computadores e linguagens Um computador formal tem o objetivo principal de transformar linguagem fonte em linguagem objeto; A linguagem fonte é uma abstração de alto nível implementada no programa de computador; A linguagem objeto é o conjunto de símbolos que serão posteriormente lidos pelo processador; O programa objeto pode então ser chamado pelo usuário para processar entradas e produzir saídas [Aho et al., 2007]. 16 / 41

Linguagens de programação Linguagens de programação No início eram traduções das instruções de máquina; Introdução às linguagens orientados ao cálculo numérico: Fortran, LISP e Cobol; Linguagens de primeira geração: linguagens de máquina; Linguagens de segunda geração: linguagens simbólicas ou de montagem, como Assembly; Linguagens de terceira geração: procedurais de alto nível, como Fortran, LISP, Cobol, etc; Linguagens de quarta geração: aplicações especícas, como NOMAD para relatórios; Linguagens de quinta geração: lógica com restrição, tipo Prolog e OPS5. 17 / 41

Linguagens de programação Classicações Linguagens imperativas; Linguagens declarativas; Linguagens de Von Neumann (estruturadas); Linguagens orientadas a objeto; Linguagens de scripting. 18 / 41

Linguagens de programação Impactos Como os mudanças nas linguagens de programa afetam os compiladores? 19 / 41

Ciência dos compiladores 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores 4 A estrutura de um compilador 20 / 41

Ciência dos compiladores Modelagem Ferramentas para descrever os algoritmos e as unidades léxicas utilizadas pelos compiladores: Autômatos Finitos Representação gráca; Expressões Regulares Representação matemática. Ferramentas utilizadas para descrever a estrutura sintática: Gramáticas livres de contexto Representação matemática; Árvores Representação gráca. 21 / 41

Ciência dos compiladores Autômatos nitos Figura 3.1: Um autômato [Pinto, 2016] 22 / 41

Ciência dos compiladores Expressões regulares São expressões (sequências de símbolos), denidas recursivamente, que representam linguagens sobre um alfabeto Σ Figura 3.2: Algumas expressões regulares [Pinto, 2016] 23 / 41

Ciência dos compiladores Gramáticas livres de contexto Mecanismo de formação de palavras (sentenças) a partir de substituição de variáveis [Pinto, 2016]. Exemplos de gramática [Pinto, 2016] E ɛ (1) E 0E 1 (2) 24 / 41

Ciência dos compiladores Árvores Figura 3.3: Árvore de parsing [Amarasinghe and Rinard, 2010] 25 / 41

Ciência dos compiladores Otimização A otimização do código depende da capacidade de controlar a saída para todas as possíveis saídas; Caso a armação seja válida, dizemos que a saída é ótima; Requisitos da otimização [Aho et al., 2007]: A otimização precisa ser correta, ou seja, preservar a semântica do programa compilado; A otimização precisa melhorar o desempenho de muitos programas; Importância da corretude; Conceito de ecência; O tempo de compilação precisa continuar razoável; O esforço de engenharia empregado precisa ser administrável. Novo paradigma: consumo de energia! 26 / 41

Ciência dos compiladores Execução eciente Do alto para o baixo nível [Amarasinghe and Rinard, 2010]: Mapeamento puro e simples do programa para o assembly normalmente gera uma execução ineciente; Quanto maior o nível de abstração, mais ineciente. As abstrações para alto nível só são úteis se forem ecientes; Um bom compilador fornece a possibilidade de escrever em alto nível de abstração com a performance de instruções de baixo nível. 27 / 41

Ciência dos compiladores Exemplo de otimização Listing 1: [Amarasinghe and Rinard, 2010] i n t s u m c a l c ( i n t a, i n t b, i n t N) { i n t i ; i n t x, y ; x = 0 ; y = 0 ; f o r ( i =0; i <= N; i ++) { x = x+4 a /b i +( i +1)+( i +1) ; x = x + b y ; } } r e t u r n x ; Como otimizar esse código? 28 / 41

A estrutura de um compilador 1 Compiladores 2 Linguagens de programação 3 Ciência dos compiladores 4 A estrutura de um compilador 29 / 41

A estrutura de um compilador Execução A fase de análise divide o programa e impõe uma estrutura gramatical; Se houver algum erro, deve fornecer mensagens esclarecedoras; A fase de síntese constrói o programa objeto usando: Representação intermediária; Tabela de símbolos. Normalmente a compilação é dividida em fases, como descrito na Figura 14. 30 / 41

A estrutura de um compilador Análise léxica Normalmente a compilação se inicia pela análise léxica; Analisador léxico: lê o uxo de caracteres e agrupa em sequências signicativas; As sequências signicativas são chamadas lexemas; Para cada lexema, o analisador léxico produz como saída um token; nome_token, valor _atributo (3) O token é enviado para a etapa seguinte, a análise sintática. 31 / 41

A estrutura de um compilador Exemplo position = initial + rate 60 (4) position Mapeado para o token id, 1 : id Símbolo abstrato que signica identicador; 1 Entrada na tabela de símbolos onde está position. = Mapeado para o token =. Por não exigir um valor de atributo, omitimos o segundo componente; initial Mapeado para o token id, 2 ; + Mapeado para o token + ; rate Mapeado para o token id, 3 ; * Mapeado para o token ; 60 Mapeado para o token 60 1. 1 Para o lexema 60 deveria haver um token como numero, 4 32 / 41

A estrutura de um compilador Atribuição Após a análise léxica, executa-se o comando de atribuição; O comando gera as substituições apontadas no exemplo 4; Após a substituição, obtemos o resultado 5: id, 1 = id, 2 + id, 3 60 (5) É possível perceber que alguns tokens são símbolos abstratos; Os símbolos representam operadores. 33 / 41

A estrutura de um compilador Análise sintática Analisador sintático: utiliza os primeiros componentes dos tokens para gerar uma representação de árvore; A árvore representa a estrutura gramatical dos tokens; Representação da árvore de sintaxe: Cada nó interior representa uma operação; Filhos dos nós representam os argumentos da operação. As próximas fases do compilador utilizam a estrutura gramatical; Gerar o programa fonte; Gerar o programa objeto. 34 / 41

A estrutura de um compilador Árvore de sintaxe Figura 4.1: Tradução de uma instrução para o exemplo 4 [Amarasinghe and Rinard, 2010] 35 / 41

A estrutura de um compilador Análise semântica Utiliza a árvore de sintaxe e a tabela de símbolos para vericar a consistência semântica; Relaciona a semântica do programa fonte com a denição da linguagem; Reúne informações sobre tipos e salva na árvore de sintaxe; Realiza a vericação de tipos; Permite algumas conversões de tipo chamada coerções: Aplicar um operador aritmético binário a um par de inteiros; Ao aplicar um operador a um ponto utuante e a um inteiro, esse último pode ser convertido para ponto utuante; Ex.: Na gura 35 aparece o operador inttooat. 36 / 41

A estrutura de um compilador Código intermediário O compilador pode produzir uma ou mais representações intermediárias; Após as análises sintática e semântica, o compilador normalmente gera uma representação mais próxima da linguagem de máquina; Objetivos da representação de baixo nível: 1 Ser facilmente produzida; 2 Ser facilmente traduzida para a máquina alvo. 37 / 41

A estrutura de um compilador Tradução e atribuição Figura 4.2: Tradução e atribuição para o exemplo 4 [Amarasinghe and Rinard, 2010] 38 / 41

A estrutura de um compilador Três endereços Representação em código de três endereços: t1 = inttooat(60) t2 = id3 t1 t3 = id2 + t2 id1 = t3 1 Cada instrução de atribuição tem no máximo um operador do lado direito; Determinam a ordem de realização das operações. 2 O compilador precisa guardar o valor computador pela instrução; Geração de nome intermediário. 3 Algumas instruções podem ter menos de três operandos. 39 / 41

A estrutura de um compilador OBRIGADO!!! PERGUNTAS??? 40 / 41

A estrutura de um compilador Aho, A., Lam, M., Sethi, R., and Ullman, J. (2007). CompiladoresPrincpios Técnicas e Ferramentas. Pearson, 2a. edition. Amarasinghe, S. and Rinard, M. (2010). Computer language engineering. Disponível em http://ocw.mit.edu/courses/ electrical-engineering-and-computer-science/ 6-035-computer-language-engineering-spring-2010/ Acessado em 02/08/2016. Pinto, G. (2016). Notas de aula do Prof. Guilherme Pinto. UNICER (2001). Apostila de compiladores. 41 / 41