Implementação de Linguagens Funcionais

Slides:



Advertisements
Apresentações semelhantes
Decidibilidade e Indecidibilidade
Advertisements

Funções em C Prof. Fabiano Utiyama.
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Gustavo Sant´Anna Ferreira Rodrigo Ribeiro de Souza
Curso de aprofundamento na linguagem C
gerador de código intermediário
3 Paradigmas e Linguagens de Programação
Parte I Capítulo 5 Reutilizando código e escrevendo funções.
Engenharia de Software
Modelagem de Sistemas Alcides Calsavara.
Orientação a Objetos: Encapsulamento e Classificação
Mutação de Interface Interface Mutation: An Approach for Integration Testing Marcio E. Delamaro José C. Maldonado Aditya P. Mathur.
Meta - heurísticas Prof. Aurora
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
Listas lineares Listas Lineares Fila Dupla Pilha Fila Saída restrita
Estruturas de Dados e Algoritmos
Rafael Pinto Frederico Corrêa
02(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
01(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
05(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
04(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
Introdução ao -calculus
7 Abstração Genérica Unidades genéricas e instanciação.
00(c) 2007 Gustavo Motta1 Introdução ao -calculus Prof. Gustavo Motta Departamento de Informática/UFPB.
Revisão da Linguagem C.
Classes e objetos P. O. O. Prof. Grace.
Meta - heurísticas Prof. Aurora
APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.
JAVA: Conceitos Iniciais
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Ferramentas para a Construção de Compiladores: Lex & Yacc
Sistemas Distribuídos
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Resenha do Artigo Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I) (Simon L. Peyton Jones} Monique L.
Estudo dos Conceitos e Paradigmas de Programação
Paradigmas de Linguagens de Programação Linguagem Imperativa 2
Paradigmas de Linguagens de Programação Linguagem Imperativa 1
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Paradigma Funcional Apresentação de LF1.
Aula 3 Vetores e Listas. Arrays (vetores) Array – sequência de elementos do mesmo tipo. Tamanho do Array – seu número de elementos (número fixo) Consequência:
Compilação de Linguagens OO Marco Simões (macs3) André Santos (alms)
Ambiente de Execução - Rotinas
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
SISTEMAS OPERACIONAIS I
Paradigma funcional.
Listas Simplesmente Encadeadas
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Capítulo VIII Ambientes de Execução
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
1 O  -Cálculo & Linguagens Funcionais Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco - Recife - Brasil.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Bruno C. Bourbon Jarbas J. de O. Júnior {bcb, cin.ufpe.br
Cálculo Lambda (l – Calculus)
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Aula 18 1 Análise Sintáctica Compiladores, Aula Nº 18 João M. P. Cardoso.
Estruturas de Dados I Segundo Período de 2008 Gabarito da Primeira Prova.
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Lambda Cálculo & Programação Funcional
Recursividade Bruno Silva.
Recursividade Profs. De Prog2 e Lab2.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro (Simon Marlow, Simon.
Cálculo Lâmbda (l – Calculus)
Paradigmas de Linguagens de Programação Conceitos da Linguagem Imperativa 1 Augusto Sampaio e Paulo Borba Centro de Informática Universidade Federal de.
Ponteiros em C Prof. Kariston Pereira
Lógicas Combinatoriais e Implementações Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco.
Universidade Estadual de Santa Cruz Conceitos de Linguagens de Programação Aluno: Pedro Arthur M. Nascimento Ilhéus-Ba, 05 de Novembro de 2012.
©André Santos, Programação Funcional Laziness / Provas de Propriedades André Santos.
Java Como Programar, 8/E Deitel/Deitel, 8e. Java – Como programar Copyright © 2010 Pearson Education Slide 1.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Transcrição da apresentação:

Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais

Roteiro Arquitetura Lambda-calculus Lambda Lifting Redução de Grafos Máquina de Templates Referências

Arquitetura

Lambda-calculus Modelo teórico sob o qual se baseiam a semântica e a implementação de linguagens funcionais. lx. E : É uma função que assume um argumento x e retorna uma expressão E (que pode depender de x)

Lambda-calculus Bound X free variables Seja lx.x (lz.x y z) (y z) x é bound da abstração mais externa y não é bound para ambas abstrações Z é bound apenas na abstração mais interna Uma abstração l sem variáveis livres é um combinator

Lambda-calculus b – conversion: Operação de substituição bidirecional (lx.E) E’ «b E[E’/x] Reduz a aplicação de uma abstração l

Lambda-calculus Redex: Reducible Expression ou um uma aplicação de uma abstração ou uma aplicação de uma função pre-definida Uma expressão l está na forma normal se ela não possui nenhum redex

Lambda-calculus Avaliação: Seqüência de reduções Applicative-order reduction Eager Evaluation Normal-order reduction Lazy Evaluation Uma expressão está na WHNF Quando não mais é possível realizar reduções na Normal-order reduction

Lambda-calculus Strict functions: precisam de fato do valor de seus argumentos g é restrita ao segundo argumento se e somente se g x ^ z = ^ Lazy functions: Podem ser avaliadas na falta de algum argumento

Lambda-lifting Consiste em técnica de transformar programas funcionais com definições locais, em um programa contendo apenas definições globais Cada ocorrência de uma variável livre no corpo da função é substituída pela adição de um novo parâmetro formal

Lambda-lifting Permite full laziness, pela maximização do compartilhamento de definições Evita a criação de closures em tempo de execução

Super-combinadores Free expression é uma expressão que não contém nenhuma instância de uma bound variable Maximal free variables (mfv) são expressões livres que não contém nenhuma outra expressão livre. Super-combinadores são funções que abstraem suas mfvs como parâmetros

Super-combinadores Exemplo:

Redução de Grafos Núcleo da execução de um programa funcional Consiste em substituir uma expressão redutível (redex) por sua forma reduzida Lambda-Calculus a b e h-conversão

Redução de Grafos Expressões representadas em forma de grafo Cada nó é fisicamente representado em células, que podem ter tamanho fixo ou variável Valores Boxed e Unboxed

Redução de Grafos - Algoritmo Até que não haja mais nenhum redex (forma normal) Selecione o redex mais externo (Normal-order reduction) Reduza-o (a b e h-reduction) Substitua o redex pelo resultado da redução Obs: Se uma função for restrita a algum argumento, ele pode ser avaliado antes

Redução de aplicações b - Reduction 1.Função definida pelo usuário (supercombinador) Substituir o nó de aplicação pelo corpo da função, e os parâmetros formais por ponteiros para os argumentos 2.Função pré-definida (primitivas) Se os argumentos não estiverem reduzidos, reduzir Avaliar a função

Redução de Grafos - Compartilhamento de cópias Se dois grafos são semelhantes, apenas uma cópia é preciso. Aumenta o compartilhamento no grafo Uma implementação que maximiza o compartilhamento é dita Fully Lazy Garbage Collection se faz necessária

Redução de Grafos – Um exemplo square x = x * x ; main = square (square 3) @ / \ square @ / \ square 3 1 main

Redução de Grafos – Um exemplo @! / \ square @ / \ square 3 @! / \ @ \ / \__ @ * / \ square 3 1

Redução de Grafos – Um exemplo @ / \ @ \ / \__ @ * / \ square 3 @ / \ @ \ / \__ @! * / \ square 3 2.1 @ / \ @ \ / \__ @! * / \ @ \ / \__ 3 * 1

Redução de Grafos – Um exemplo @ / \ @ \ / \__ @! * / \ @ \ / \__ 3 * @! / \ @ \ / \__ 9 * 2.2 2.2 81

Redução de Grafos - Função projetora: é uma função cujo corpo é apenas uma variável Causam perda de compartilhamento Seja head [f E] Substituir o nó faz com que a aplicação (f E) seja duplicada Solução: Nó de indireção (ponteiro para outro nó)

Redução de Grafos - Nós de indereção são ineficientes Deve ser testada indireção toda vez que uma operação for realizada Pode formar correntes de indireção Solução: Boa parte dos argumentos pode ser avaliada antes da aplicação da função projetora

Máquina de Templates Máquina de estados Stack: Pilha de endereços, relativos ao heap Dump: Pilha de pilhas Heap: Lista de nós identificadas por endereços Globals: Lista os endereços dos supercombinadores

Máquina de Templates Transições de Estado Aplicação Instanciação T1 T2

Máquina de Templates Estrutura principal Compile > runProg = showResults . eval . compile . Parse Compile Transforma um programa em um estado inicial

Máquina de Templates Estágio de Avaliação T1 T2 > apStep :: TiState -> Addr -> Addr -> TiState > apStep (stack, dump, heap, globals, stats) a1 a2 > = (a1 : stack, dump, heap, globals, stats) T1 > scStep :: TiState -> Name -> [Name] -> CoreExpr -> TiState > scStep (stack, dump, heap, globals, stats) sc_name arg_names body > = (new_stack, dump, new_heap, globals, stats) > where > new_stack = result_addr : (drop (length arg_names+1) stack) > > (new_heap, result_addr) = instantiate body heap env > env = arg_bindings ++ globals > arg_bindings = zip2 arg_names (getargs heap stack) T2

Máquina de Templates Instanciação de supercombinador Função instantiate Consiste em percorrer o nó do corpo do supercombinador, substituindo os parâmetros formais pelos argumentos

Máquina de Templates Atualização Para evitar avaliar uma expressão mais de uma vez, adiciona-se um novo tipo de nó: um nó de indireção > NInd a1 É preciso adicionar uma nova transição T3

Máquina de Templates Atualização Ao avaliar-se um supercombinador, substitui-se o nó no heap por um nó de indireção Avaliações subseqüentes só precisam seguir o nó de indireção T2

Garbage Collection Mark-scan collection Marcar os nós acessíveis Escanear todo o heap, eliminando nós não marcados

Referências Jones, S. e Lester, D. Implementing Functional Languages: a tutorial http://research.microsoft.com/Users/simonpj/Papers/pj-lester-book/ Functional Programming - UWA http://undergraduate.csse.uwa.edu.au/courses/230.301/lectureNotes/