210 likes | 352 Views
Monique L. B. Monteiro {mlbm}@cin.ufpe.br. Resenha do Artigo. Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I). (Simon L. Peyton Jones}. Essência do Artigo. Propor um modelo otimizado e simplificado de compilação de linguagens funcionais
E N D
Monique L. B. Monteiro {mlbm}@cin.ufpe.br Resenha do Artigo Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I) (Simon L. Peyton Jones}
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
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 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
Variáveis Livres Código Funções - Computação “suspensa” - Bloco de código compartilhado - Denominado closure - Para entrar na closure: ponteiro de ambiente aponta para a mesma
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 • 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!
Antes de atualizar Variáveis Livres Depois de atualizar (valor grande) Depois de atualizar (valor pequeno) Head Tail Código de indireção Atualização: Exemplo • Modelo de auto-atualização Código Valor Código do Cons
Antes de atualizar 0 1 Variáveis Livres Código Atualização: Exemplo • Modelo de célula Depois de atualizar Valor
Aplicação de Funções • Currificação • 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
Monique L. B. Monteiro {mlbm}@cin.ufpe.br Resenha do Artigo Implementing lazy functional languages on stock hardware: the Spineless Tagless G-Machine (Parte I) (Simon L. Peyton Jones}