Continuação passando estilo vs pilha de chamadas aparado de forma agressiva?
-
22-08-2019 - |
Pergunta
Estou pensando em algo como CPS para uso em um intérprete para uma linguagem baseada ator.
Os argumentos de função são passados ??em uma matriz de variantes, e a continuação devolvido na mesma matriz, portanto, uma função simples
def add (x,y) => x + y
para uma chamada a partir da leitura / eval / loop seria
print( add(7, 5) )
iria sobre a entrada ser
[&add, x, y, &print, _, &repl, ...]
onde _ é um espaço vazio onde o valor de retorno de função é escrito.
Na próxima etapa da execução, os argumentos se tornam
[&print, 12, &repl, ...]
então
[repl, ...]
e assim por diante. A implementação em C é basicamente
for (;;)
args = (args[0].function_pointer)(args);
com cheques para correr o final da matriz args e alocando mais espaço.
Os argumentos são contíguos, eo 'continuação' como um objeto é apenas um subconjunto dos argumentos.
Se eu fosse para implementar continuações de primeira classe, eles precisariam de clonagem a matriz argumento; você também não recebem fechamentos gratuitamente. O objetivo principal é algo que desempenha bem com simples geração de código de máquina, e permite que você suspender e execução currículo.
Embora este regime foi inspirado pelo pensamento sobre CPS, não é bastante CPS, e é muito semelhante ao que uma pilha C aparado de forma agressiva pode parecer - apenas as variáveis ??ao vivo, e os pontos de retorno para cada função.
Existe um nome para esse estilo, e em particular a matriz argumento? É uma espécie de trampolins + uma pilha, embora o que eu estou acostumado a chamar 'pilha' é mais a história, em vez do futuro da execução.
Solução
Isso é quase Forth. Ter uma pilha de primeira classe é praticamente como ter continuações.