Ci sono una varietà di macchine virtuali, incluse le macchine virtuali che usano "registri". Tuttavia, il punto della VM è che si astrae su macchine fisiche, quindi la VM probabilmente non limiterà il numero di registri! Tali registri sono quindi essenzialmente equivalenti alle variabili locali.
- Se la VM utilizza un modello di esecuzione interpretato, sia le macchine virtuali basate sullo stack che le macchine virtuali basate su registri accedono generalmente a un array.
- Se la VM utilizza un modello di esecuzione compilato, sia le macchine virtuali basate su stack che quelle basate su registri allocheranno i registri fisici (se la destinazione di compilazione utilizza registri) e riverseranno il resto in memoria. L'allocazione ottimale del registro è un problema difficile in ogni caso.
Le macchine virtuali basate su stack sono leggermente più facili da implementare e hanno significativi precedenti storici al punto che esiste un'intera classe di linguaggi che sono basati sullo stack (linguaggi concatenativi). Se la VM è implementata in un linguaggio di alto livello, ci possono essere alcune difficoltà pratiche se le voci dello stack possono avere dimensioni diverse (ad esempio, byte o parola) e perché le voci dello stack hanno tipi sconosciuti. Per esempio. in JVM le istruzioni vengono digitate e la VM può verificare staticamente durante il caricamento del bytecode che il bytecode non danneggerà lo stack.
Le macchine virtuali basate su registri possono avere un tempo leggermente più semplice con le ottimizzazioni se la lingua intermedia viene fornita in modulo Single Assignment statico (SSA). Ogni registro logico viene assegnato esattamente a un'istruzione e successivamente è di sola lettura. Ciò semplifica l'analisi dei flussi di dati. Ovviamente ciò impedisce una mappatura ingenua dai registri logici a quelli fisici, ma non è uno svantaggio rispetto alle macchine virtuali basate sullo stack. Tuttavia, molti interpreti o compilatori JIT non sono molto interessati all'ottimizzazione.
La VM basata su registro più conosciuta è LLVM, che utilizza SSA. Questa VM è principalmente utilizzata come un set di istruzioni astratto (rappresentazione intermedia) in compilatori in anticipo come clang o rustc.
Anche le macchine virtuali basate su registro si aprono occasionalmente per i runtime del linguaggio dinamico, ma qui sono più di nicchia. Parrot e MoarVM (entrambi collegati al linguaggio Perl6) vengono in mente.