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

Implementação de Linguagens Funcionais Eudes Raphael Thiago Arrais

Embed Size (px)

Citation preview

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/