Che cosa significa veramente che un linguaggio di programmazione è stackless?

StackOverflow https://stackoverflow.com/questions/796211

  •  18-09-2019
  •  | 
  •  

Domanda

In base a questa risposta

https://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296

tutti questi linguaggi di programmazione sono stackless

  • Stackless Python
  • PyPy
  • Lisp
  • Schema di
  • Tcl
  • Lua
  • Parrot VM

Che cosa realmente significa per loro essere stackless?Significa non utilizzare uno stack di chiamate?Se non hanno uno stack di chiamate, cosa usano?

È stato utile?

Soluzione

Che cosa realmente significa per loro essere stackless?Significa non utilizzare uno stack di chiamate?

Sì, che è giusto.

Se non hanno uno stack di chiamate, cosa usano?

L'esatta attuazione, naturalmente, variano da lingua a lingua.In Stackless Python, c'è un dispatcher che inizia l'interprete Python utilizzando il frame superiore e i suoi risultati.L'interprete processi di codici operativi necessari uno alla volta fino a che non raggiunge una CALL_FUNCTION opcode, il segnale che si sta per entrare in funzione.Questo provoca il dispatcher per costruire un nuovo telaio con le informazioni pertinenti e di ritorno al distributore, con la rimozione della bandiera.Da lì, il dispatcher comincia di nuovo, indicando l'interprete presso il frame superiore.

Stackless lingue evitano stack di chiamate per una serie di motivi, ma in molti casi è utilizzato in modo che certi costrutti di programmazione diventato molto più facile da implementare.La canonica è continuazioni.Continuazioni sono molto potenti, molto semplici strutture di controllo che può rappresentare una delle solite strutture di controllo siete probabilmente già familiarità con (while, do, if, switch, et cetera).

Se questo è fonte di confusione, si consiglia di avvolgere la testa intorno a questo articolo di Wikipedia, e in particolare il cutesy continuazione sandwich analogia:

Dire che siete in cucina davanti al frigorifero, pensando a un panino.Si prende una continuazione a destra e infilare in tasca.Quindi si ottiene alcuni turchia e il pane fuori dal frigorifero e farsi un panino, che ora è seduta sul bancone.Si richiama la continuazione in tasca, e ti ritrovi in piedi davanti al frigorifero di nuovo, pensando a un panino.Ma per fortuna, c'è un panino sul bancone, e di tutti i materiali utilizzati sono andato.Così si mangia.

Altri suggerimenti

Non utilizzare uno stack di chiamate, perché operano in continuazione di passaggio di stile.Se non hai familiarità con la coda di chiamata di ottimizzazione, che probabilmente è un buon primo passo per capire che cosa questo significa.

Per emulare il tradizionale chiamata/ritorno su questo modello, invece di spingere un indirizzo di ritorno, e in attesa del resto del telaio a rimanere intatto il chiamante si chiude sopra il resto del codice e di tutte le variabili che sono ancora necessari (il resto sono liberato).Si esegue quindi una coda di chiamata per il chiamato, il passaggio di questa continuazione come argomento.Quando il chiamato "restituisce", lo fa chiamando questa continuazione, passando il valore di ritorno come argomento ad esso.

Quanto sopra va, è solo un modo complicato per effettuare chiamate di funzione.Tuttavia, si generalizza molto bene in scenari più complessi:

  1. eccezione/infine/etc blocchi sono molto facilmente modellato - se è possibile passare un "ritorno" continuazione come un argomento, si può passare a 2 (o più) facilmente.lisp-y "condizione gestore" blocchi (che può o non può restituire il controllo al chiamante) sono anche di facile passare una continuazione per il resto di questa funzione, che potrebbe o non potrebbe essere chiamato.
  2. Più i valori di ritorno sono altrettanto facile - passare diversi argomenti per la continuazione.
  3. Ritorno provvisori/copia non è più diverso argomento della funzione di passaggio.Questo spesso rende più facile per eliminare i file temporanei.
  4. Ricorsività di ottimizzazione è banale - il chiamante passa semplicemente il "ritorno" continuazione ricevuto, piuttosto che l'acquisizione di uno nuovo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top