A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro (Simon Marlow, Simon.

Apresentações semelhantes


Apresentação em tema: "Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro (Simon Marlow, Simon."— Transcrição da apresentação:

1 Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro {mlbm}@cin.ufpe.br (Simon Marlow, Simon L. Peyton Jones}

2 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Essência do Artigo Fornecer uma base substancial para a escolha entre os modelos push-enter e eval-apply a partir de experiências qualitativas e quantitativas em um compilador para Haskell (GHC)Fornecer uma base substancial para a escolha entre os modelos push-enter e eval-apply a partir de experiências qualitativas e quantitativas em um compilador para Haskell (GHC)

3 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Relevância para o HS.NET Mostrar detalhes sobre os dois modelos de avaliação mais utilizadosMostrar detalhes sobre os dois modelos de avaliação mais utilizados Abrir discussão sobre o esquema de tradução a ser implementadoAbrir discussão sobre o esquema de tradução a ser implementado

4 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Push/enter vs eval/apply Diferem quanto à responsabilidade pela checagem de argumentosDiferem quanto à responsabilidade pela checagem de argumentos Push/enter:Push/enter: –Responsabilidade da função Conhece sua própria aridadeConhece sua própria aridade Examina a pilhaExamina a pilha Eval/apply:Eval/apply: –Responsabilidade do código invocador Conhece os argumentosConhece os argumentos Examina a closure para obter a aridade e gerar chamada exataExamina a closure para obter a aridade e gerar chamada exata

5 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Linguagem Possui:Possui: –Literais (inteiros, números de ponto flutuante) –Chamadas de função: f k a 1,...,a n f n : compilador conhece estaticamente a aridade n de ff n : compilador conhece estaticamente a aridade n de f f : compilador NÃO conhece estaticamente a aridade n de ff : compilador NÃO conhece estaticamente a aridade n de f –Expressões let –Expressões case Valores unboxed podem ser passados como argumentos, retornados como resultado, armazenados em estruturas de dados, etc.Valores unboxed podem ser passados como argumentos, retornados como resultado, armazenados em estruturas de dados, etc.

6 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Objetos da Heap FUN(x 1,...,x n  e)FUN(x 1,...,x n  e) –Closure de função de aridade n –Aplicável a qualquer número de argumentos PAP(f a 1,...,a n )PAP(f a 1,...,a n ) –Aplicação parcial de f a a 1,..., a n –f é do tipo FUN CON(C a 1,...,a n )CON(C a 1,...,a n ) –Aplicação saturada do construtor C a a 1,...,a n THUNK eTHUNK e – e é avaliado sob demanda –Closure é atualizada com indireção para o valor de e BLACKHOLEBLACKHOLE –Usado durante avaliação de um THUNK

7 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Semântica Operacional Componentes de cada estado:Componentes de cada estado: –Código e : expressão sob avaliação –Pilha s : pilha de continuações –Heap H Cada continuação pode ser:Cada continuação pode ser: –case of ( alt 1 ;...; alt n ) –Upd t –Upd t –( a 1,..., a n ) [eval/apply] –Arg a [p ush/enter] e1; s1; H1  e2; s2; H2e1; s1; H1  e2; s2; H2e1; s1; H1  e2; s2; H2e1; s1; H1  e2; s2; H2

8 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Regras comuns

9 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Regras comuns (cont.)

10 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Regras para push/enter

11 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Modelo push/enter Aplicação de funções (PUSH)Aplicação de funções (PUSH) –Empilha argumentos como argumentos pendentes –“Entra” na função: FENTER:FENTER:  Parâmetros formais são mapeados nos parâmetros reais  Os argumentos que sobram são deixados na pilha PAP1:PAP1:  Thunk empilhou frame de atualização  Expressão case avaliou uma função PAP1:PAP1:  Argumentos são copiados para a pilha

12 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Regras para eval/apply

13 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Modelo eval/apply Se o número de argumentos for exato, comporta-se como KNOWNCALL, mesmo que a função não seja estaticamente conhecidaSe o número de argumentos for exato, comporta-se como KNOWNCALL, mesmo que a função não seja estaticamente conhecida Se hover muitos argumentos, empilha uma continuação que contém os argumentos excedentes. Esta é a essência do eval/apply.Se hover muitos argumentos, empilha uma continuação que contém os argumentos excedentes. Esta é a essência do eval/apply. –“Dada uma aplicação f x y, se f recebe um argumento, então chame f x e aplique a função resultante a y”

14 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Pilha de atualização Continuações são representadas por stack framesContinuações são representadas por stack frames Stack frames comuns:Stack frames comuns: –Continuação de atualização - Upd t : Endereço de retorno: código genérico de atualizaçãoEndereço de retorno: código genérico de atualização Ponteiro para o thunk a ser atualizadoPonteiro para o thunk a ser atualizado –Continuação de expressão case - case of ( alt 1 ;...; alt n ): Endereço de retorno: código das alternativasEndereço de retorno: código das alternativas Variáveis livres das alternativasVariáveis livres das alternativas Um frame é uma closure alocada na pilhaUm frame é uma closure alocada na pilha Endereço de retorno possui uma info tableEndereço de retorno possui uma info table

15 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Push/enter: Implementação Pilha armazena argumentos pendentes, que não possuem endereço de retornoPilha armazena argumentos pendentes, que não possuem endereço de retorno –Torna a geração de código C-- mais difícil e ineficiente Como o GHC sabe quantos argumentos há na pilha?Como o GHC sabe quantos argumentos há na pilha? –Registrador Su, que aponta para o update frame ou case frame mais próximo ao topo da pilha Fast entry-point:Fast entry-point: –Funções conhecidas estaticamente –Argumentos em registradores e/ou na pilha Slow entry-point:Slow entry-point: –Todos os argumentos na pilha –Faz checagem de argumentos: Stack pointer - Su

16 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Percorrendo a pilha Argumentos pendentes permanecem na pilha até serem utilizadosArgumentos pendentes permanecem na pilha até serem utilizados –Isso pode durar muito tempo! O garbage collector deve ser capaz de identificar os ponteiros na pilhaO garbage collector deve ser capaz de identificar os ponteiros na pilha –Facilmente identificáveis para stack frames regulares (update e case) –Dificilmente identificáveis para frames do tipo Arg Não possuem descrição de número ou layoutNão possuem descrição de número ou layout –Implementações eficientes são propostas

17 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Eval/apply: Implementação O modelo eval/apply utiliza continuações de chamada da forma ( a 1,..., a n )O modelo eval/apply utiliza continuações de chamada da forma ( a 1,..., a n ) –Endereço de retorno: Seguido quando a função avalia para um valor (FUN ou PAP) e retornaSeguido quando a função avalia para um valor (FUN ou PAP) e retorna –Argumentos Códigos pré-gerados para 1,2,3,...,N argumentosCódigos pré-gerados para 1,2,3,...,N argumentos –Sucessão de continuações para mais de N argumentos

18 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Eval/apply: Implementação

19 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Argumentos excedentes Se f recebe 1 argumento, call f 3 x compila para:Se f recebe 1 argumento, call f 3 x compila para: f1 = stgApplyN(f, 3); jump stgApplyP(f1, x);

20 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Vantagens eval/apply Mais fácil de mapear em linguagens assembly portáveisMais fácil de mapear em linguagens assembly portáveis Não necessidade de:Não necessidade de: –distinguir entre ponteiros e não ponteiros –tags para não ponteiros –ponteiro Su Passagem de argumentos em registradores para funções desconhecidasPassagem de argumentos em registradores para funções desconhecidas –Push/enter requer argumentos sempre na pilha Funções de sistema invocáveis a partir de Haskell são mais convenientes de escreverFunções de sistema invocáveis a partir de Haskell são mais convenientes de escrever

21 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Vantagens push/enter Adequa-se naturalmente a currificaçãoAdequa-se naturalmente a currificação Elimina algumas alocações de PAPElimina algumas alocações de PAP O payload de um objeto PAP pode ser auto- descritoO payload de um objeto PAP pode ser auto- descrito –Argumentos possuem tags –No modelo eval/apply a descrição é delegada ao objeto FUN Complicações no garbage collectorComplicações no garbage collector Um objeto PAP pode conter apenas objetos FUN, nunca objetos PAPUm objeto PAP pode conter apenas objetos FUN, nunca objetos PAP

22 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Algumas diferenças Push/enter Requer slow entry-point para toda função Requer slow entry-point para toda função  Checagem de argumentos Presença do Su Presença do Su  Facilita caminhada pela cadeia de frames de atualização Eval/apply Requer slow entry-point em algumas situações Requer slow entry-point em algumas situações  Argumentos em um bloco contíguo de memória Ausência do Su Ausência do Su  Podem ser examinados outros frames além dos de atualização  Porém Su pode ser adicionado

23 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Números Anatomia das chamadasAnatomia das chamadas

24 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Números (cont.) Tempo de execuçãoTempo de execução –Pequena diferença entre os dois modelos –Eval/apply vence por 2-3% Escritas em memóriaEscritas em memória –Eval/apply realiza menos escritas Valor do Su não é salvo nos frames de atualizaçãoValor do Su não é salvo nos frames de atualização Alocação no heapAlocação no heap –Performance quase não é afetada Eval/apply aloca PAP para funções retornadasEval/apply aloca PAP para funções retornadas PAPs no eval/apply são menores (ausência de tags para não-ponteiros)PAPs no eval/apply são menores (ausência de tags para não-ponteiros)

25 Resenha de Artigo - Projeto Haskell.NET @ CIn/UFPE – 2004.2 Conclusões Modelo eval/apply:Modelo eval/apply: –Facilita o gerenciamento da complexidade dos ambientes de compilação e execução –Permite uma implementação compilada de alta performance para linguagens estritas de alta ordem Modelo push/enter:Modelo push/enter: –Complexidade adicionada para resolver problemas de performance –Solução mais elegante para interpretadores

26 Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro {mlbm}@cin.ufpe.br (Simon Marlow, Simon L. Peyton Jones}


Carregar ppt "Resenha do Artigo Making a fast curry Push/enter vs eval/apply for higher- order languages Monique L. B. Monteiro (Simon Marlow, Simon."

Apresentações semelhantes


Anúncios Google