Perché la maggior parte delle macchine virtuali del linguaggio sono progettate con un'architettura di carico / archivio? C'è un vantaggio di velocità rispetto a un'architettura di registro-memoria?

1

Sto sviluppando una macchina virtuale per uso personale (open source, ovviamente!)

Nella ricerca e nell'analisi del codice sorgente di altre macchine virtuali, specialmente quelle dei linguaggi di scripting; Ho notato che tutti gli arch VM che ho usato usavano un'architettura load / store ma non ho mai visto un arch di VM utilizzare l'architettura di registro / memoria.

C'è un vantaggio in termini di prestazioni nell'uso di load / store arch vs registro / arco di memoria e modalità di indirizzamento?

    
posta Nergal 14.10.2018 - 01:17
fonte

2 risposte

5

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.

    
risposta data 14.10.2018 - 09:41
fonte
5

L'idea è che il codice per la tua macchina virtuale non sia interpretato, ma compilato in fase di runtime in codice macchina per la macchina reale.

Un approccio registro / memoria rende più difficile la traduzione in codice nativo. Hai due posti in cui i dati possono essere archiviati: in memoria o in un registro, mentre l'architettura carico / archivio ha solo memoria. Le due posizioni rendono più difficile l'analisi e la conversione in un buon codice nativo.

PS. La compilazione JIT ti offre massimi guadagni di velocità. La VM basata su registro potrebbe dare un piccolo impulso durante l'interpretazione, ma non ne vale la pena perché JIT è l'obiettivo. E come implementate i registri VM nell'interprete? Molto probabilmente finirai per archiviarli comunque nella memoria.

    
risposta data 14.10.2018 - 01:24
fonte

Leggi altre domande sui tag