Implementação de Linguagens

Documentos relacionados
Implementação de Linguagens

Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Universidade Federal de Alfenas

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.

A máquina SECD. Pedro Vasconcelos. 20 de Fevereiro de 2014

Programação Estruturada e OO Aula 1.2 Introdução a Paradigmas de Programação. Prof. Bruno Moreno

Redução de grafos. Pedro Vasconcelos. 4 de Março de 2014

Linguagens Livres do Contexto. Adaptado de H. Brandão

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

Pedro Vasconcelos DCC/FCUP. Programação Funcional 14 a Aula Um verificador de tautologia

Análise Sintática Introdução

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

Projeto de Compiladores

Linguagens de Programação Funcional

FACULDADE LEÃO SAMPAIO

Apresentação. Informação geral + Conceitos iniciais

CAP. VI ANÁLISE SEMÂNTICA

FIC-POO. Aula 1.1 Apresentação do Curso e Introdução aos Paradigmas de Programação. Prof. Dr. Bruno Moreno

CP Compiladores I Prof. Msc.. Carlos de Salles

DECivil Departamento de Engenharia Civil, Arquitectura e Georrecursos. Apresentação. Computação e Programação (CP) 2013/2014.

Semântica de Linguagens de Programação

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

Universidade Federal do ABC Rua Santa Adélia, Bairro Bangu - Santo André - SP - Brasil CEP Telefone/Fax:

Introdução à Programação

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

Linguagens de Programação

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

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

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

Compiladores. Introdução

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

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

EA876 - Introdução a Software de Sistema

Linguagens de Programação

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Pedro Vasconcelos DCC/FCUP. Programação Funcional 13 a Aula Definição de tipos

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Programação I Aula 2 Apresentação da linguagem Python

Linguagens e Compiladores

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

PROGRAMAÇÃO I. Introdução

Programação Funcional 14 a Aula Classes de tipos revisitadas

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Introdução à Programação Aula 3 Primeiros programas

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

Conceitos de Linguagens de Programação

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

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Conceitos de Linguagens de Programação

Gramáticas Livres de Contexto

Linguagens de Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

V.2 Especificação Sintática de Linguagens de Programação

Autômatos e Linguagens

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

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

Linguagens de Programação Aula 3

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

Conclusões. Baseado no Capítulo 9 de Programming Language Processors in Java, de Watt & Brown

3. Linguagem de Programação C

Paradigmas de Programação

Linguagens de Programação

Noções de compilação

Introdução à Ciência da Computação. Prof. Dr. Rogério Vargas

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

Noções de compilação

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

INTRODUÇÃO À PROGRAMAÇÃO

Linguagens Formais e Autômatos P. Blauth Menezes

Construção de Compiladores Aula 16 - Análise Sintática

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

Procedimentos. Sistemas de Computação

Programação Funcional

Árvores (ordenadas) Departamento de Ciência de Computadores da FCUP MC Aula 11 1

Capítulo 1. Aspectos Preliminares

Interpretação e Compilação de Linguagens de Programação Abstração Funcional

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

Análise Sintática. Fabiano Baldo

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

Programação I Aula 3 Primeiros programas

Capítulo 1 Linguagens e processadores

OFICINA DA PESQUISA PROGRAMAÇÃO APLICADA À CIÊNCIA DA COMPUTAÇÃO

INTRODUÇÃO. Prof. Msc. Luis Filipe Alves Pereira 2015

Como construir um compilador utilizando ferramentas Java

Introdução à Programação / Programação I

Linguagens de Programação. Programação Funcional e Haskell Declarando Tipos Thiago Alves

Mecanismos de Interrupção e de Exceção, Barramento, Redes e Sistemas Distribuídos. Sistemas Operacionais, Sistemas

Estruturas de Dados Aula 1: Introdução e conceitos básicos 28/02/2011

COMPILADORES PROGRAMA E BIBLIOGRAFIA

Desenvolvimento de Aplicações Desktop

Computação efectiva. Que linguagens podem ser reconhecidas por algum tipo de autómato?

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

Web site. Profa. Patrícia Dockhorn Costa.

Compiladores - Gramáticas

Linguagens de Programação

Introdução à Programação

Programação imperativa. 1. Introdução e generalidades

Transcrição:

Implementação de Linguagens Pedro Vasconcelos DCC/FCUP 11 de Abril de 2016

Objectivos Introdução à implementação de linguagens de programação funcionais. Enfoce sobre técnicas de interpretação/compilação usando máquinas virtuais.

