Resenha do Artigo Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I) (Simon L. Peyton Jones} Monique L. B. Monteiro {mlbm}@cin.ufpe.br
Essência do Artigo Propor um modelo otimizado e simplificado de compilação de linguagens funcionais Expor em detalhes o funcionamento da Spineless Tagless G-Machine
Relevância para o HS.NET Entender o modelo básico de compilação utilizado pelo GHC Promover maior intimidade com a compilação de linguagens funcionais em geral
STG – Visão geral Máquina abstrata projetada para linguagens funcionais não estritas de alta ordem Utiliza uma linguagem intermediária funcional – STG Language C como linguagem alvo Eficiente Linguagens fortemente tipadas, puramente funcionais e lazy
Várias transformações... Compilação de Haskell Várias transformações...
Alternativas de Implementação
Implementação Combinação de várias outras técnicas Origens em técnicas de redução de grafos Representação de Funções-valor Dados Expressões não avaliadas Aplicação de funções Estruturas case em dados de tipos algébricos
Closures Objetos do heap Closures Head Normal form Normal Form Head normal form (ou valores) Objetos não avaliados (thunks) Head Normal form Função-valor Dados Normal Form Não contém thunks Closures
Funções - Computação “suspensa” - Bloco de código compartilhado - Denominado closure - Para entrar na closure: ponteiro de ambiente aponta para a mesma Variáveis Livres Código
Thunks Computação “suspensa” Representados por closures Atualizados na primeira avaliação Não são aplicações parciais Não são construtores
Atualizações Naïve reduction model Cell model (Modelo de célula) Atualiza após cada redução Um thunk pode ser atualizado com outro: atualização repetida Cell model (Modelo de célula) Flag de status Já foi avaliado: retorna o valor Não foi avaliado: “entra”, calcula o valor Código chamador atualiza o valor e a flag
Atualizações Self-updating model (Auto-atualização) Utilizado pela STG Atualização feita pelo código interno ao thunk Valor é computado e atualizado OU simplesmente retornado Valor pode ser representado por indireção Não há testes Deve possuir ponteiro para código Nem sempre a atualização precisa ser feita!
Depois de atualizar (valor grande) Depois de atualizar (valor pequeno) Atualização: Exemplo Modelo de auto-atualização Variáveis Livres Antes de atualizar Código Depois de atualizar (valor grande) Código de indireção Depois de atualizar (valor pequeno) Tail Head Valor Código do Cons
Atualização: Exemplo Modelo de célula 1 Código Variáveis Livres Antes de atualizar Depois de atualizar 1 Valor
Aplicação de Funções Currificação f x y = x Tipo de f pode ser a -> (b -> a) (f 1 2) = ((f 1) 2) (map (f 1) xs) f x y = x
Aplicação da Funções Modelo eval-apply Funcao é avaliada Argumentos são avaliados Valor-função é aplicado ao argumento Avaliação trivial para funções conhecidas Modelo push-enter (STG, G-machine, TIM) Baseado em redução de grafo Coloca-se o argumento na pilha de avaliação Tail-call (ou entra) a função Não há “return”
Modelo push-enter Adequado para uso de funções currificadas Os 3 argumentos são empilhados apply f x y z = f x y z
Modelo push-enter Não há alocação explícita de quadros de ativação Pilha de avaliação contígua ao invés de lista ligada de quadros alocados na heap Melhor performance (localidade espacial) Outra alternativa: v,G-machine Espaço de trabalho alocado em cada closure Mal uso de espaço Aplicação parcial: cópia dos argumentos para a closure da aplicação Espaço alocado pode não ser suficiente
Tipos Algébricos Compiladores implementam tipos built-in de forma “mágica” Pior performance para tipos algébricos definidos pelo usuário Mecanismo genérico para compilação de tipos algébricos deveria ser eficiente para tipos built-in! Compilação de expressões case
Resenha do Artigo Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I) (Simon L. Peyton Jones} Monique L. B. Monteiro {mlbm}@cin.ufpe.br