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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Compilação de Haskell Várias transformações... Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Closures • Objetos do heap – Head normal form (ou valores) – Objetos não avaliados (thunks) • Head Normal form – Função-valor – Dados • Normal Form – Não contém thunks Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Thunks • • • • • Computação “suspensa” Representados por closures Atualizados na primeira avaliação Não são aplicações parciais Não são construtores Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Atualizações • Naïve reduction model – 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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! Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Atualização: Exemplo • Modelo de auto-atualização Antes de atualizar Variáveis Livres Código Depois de atualizar (valor grande) Depois de atualizar (valor pequeno) Valor Head Código de indireção Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Código do Cons Tail Atualização: Exemplo • Modelo de célula Antes de atualizar 0 Depois de atualizar 1 Código Variáveis Livres Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.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) Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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” Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 Modelo push-enter • Adequado para uso de funções currificadas apply f x y z = f x y z • Os 3 argumentos são empilhados Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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 de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.1 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