Domanda

Quali sono esattamente i vantaggi e gli svantaggi dell'utilizzo di una macchina virtuale basata su registro rispetto all'utilizzo di una macchina virtuale basata su stack?

A me sembrerebbe che una macchina basata su registro sia più semplice da programmare e più efficiente. Quindi perché JVM, CLR e Python VM sono tutti basati su stack?

È stato utile?

Soluzione

A questo livello è già stata data risposta, a un certo livello, nelle FAQ di Parrot VM e nei documenti associati: Panoramica sui pappagalli Il testo rilevante di quel documento è questo:

  

Parrot VM avrà un'architettura di registro, piuttosto che un'architettura di stack. Avrà anche operazioni di livello estremamente basso, più simili a quelle di Java rispetto alle operazioni di medio livello di Perl, Python e simili.

     

Il ragionamento per questa decisione è principalmente che somigliando all'hardware sottostante in una certa misura, è possibile compilare il bytecode Parrot in un linguaggio macchina nativo efficiente.

     

Inoltre, molti programmi in linguaggi di alto livello consistono in chiamate nidificate di funzioni e metodi, a volte con variabili lessicali per contenere risultati intermedi. Con impostazioni non JIT, una macchina virtuale basata su stack verrà visualizzata e spingerà più volte gli stessi operandi, mentre una macchina virtuale basata su registro assegnerà semplicemente la giusta quantità di registri e opererà su di essi, il che può ridurre significativamente la quantità di operazioni e tempo della CPU.

Puoi anche leggere questo: Registra contro stack per la progettazione di interpreti Citando un po ':

  

Non c'è alcun dubbio reale, è più facile generare codice per una macchina stack. La maggior parte degli studenti del compilatore matricola può farlo. La generazione di codice per una macchina di registro è un po 'più difficile, a meno che non lo si tratti come una macchina stack con un accumulatore. (Il che è fattibile, anche se un po 'meno dell'ideale dal punto di vista delle prestazioni) La semplicità del targeting non è un grosso problema, almeno non per me, in parte perché così poche persone in realtà lo prenderanno direttamente di mira - Voglio dire, andiamo, quante persone conosci che cercano effettivamente di scrivere un compilatore per qualcosa a cui qualcuno si preoccuperebbe mai? I numeri sono piccoli L'altro problema è che molte delle persone con conoscenza del compilatore sono già a loro agio nel prendere di mira le macchine dei registri, poiché è quello che sono tutte le CPU hardware di uso comune.

Altri suggerimenti

Implementato in hardware, una macchina basata su registro sarà più efficiente semplicemente perché ci sono meno accessi alla RAM più lenta. Nel software, tuttavia, anche un'architettura basata sui registri avrà molto probabilmente i "registri" in RAM. Una macchina basata su stack sarà altrettanto efficiente in quel caso.

Inoltre una VM basata su stack renderà molto più semplice scrivere compilatori. Non devi occuparti delle strategie di allocazione dei registri. In sostanza, hai un numero illimitato di registri con cui lavorare.

Aggiornamento: ho scritto questa risposta assumendo una macchina virtuale interpretata. Potrebbe non essere vero per una VM compilata JIT. Ho incontrato questo documento che sembra indicare che un JIT compilato La VM può essere più efficiente utilizzando un'architettura di registro.

Tradizionalmente, gli implementatori di macchine virtuali hanno privilegiato le architetture basate su stack rispetto a quelle basate su registro grazie alla facilità di "semplicità di implementazione della VM" nella scrittura di un back-end del compilatore: la maggior parte delle VM sono state originariamente progettate per ospitare una sola lingua, densità del codice ed eseguibili per l'architettura dello stack sono sempre più piccoli degli eseguibili per le architetture di registro. La semplicità e la densità del codice sono un costo per le prestazioni.

Gli studi hanno dimostrato che un'architettura basata su registrazione richiede in media il 47% in meno di istruzioni VM eseguite rispetto all'architettura basata su stack e che il codice di registro è più grande del 25% rispetto al corrispondente codice stack ma questo aumento del costo di recupero di più istruzioni VM dovute per dimensioni di codice maggiori comporta solo l'1,07% di carichi macchina reali extra per istruzione VM che è trascurabile. Le prestazioni complessive della macchina virtuale basata su registro sono che, in media, ci vuole il 32,3% in meno di tempo per eseguire benchmark standard.

Un motivo per la creazione di macchine virtuali basate su stack è che i codici operativi delle macchine virtuali effettive possono essere più piccoli e più semplici (non è necessario codificare / decodificare gli operandi). Questo riduce il codice generato e semplifica anche il codice VM.

Di quanti registri hai bisogno?

Probabilmente ne avrò bisogno almeno uno in più.

Non è ovvio per me che un "basato su registro" la macchina virtuale sarebbe "più semplice da programmare" o "più efficiente". Forse stai pensando che i registri virtuali forniranno una scorciatoia durante la fase di compilazione JIT? Questo non sarebbe certamente il caso, dal momento che il processore reale potrebbe avere più o meno registri rispetto alla VM e quei registri potrebbero essere usati in modi diversi. (Esempio: i valori che verranno decrementati si collocano meglio nel registro ECX sui processori x86.) Se la macchina reale ha più registri rispetto alla VM, allora stai sprecando risorse, meno e non hai guadagnato nulla usando " basato sui registri " programmazione.

Le VM basate su stack sono più semplici e il codice è molto più compatto. Come esempio nel mondo reale, un amico ha costruito (circa 30 anni fa) un sistema di registrazione dati con una VM Forth homebrew su un Cosmac. La VM Forth era 30 byte di codice su una macchina con 2k di ROM e 256 byte di RAM.

Le VM basate su stack sono più facili da generare codice per.

Le macchine virtuali basate su registro sono più facili da creare per implementazioni rapide e per cui è più facile generare codice altamente ottimizzato per.

Per il tuo primo tentativo, ti consiglio di iniziare con una macchina virtuale basata su stack.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top