Pré-requisitos Conhecimento da linguagem Haskell (ou ML/Caml/F#). Conhecimento de linguagem C. Noções de técnicas de compilação: análise léxica; análise sintática (parsing); árvores sintáticas abstractas; geração de código.

Bibliografia Foundations for Functional Programming, Lawrence C. Paulson, http://www.cl.cam.ac.uk/~lp15/. Introdução ao cálculo-λ (próxima aula). Programming languages, Mike Grant e Scott Smith, http://www.cs.jhu.edu/~scott/pl/book. Introdução à semântica operacional (Capítulo 2). Sobre programação em Haskell: Programming in Haskell, Graham Hutton, Cambridge University Press, 2007. http://www.haskell.org (muita documentação tutorial online).

Programação funcional No paradigma imperativo a computação é expressa pela execução de instruções que mudam variáveis (estado) No paradigma funcional a computação é expressa usando aplicação de funções a valores As linguagens funcionais suportam e promovem o estilo funcional Exemplos: Scheme, ML, O Caml, F#, Haskell, Scala

Linguagens funcionais modernas Funções são valores de primeira classe: podem ser passadas a outras funções (ordem superior) podem ser guardadas em estruturas de dados Estruturas de dados: enumerações, tuplos, listas, árvores... decomposição usando encaixe de padrões gestão de memória automática Sistema de tipos estáticos tipos determinados antes da execução inferência automática de tipos (total ou parcial) Suporte para programação em larga escala módulos (ML, O Caml, Haskell) classes de tipos (Haskell) objectos (O Caml, F#, Scala)

Estado da arte Nos últimos 25 anos: muita investigação académica em linguagens, compilação e optimização, ferramentas e bibliotecas Implementações robustas (e.g., O Caml, Glasgow Haskell Compiler) Bastante eficientes: 1 50% da linguagem C em bechmarks sintéticos Performance semelhante ao Java com JIT Mais rápidas em alguns casos (e.g. concorrência, computação simbólica) 1 Computer Languages Benchmarks Game, http://shootout.alioth.debian.org.

Metodologia para estas aulas 1 Formalização de linguagens: sintaxe e semântica 2 Fundamentos de programação funcional (cálculo-λ) 3 FUN: uma linguagem funcional mínima ilustrar princípios de desenho e implementação permitir a experimentação por parte dos alunos 4 Semânticas formais para FUN 5 compiladores/interpretadores em Haskell/C: programas sucintos próximos do formalismo matemático especificação executável base para trabalhos práticos

Formalização de linguagens Sintaxe regras de formação de expressões, frases, etc. Semântica definição do significado desses fragmentos A sintaxe é formalizada usando gramáticas livres de contexto. A semântica pode ser formalizada de vária formas; vamos usar semânticas operacionais.

Gramáticas livres de contexto Σ conjunto de símbolos terminais. V conjunto de símbolos não-terminais. P conjunto de produções da forma <não-terminal> ::= <alt> 1... <alt> n em que <alt> i são sequências de terminais ou não-terminais. S V símbolo não-terminal inicial Linguagem sequências de símbolos terminais geradas apartir de S usando as produções.

Exemplo: expressões aritméticas Terminais Σ = {0, 1,..., 9, +,, (, )} Não-terminais V = {E, N, A} Símbolo inicial E Produções E ::= E + E E E (E) N N ::= AN A A ::= 0 1 2 3 4 5 6 7 8 9

Derivações E E + E E + E E N + E E A + E E 1 + E E 1 + N E 1 + A E 1 + 2 E 1 + 2 N 1 + 2 A 1 + 2 3 }{{} terminais Logo: 1+2*3 é uma palavra da linguagem de expressões.

Árvores de derivação Podemos representar a derivação de uma palavra por uma árvore: E E N A + E E * E N 1 A N A 2 3 Exercício: encontrar outra derivação que resulta numa árvore diferente. 2 2 Esta gramática é ambígua.

Sintaxe abstracta A sintaxe abstracta representa a estrutura da árvore de derivação omitindo informação desnecessária, e.g.: decomposição de números em algarismos parêntesis Definindo um tipo de dados em Haskell: data Expr = Add Expr Expr Mult Expr Expr Num Int deriving (Eq, Show)

Sintaxe concreta vs. abstracta 1+2*3 Add (Num 1) (Mult (Num 2) (Num 3)) Mult (Add (Num 1) (Num 2)) (Num 3) (1+2)*3 Mult (Add (Num 1) (Num 2)) (Num 3) 1+2+3 Add (Add (Num 1) (Num 2)) (Num 3) Add (Num 1) (Add (Num 2) (Num 3))

Semântica operacional Uma relação entre expressões e valores (inteiros) Definida indutivamente sobre termos da sintaxe abstracta Regras de inferência da forma A 1 A 2... A n A 1, A 2,..., A n hipóteses B conclusão axioma quando n = 0 leitura lógica: se A 1,..., A n então B leitura computacional: para obter B, efectuar A 1,..., A n. B

Regras de inferência Num n n e 1 n 1 e 2 n 2 Add e 1 e 2 n 1 + n 2 e 1 n 1 e 2 n 2 Mult e 1 e 2 n 1 n 2

Exemplo duma derivação Num 1 1 Num 2 2 Add (Num 1) (Num 2) 3 Num 3 3 Mul (Add (Num 1) (Num 2)) (Num 3) 9

Interpretador em Haskell Podemos implementar como uma função recursiva: eval :: Expr -> Int eval (Num n) = n eval (Add e1 e2) = eval e1 + eval e2 eval (Mult e1 e2) = eval e1 * eval e2 Exemplo: eval (Mult (Add (Num 1) (Num 2)) (Num 3)) = eval (Add (Num 1) (Num 2)) * eval (Num 3) = (eval (Num 1) + eval (Num 2)) * 3 = (1 + 2) * 3 = 9

Correção O interpretador implementa correctamente a semântica operacional: e n se e só se eval e = n Prova: por indução estrutural sobre e.

Compilação de expressões Vamos definir uma máquina virtual para a linguagem das expressões aritméticas Traduzimos cada expressão numa sequência de operações Eliminamos a recursão: os valores intermédios passam a ser explícitos Para executar o código virtual já não necessitamos da árvore sintática

Uma máquina de pilha Configuração da máquina abstracta: pilha: uma sequência de inteiros; programa: uma sequência de instruções Instruções da máquina abstracta: PUSH n coloca um valor no topo da pilha } ADD operações aritméticas MUL (sobre valores na pilha)

Operações sobre a pilha. PUSH v v. v 1 v 2. ADD Analogamente para a instrução MUL. v 1 + v 2.

Definições da máquina -- instruções da máquina virtual data Instr = PUSH Int ADD MUL deriving (Eq,Show) -- a pilha é uma lista de valores type Stack = [Int] -- o código é uma lista de instruções type Code = [Instr] -- a configuração da máquina type State = (Stack, Code)

Compilador de expressões compile :: Expr -> Code compile (Num n) = [PUSH n] compile (Add e1 e2) = compile e1 ++ compile e2 ++ [ADD] compile (Mul e1 e2) = compile e1 ++ compile e2 ++ [MUL] Traduz uma expressão numa sequência de instruções Análogo a eval, mas gera instruções em vez valores Invariante A execução de compile e acrescenta o valor de e ao topo da pilha.

Exemplo > compile (Mult (Add (Num 1) (Num 2)) (Num 3)) [PUSH 1, PUSH 2, ADD, PUSH 3, MUL]

Função de transição Implementa a transição associada a cada instrução da máquina abstracta: exec :: State -> State exec (stack, PUSH v:code) = (v:stack, code) exec (v1:v2:stack, ADD:code) = ((v1+v2):stack, code) exec (v1:v2:stack, MUL:code) = ((v1*v2):stack, code)

Interpretador de código virtual Iterar a função de transição até esgotar as instruções; o resultado é o topo da pilha. runstate :: State -> Int runstate (v:_, []) = v runstate s = runstate (exec s) run :: Code -> Int run c = runstate ([],c) Exemplo de execução: > run (compile (Mult(Add(Num 1)(Num 2))(Num 3)) 9

Dois processos para calcular expressões Expr eval Int compile Code run Int Correção da compilação e. eval e = run (compile e)

Dois processos para calcular expressões Expr eval Int compile Code run? Int Correção da compilação e. eval e = run (compile e)

Dois processos para calcular expressões Expr eval Int compile Code run Int Correção da compilação e. eval e = run (compile e)

Conclusão Dois interpretadores em Haskell: eval um interpretador de expressões especificação de alto-nível run interpretador de código virtual mais perto de uma máquina real Correção da compilação: os dois interpretadores produzem o mesmo resultado para qualquer expressão Na próxima aula, vamos (re)ver o cálculo-λ: um modelo abstracto duma linguagem de programação variáveis, funções, aplicação, recursão...