resenha do artigo making a fast curry push/enter vs eval/apply for higher- order languages monique...

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

Upload: laura-ferreiro

Post on 07-Apr-2016

214 views

Category:

Documents


1 download

TRANSCRIPT

Page 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

Resenha do ArtigoResenha do ArtigoMaking a fast curry Making a fast curry Push/enter vs eval/apply for Push/enter vs eval/apply for higher-order languageshigher-order languages

Monique L. B. Monteiro{mlbm}@cin.ufpe.br

(Simon Marlow, Simon L. Peyton Jones}

Page 2: 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

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

Essência do ArtigoEssência do Artigo• Fornecer uma base substancial para a Fornecer uma base substancial para a

escolha entre os modelos escolha entre os modelos push-enter push-enter e e eval-apply eval-apply a partir de experiências a partir de experiências qualitativas e quantitativas em um qualitativas e quantitativas em um compilador para Haskell (GHC)compilador para Haskell (GHC)

Page 3: 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

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

Relevância para o HS.NETRelevância para o HS.NET• Mostrar detalhes sobre os dois Mostrar detalhes sobre os dois

modelos de avaliação mais utilizadosmodelos de avaliação mais utilizados

• Abrir discussão sobre o esquema de Abrir discussão sobre o esquema de tradução a ser implementadotradução a ser implementado

Page 4: 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

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

Push/enter vs eval/applyPush/enter vs eval/apply• Diferem quanto à responsabilidade Diferem quanto à responsabilidade

pela checagem de argumentospela checagem de argumentos• Push/enterPush/enter: :

– Responsabilidade da função Responsabilidade da função • Conhece sua própria aridadeConhece sua própria aridade• Examina a pilhaExamina a pilha

• Eval/applyEval/apply: : – Responsabilidade do código invocadorResponsabilidade do código invocador

• Conhece os argumentosConhece os argumentos• Examina a closure para obter a aridade e gerar Examina a closure para obter a aridade e gerar

chamada chamada exataexata

Page 5: 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

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

LinguagemLinguagem• Possui:Possui:

– Literais (inteiros, números de ponto flutuante)Literais (inteiros, números de ponto flutuante)– Chamadas de função: Chamadas de função: f f kk a a11,...,a,...,ann

• f f nn: : compilador conhece estaticamentecompilador conhece estaticamente a aridade n de f a aridade n de f • f f ••: : compilador NÃO conhece estaticamentecompilador NÃO conhece estaticamente a aridade n a aridade n

de fde f– Expressões Expressões letlet– Expressões Expressões casecase

• Valores Valores unboxedunboxed podem ser passados podem ser passados como argumentos, retornados como como argumentos, retornados como resultado, armazenados em estruturas de resultado, armazenados em estruturas de dados, etc.dados, etc.

Page 6: 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

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

Objetos da HeapObjetos da Heap• FUN(xFUN(x11,...,x,...,xnn e) e)

– Closure de função de aridade Closure de função de aridade nn– Aplicável a qualquer número de argumentos Aplicável a qualquer número de argumentos

• PAP(f aPAP(f a11,...,a,...,ann))– Aplicação parcial de Aplicação parcial de ff a a aa11,..., a,..., ann – ff é do tipo FUN é do tipo FUN

• CON(C aCON(C a11,...,a,...,ann))– Aplicação saturada do construtor Aplicação saturada do construtor CC a a aa11,...,a,...,ann

• THUNK eTHUNK e– ee é avaliado sob demanda é avaliado sob demanda– Closure é atualizada com indireção para o valor deClosure é atualizada com indireção para o valor de ee

• BLACKHOLEBLACKHOLE– Usado durante avaliação de um THUNKUsado durante avaliação de um THUNK

Page 7: 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

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

Semântica OperacionalSemântica Operacional• Componentes de cada estado:Componentes de cada estado:

– Código Código ee: expressão sob avaliação: expressão sob avaliação– Pilha Pilha ss: pilha de continuações: pilha de continuações– Heap Heap HH

• Cada continuação pode ser:Cada continuação pode ser:– casecase • • ofof ( (altalt11;...;;...;altaltnn))– Upd tUpd t • •– (• (• aa11,...,,...,aann) [eval/apply]) [eval/apply]– Arg a Arg a [p[push/enter]ush/enter]

ee11;; s s11;; H H11 e e22;; s s22;; H H22

Page 8: 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

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

Regras comunsRegras comuns

Page 9: 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

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

Regras comuns Regras comuns (cont.)(cont.)

