2012-10-12 13 views
9

Oggi stavo leggendo some slides about Andoird basics e la frase è apparsa:Quali sono le principali differenze tra una VM basata su registro e una basata su stack?

Dalvik VM è registrarsi in base al posto dello stack based.

Quindi, Quali sono le principali differenze tra una VM basata su registro e una basata su stack?


Il secondo link answerd abbastanza la mia domanda:

http://markfaction.wordpress.com/2012/07/15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/

Un altro collegamento:

http://androidjayavelu.blogspot.co.at/2011/06/dalvik-virtual-machine-vs-java-virtual.html

+1

Dalla sorgente Java livello non c'è alcuna differenza concettuale.La differenza è nei bytecode (che produce javac), dove i bytecode basati sullo stack sono scritti in termini di stack, mentre (sorpresa!) per il modello basato su registri i bytecode sono scritti in termini di registri –

+3

(JIT-compilato Java, anche su un'architettura "stack-based", è basato su registri.) –

+0

questo collegamento ti aiuterà a ottenere ulteriori spiegazioni http://markfaction.wordpress.com/2012/07/ 15/stack-based-vs-register-based-virtual-machine-architecture-and-the-dalvik-vm/ – LeoMobDev

risposta

2

Questo articolo è abbastanza informativo così: http://www.codeproject.com/Articles/461052/Stack-based-vs-Register-based-Virtual-Machine-Arch

"Macchine virtuali basate su stack Una macchina virtuale basata su stack implementa le funzionalità generali descritte come necessario da una macchina virtuale nei punti sopra, ma la struttura di memoria in cui sono memorizzati gli operandi è una struttura di dati stack. Le operazioni vengono eseguite prelevando i dati dallo stack, elaborandoli e inserendo nuovamente i risultati in modalità LIFO (Last in First Out). In una macchina virtuale basata pila, l'operazione di aggiunta di due numeri di solito effettuata nel seguente modo (dove 20, 7, e 'risultato' sono gli operandi):

stackAdd

POP 20 POP 7 ADD 20, 7, risultato Risultato PUSH A causa delle operazioni PUSH e POP, sono necessarie quattro righe di istruzioni per eseguire un'operazione di aggiunta. Un vantaggio del modello basato su stack è che gli operandi sono indirizzati implicitamente dal puntatore dello stack (SP nell'immagine sopra). Ciò significa che la macchina virtuale non ha bisogno di conoscere esplicitamente gli indirizzi degli operandi, poiché chiamare il puntatore dello stack darà (Pop) l'operando successivo. Nelle VM basate su stack, tutte le operazioni aritmetiche e logiche vengono eseguite tramite Pushing e Popping degli operandi e risultati nello stack.

Macchine virtuali basate su registro Nell'implementazione basata su registro di una macchina virtuale, la struttura dati in cui sono memorizzati gli operandi si basa sui registri della CPU. Non ci sono operazioni PUSH o POP qui, ma le istruzioni devono contenere gli indirizzi (i registri) degli operandi. Cioè, gli operandi per le istruzioni sono esplicitamente indirizzati nell'istruzione, a differenza del modello basato su stack in cui avevamo un puntatore allo stack per puntare all'operando. Ad esempio, se un'operazione aggiunta è da eseguire in una macchina virtuale basata registro, l'istruzione sarebbe più o meno come segue:

registerAdd

ADD R1, R2, R3; # Aggiungi il contenuto di R1 e R2, memorizza il risultato in R3 Come accennato in precedenza, non ci sono operazioni POP o PUSH, quindi le istruzioni per l'aggiunta sono solo una riga. Ma a differenza dello stack, abbiamo bisogno di menzionare esplicitamente gli indirizzi degli operandi come R1, R2 e R3. Il vantaggio qui è che il sovraccarico di spingere e scoppiare da una pila è inesistente e le istruzioni in una macchina virtuale basata su registro eseguono più velocemente all'interno del ciclo di invio delle istruzioni.

Un altro vantaggio del modello basato su registri è che consente alcune ottimizzazioni che non possono essere eseguite nell'approccio basato su stack. Una di queste è quando ci sono espressioni secondarie comuni nel codice, il modello di registro può calcolarlo una volta e memorizzare il risultato in un registro per uso futuro quando l'espressione secondaria viene di nuovo visualizzata, il che riduce il costo del ricalcolo dell'espressione.

Il problema con un modello basato su registri è che l'istruzione di registro medio è maggiore di un'istruzione di pila media, poiché è necessario specificare esplicitamente gli indirizzi degli operandi. Mentre le istruzioni per una macchina stack sono brevi a causa del puntatore dello stack, le istruzioni relative alle macchine del registro devono contenere le posizioni degli operandi e producono un codice registro più grande rispetto al codice stack.

Un grande articolo del blog che ho trovato (a questo link), contiene un'implementazione C esplicativa e semplice di una macchina virtuale basata su registro. Se l'implementazione delle macchine virtuali e degli interpreti è il vostro principale interesse, il libro di Terrence Parr, il creatore di ANTLR intitolato 'Modelli di implementazione linguistica: crea i tuoi linguaggi di programmazione generale e di dominio', può essere molto utile. "

+0

Se questa è una risposta, si prega di incollare qui il codice pertinente; i collegamenti possono cambiare e questa risposta non sarebbe più rilevante. – rfornal

Problemi correlati