Top Banner
Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais
33

Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Apr 19, 2015

Download

Documents

Internet User
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Implementação de Linguagens Funcionais

Eudes RaphaelThiago Arrais

Page 2: 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

Page 3: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Arquitetura

Page 4: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Lambda-calculus

Modelo teórico sob o qual se baseiam a semântica e a implementação de linguagens funcionais.

x. E : É uma função que assume um argumento x e retorna uma expressão E (que pode depender de x)

Page 5: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Lambda-calculus

Bound X free variables Seja x.x (z.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 sem variáveis

livres é um combinator

Page 6: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Lambda-calculus

– conversion: Operação de substituição bidirecional

(x.E) E’ E[E’/x] Reduz a aplicação de uma abstração

Page 7: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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 está na forma

normal se ela não possui nenhum redex

Page 8: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 9: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 10: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 11: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Lambda-lifting Permite full laziness, pela

maximização do compartilhamento de definições

Evita a criação de closures em tempo de execução

Page 12: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 13: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Super-combinadores Exemplo:

Page 14: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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 e-conversão

Page 15: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 16: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de Grafos - Algoritmo

Até que não haja mais nenhum redex (forma normal)

1. Selecione o redex mais externo (Normal-order reduction)

2. Reduza-o (e-reduction)

3. Substitua o redex pelo resultado da redução

Obs: Se uma função for restrita a algum argumento, ele pode ser avaliado antes

Page 17: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de aplicações - 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

Page 18: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 19: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de Grafos – Um exemplo

square x = x * x ;

main = square (square 3)

main

@ / \square @ / \ square 3

1

Page 20: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de Grafos – Um exemplo

@! / \square @ / \ square 3

@! / \ @ \ / \__ @ * / \ square 3

1

Page 21: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de Grafos – Um exemplo

@ / \ @ \ / \__ @ * / \ square 3

@ / \ @ \ / \__ @! * / \ square 3

2.1

@ / \ @ \ / \__ @! * / \ @ \ / \__ 3 *

1

Page 22: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Redução de Grafos – Um exemplo

@ / \ @ \ / \__ @! * / \ @ \ / \__ 3 *

@! / \ @ \ / \__ 9 *

2.2

81

2.2

Page 23: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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ó)

Page 24: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 25: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 26: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Máquina de Templates Transições de Estado

Aplicação

Instanciação

T1

T2

Page 27: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Máquina de Templates Estrutura principal

> runProg = showResults . eval . compile . Parse

Compile Transforma um programa em um

estado inicial

Page 28: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Máquina de Templates Estágio de Avaliação

> 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

Page 29: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 30: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 31: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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

Page 32: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

Garbage Collection Mark-scan collection

Marcar os nós acessíveis Escanear todo o heap, eliminando nós

não marcados

Page 33: Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais.

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/