Page 10: 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

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

Regras para push/enterRegras para push/enter

Page 11: 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

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

Modelo push/enterModelo push/enter• Aplicação de funções (PUSH)Aplicação de funções (PUSH)

– Empilha argumentos como Empilha argumentos como argumentos argumentos pendentespendentes

– ““Entra” na função:Entra” na função:• FENTER: FENTER:

Parâmetros formais são mapeados nos parâmetros Parâmetros formais são mapeados nos parâmetros reaisreais

Os argumentos que sobram são deixados na pilhaOs argumentos que sobram são deixados na pilha• PAP1:PAP1:

Thunk empilhou frame de atualizaçãoThunk empilhou frame de atualização Expressão case avaliou uma funçãoExpressão case avaliou uma função

• PAP1:PAP1: Argumentos são copiados para a pilhaArgumentos são copiados para a pilha

Page 12: 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

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

Regras para eval/applyRegras para eval/apply

Page 13: 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

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

Modelo eval/applyModelo eval/apply• Se o número de argumentos for exato, Se o número de argumentos for exato,

comporta-se como KNOWNCALL, comporta-se como KNOWNCALL, mesmo que mesmo que a função não seja estaticamente conhecidaa função não seja estaticamente conhecida

• Se hover muitos argumentos, empilha uma Se hover muitos argumentos, empilha uma continuaçãocontinuação que contém os argumentos que contém os argumentos excedentes. excedentes. Esta é a essência do Esta é a essência do eval/apply.eval/apply.– ““Dada uma aplicação Dada uma aplicação f x yf x y, se f recebe um , se f recebe um

argumento, então chame argumento, então chame f xf x e aplique a função e aplique a função resultante a y”resultante a y”

Page 14: 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

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

Pilha de atualizaçãoPilha de atualização• Continuações são representadas por Continuações são representadas por stack stack

framesframes• Stack frames comuns:Stack frames comuns:

– Continuação de atualização Continuação de atualização -- Upd tUpd 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 Continuação de expressão case - casecase - case • • ofof ((altalt11;...;;...;altaltnn):):• 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 Um frame é uma closure alocada na pilhaclosure alocada na pilha• Endereço de retorno possui uma Endereço de retorno possui uma info tableinfo table

Page 15: 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

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

Push/enter: ImplementaçãoPush/enter: Implementação• Pilha armazena argumentos pendentes, que Pilha armazena argumentos pendentes, que

não possuem endereço de retornonão possuem endereço de retorno– Torna a geração de código C-- mais difícil e ineficienteTorna a geração de código C-- mais difícil e ineficiente

• Como o GHC sabe quantos argumentos há na Como o GHC sabe quantos argumentos há na pilha?pilha?– Registrador Su, que aponta para o Registrador Su, que aponta para o update frameupdate frame ou ou

case framecase frame mais próximo ao topo da pilha mais próximo ao topo da pilha• Fast entry-point: Fast entry-point:

– Funções conhecidas estaticamenteFunções conhecidas estaticamente– Argumentos em registradores e/ou na pilhaArgumentos em registradores e/ou na pilha

• Slow entry-point:Slow entry-point:– Todos os argumentos na pilhaTodos os argumentos na pilha– Faz checagem de argumentos: Faz checagem de argumentos: Stack pointer - SuStack pointer - Su

Page 16: 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

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

Percorrendo a pilhaPercorrendo a pilha• Argumentos pendentes permanecem na Argumentos pendentes permanecem na

pilha até serem utilizadospilha até serem utilizados– Isso pode durar muito tempo!Isso pode durar muito tempo!

• O garbage collector deve ser capaz de O garbage collector deve ser capaz de identificar os ponteiros na pilhaidentificar os ponteiros na pilha– Facilmente identificáveis para stack frames Facilmente identificáveis para stack frames

regulares (update e case)regulares (update e case)– Dificilmente identificáveis para frames do Dificilmente identificáveis para frames do

tipo Argtipo 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 propostasImplementações eficientes são propostas

Page 17: 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

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

Eval/apply: ImplementaçãoEval/apply: Implementação• O modelo eval/apply utiliza O modelo eval/apply utiliza

continuações de chamadacontinuações de chamada da forma (• da forma (• aa11,...,,...,aann) ) – Endereço de retorno: Endereço de retorno:

• Seguido quando a função avalia para um valor Seguido quando a função avalia para um valor (FUN ou PAP) e retorna(FUN ou PAP) e retorna

