Le macchine virtuali usano uno stack per tutto? [duplicare]

3

La maggior parte delle macchine virtuali ha uno "stack di chiamate" per tenere traccia di dove tornare da ciascuna funzione chiamata. Questo è spesso considerato semplicemente "lo stack".

Tuttavia spesso è necessario uno stack per operazioni che non sono correlate alla chiamata di funzioni, come l'esecuzione di operazioni aritmetiche. La mia domanda è: è lo stesso stack (vale a dire lo stack di chiamate) utilizzato anche per questi tipi di operazioni? Oppure operazioni come l'aritmetica usano uno stack diverso?

(Sto parlando della maggior parte delle macchine virtuali).

    
posta Aviv Cohn 29.07.2014 - 10:04
fonte

2 risposte

5

Dipende interamente dalla VM.

La JVM ha un singolo impilare per tutto. (Più precisamente: uno stack singolo per thread per tutto.)

Il Dalvik VM è basato su registri, ha solo uno stack di chiamate, tutti i dati sono conservati in registri.

La Parrot VM non ha stack: è basata sui registri, cioè tutti i dati sono contenuti nei registri e il suo flusso di controllo è basato su continuazioni, quindi non ha nemmeno uno stack di chiamate.

Ci sono anche macchine virtuali che concettualmente hanno uno stack ma in realtà allocano tutti gli stackframes come oggetti normali nell'heap. Quindi, dal punto dell'insieme di istruzioni, c'è uno stack, ma nell'implementazione effettiva non c'è. (La specifica JVM, ad esempio, consente questo. Non c'è nulla in esso, che ti ti costringa ad avere una singola area contigua di memoria per il tuo stack.Infatti, la esplicitamente em> menziona che essi non specificano tale livello di dettaglio e persino menziona l'allocazione di frame di stack sull'heap come esempio.)

Molte macchine virtuali Smalltalk e Lisp hanno uno " stack di spaghetti ", necessario per supportare call/cc , poiché può concettualmente "forgiare" lo stack di chiamate.

Forth ha due stack: uno stack di indirizzi di ritorno per il flusso di controllo e uno stack di dati. Entrambe le pile possono essere liberamente manipolate dal programmatore.

    
risposta data 29.07.2014 - 13:57
fonte
0

La maggior parte delle VM imita le architetture CPU più comuni in questo e usa solo un singolo stack per valori temporanei, risultati intermedi, argomenti di funzione, valori di ritorno di funzione e indirizzi di ritorno.

Questo è generalmente il più semplice, perché hai solo bisogno di un'amministrazione di dove si trova lo stack e quanto spazio c'è.
Con un solo stack, hai anche solo due strutture di dati che possono crescere dinamicamente (lo stack e l'heap), che sono disposte in modo conveniente in modo che non sia necessario determinare in anticipo la dimensione di ciascuna di esse. Il può iniziare alle estremità opposte dello spazio di indirizzi (disponibile) e crescere l'uno verso l'altro. Si incontreranno solo se lo spazio degli indirizzi è esaurito.
Con due o più stack, questa disposizione non è possibile, quindi è necessario indovinare la quantità di memoria necessaria.

    
risposta data 29.07.2014 - 12:10
fonte

Leggi altre domande sui tag