Continuazione passando stile vs stack di chiamate in modo aggressivo rifilato?
-
22-08-2019 - |
Domanda
Sto pensando qualcosa di simile CPS per l'utilizzo in un interprete per un linguaggio basato attore.
Gli argomenti della funzione sono passati in una matrice di varianti, e la continuazione restituiti nella stessa matrice, quindi una semplice funzione
def add (x,y) => x + y
così una chiamata dalla lettura / eval / loop sarebbe
print( add(7, 5) )
sarebbe in entrata essere
[&add, x, y, &print, _, &repl, ...]
dove _ è uno slot vuoto in cui viene scritto il valore della funzione di ritorno.
Al successivo passo di esecuzione, gli argomenti diventano
[&print, 12, &repl, ...]
poi
[repl, ...]
e così via. L'implementazione in C è fondamentalmente
for (;;)
args = (args[0].function_pointer)(args);
con controlli per scappare alla fine dell'array args e allocare più spazio.
Gli argomenti sono contigui, e 'prosecuzione' come oggetto è solo un sottoinsieme degli argomenti.
Se dovessi implementare continuazioni di prima classe, avrebbero bisogno di clonazione matrice di argomento; anche voi non si ottiene chiusure gratuitamente. L'obiettivo principale è qualcosa che gioca bene con la semplice generazione di codice macchina, e consente di sospendere e riprendere l'esecuzione.
Anche se questo schema è stato ispirato da pensarci CPS, non è del tutto CPS, ed è molto simile a quello che uno stack C aggressivo rifilato potrebbe essere simile - solo le variabili dal vivo, ei punti di cambio di ciascuna funzione.
C'è un nome per questo stile, e in particolare la matrice di argomento? E 'una sorta di trampolini + uno stack, anche se quello che io sono abituato a chiamare 'pila' è più la storia, piuttosto che il futuro di esecuzione.
Soluzione
Questo è quasi Forth. Avere uno stack di prima classe è più o meno come avere continuazioni.