– ArgumentosArgumentos• Códigos pré-gerados para 1,2,3,...,N Códigos pré-gerados para 1,2,3,...,N

argumentosargumentos– Sucessão de continuações para mais de N Sucessão de continuações para mais de N

argumentosargumentos

Page 18: 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

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

Eval/apply: ImplementaçãoEval/apply: Implementação

Page 19: 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

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

Argumentos excedentesArgumentos excedentes• Se f recebe 1 argumento, call f 3 x Se f recebe 1 argumento, call f 3 x

compila para:compila para:

f1 = stgApplyN(f, 3);

jump stgApplyP(f1, x);

Page 20: 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

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

Vantagens eval/applyVantagens eval/apply• Mais fácil de mapear em linguagens Mais fácil de mapear em linguagens

assembly portáveisassembly portáveis• Não necessidade de:Não necessidade de:

– distinguir entre ponteiros e não ponteirosdistinguir entre ponteiros e não ponteiros– tags para não ponteirostags para não ponteiros– ponteiro Suponteiro Su

• Passagem de argumentos em registradores Passagem de argumentos em registradores para funções desconhecidaspara funções desconhecidas– Push/enter requer argumentos sempre na pilhaPush/enter requer argumentos sempre na pilha

• Funções de sistema invocáveis a partir de Funções de sistema invocáveis a partir de Haskell são mais convenientes de escreverHaskell são mais convenientes de escrever

Page 21: 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

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

Vantagens push/enterVantagens 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 O payload payload de um objeto PAP pode ser de um objeto PAP pode ser

auto-descritoauto-descrito– Argumentos possuem tagsArgumentos possuem tags– No modelo eval/apply a descrição é No modelo eval/apply a descrição é

delegada ao objeto FUNdelegada ao objeto FUN• Complicações no garbage collectorComplicações no garbage collector• Um objeto PAP pode conter apenas objetos FUN, Um objeto PAP pode conter apenas objetos FUN,

nunca objetos PAPnunca objetos PAP

Page 22: 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

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

Algumas diferençasAlgumas diferençasPush/enterPush/enter

Requer slow entry-Requer slow entry-point para toda point para toda funçãofunção Checagem de Checagem de

argumentosargumentos Presença do SuPresença do Su

Facilita caminhada Facilita caminhada pela cadeia de pela cadeia de frames de frames de atualizaçãoatualização

Eval/applyEval/apply Requer slow entry-Requer slow entry-

point em algumas point em algumas situaçõessituações Argumentos em um Argumentos em um

bloco contíguo de bloco contíguo de memóriamemória

Ausência do SuAusência do Su Podem ser examinados Podem ser examinados

outros frames além outros frames além dos de atualizaçãodos de atualização

Porém Su pode ser Porém Su pode ser adicionadoadicionado

Page 23: 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

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

NúmerosNúmeros• Anatomia das chamadasAnatomia das chamadas

Page 24: 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

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

NúmerosNúmeros (cont.) (cont.)

• Tempo de execuçãoTempo de execução– Pequena diferença entre os dois modelosPequena diferença entre os dois modelos– Eval/apply vence por 2-3%Eval/apply vence por 2-3%

• Escritas em memóriaEscritas em memória– Eval/apply realiza menos escritasEval/apply realiza menos escritas

• Valor do Su não é salvo nos frames de Valor do Su não é salvo nos frames de atualizaçãoatualização

• Alocação no heapAlocação no heap– Performance quase não é afetadaPerformance 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 PAPs no eval/apply são menores (ausência de

tags para não-ponteiros)tags para não-ponteiros)

Page 25: 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

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

Conclusões Conclusões • Modelo eval/apply:Modelo eval/apply:

– Facilita o gerenciamento da complexidade Facilita o gerenciamento da complexidade dos ambientes de compilação e execuçãodos ambientes de compilação e execução

– Permite uma implementação compilada de Permite uma implementação compilada de alta performance para linguagens estritas alta performance para linguagens estritas de alta ordemde alta ordem

• Modelo push/enter:Modelo push/enter:– Complexidade adicionada para resolver Complexidade adicionada para resolver

problemas de performanceproblemas de performance– Solução mais elegante para Solução mais elegante para

interpretadoresinterpretadores

Page 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

Resenha do ArtigoResenha do ArtigoMaking a fast curry Making a fast curry Push/enter vs eval/apply for Push/enter vs eval/apply for higher-order languageshigher-order languages

Monique L. B. Monteiro{mlbm}@cin.ufpe.br

(Simon Marlow, Simon L. Peyton Jones}