Perché la JVM è basata sullo stack e la Dalvik VM è basata sul registro?


98

Sono curioso, perché Sun ha deciso di rendere la JVM basata sullo stack e Google ha deciso di rendere la DalvikVM basata sul registro?

Suppongo che la JVM non possa davvero presumere che un certo numero di registri sia disponibile sulla piattaforma di destinazione, poiché dovrebbe essere indipendente dalla piattaforma. Quindi rimanda semplicemente l'allocazione dei registri, ecc., Al compilatore JIT. (Correggimi se sbaglio.)

Quindi i ragazzi di Android hanno pensato, "ehi, è inefficiente, andiamo subito per un vm basato su registri ..."? Ma aspetta, ci sono più dispositivi Android diversi, quale numero di registri ha preso di mira il Dalvik? Gli opcode Dalvik sono codificati per un certo numero di registri?

Tutti gli attuali dispositivi Android sul mercato hanno circa lo stesso numero di registri? Oppure, è stata eseguita una riallocazione del registro durante il caricamento del dex? Come funziona tutto questo insieme?


5
È stata quella la decisione di Google di rendere il DalvikVM basato sul registro? Penso che DalvikVM sia stato implementato prima che Google acquisisse Android Inc.
RoboAlex

1
Hai ragione ovviamente. (Non molto pertinente alla domanda però;)
aioobe

Risposte:


68

Ci sono alcuni attributi di una VM basata su stack che si adattano bene agli obiettivi di progettazione di Java:

  1. Un design basato su stack fa pochissime supposizioni sull'hardware di destinazione (registri, funzionalità della CPU), quindi è facile implementare una VM su un'ampia varietà di hardware.

  2. Poiché gli operandi per le istruzioni sono in gran parte impliciti, il codice dell'oggetto tenderà ad essere più piccolo. Questo è importante se stai per scaricare il codice su un collegamento di rete lento.

Andare con uno schema basato su registri probabilmente significa che il generatore di codice di Dalvik non deve lavorare così duramente per produrre codice performante. L'esecuzione su un'architettura estremamente ricca di registri o povera di registri probabilmente ostacolerebbe Dalvik, ma questo non è il solito obiettivo: ARM è un'architettura molto a metà strada.


Avevo anche dimenticato che la versione iniziale di Dalvik non includeva affatto un JIT. Se intendi interpretare le istruzioni direttamente, allora uno schema basato su registri è probabilmente un vincitore per le prestazioni di interpretazione.


1
Ok, interessante. Quindi DalvikVM presuppone un numero minimo di registri sul dispositivo di destinazione?
aioobe

1
Inoltre, ho letto che alcune persone stanno installando Android sui loro laptop poiché è un sistema operativo "leggero" ... Sembra una cattiva idea se il laptop non è ARM e forse ha un'architettura con molti registri?
aioobe

2
ok, ho appena appreso che il bytecode dex è definito in termini di una macchina a registri infiniti, e quando si parla di efficienza, sembra che si tratti principalmente di impronta di memoria.
aioobe

1
Non riuscivo a ricordare se Dalvik fosse basato su registri infiniti o avesse una dimensione del file di registro fissa. Se è infinito, tenderà a funzionare in modo ottimale su architetture che hanno registri "sufficienti" per qualunque codice tu stia eseguendo.
Mark Bessey,

Una spiegazione più dettagliata può essere trovata qui: markfaction.wordpress.com/2012/07/15/…
noego

31

Non riesco a trovare un riferimento, ma penso che Sun abbia deciso per l'approccio bytecode basato su stack perché rende facile eseguire la JVM su un'architettura con pochi registri (ad es. IA32).

In Dalvik VM Internals da Google I / O 2008, il creatore di Dalvik Dan Bornstein fornisce i seguenti argomenti per la scelta di una VM basata su registro nella diapositiva 35 delle diapositive della presentazione :

Registra macchina

Perché?

  • evitare l'invio di istruzioni
  • evitare accessi inutili alla memoria
  • consumare il flusso di istruzioni in modo efficiente (densità semantica più alta per istruzione)

e sulla diapositiva 36:

Registra macchina

Le statistiche

  • 30% di istruzioni in meno
  • 35% di unità di codice in meno
  • 35% di byte in più nel flusso di istruzioni
    • ma possiamo consumarne due alla volta

Secondo Bornstein questa è "un'aspettativa generale che cosa potresti trovare quando converti un insieme di file di classe in file dex".

La parte rilevante del video di presentazione inizia alle 25:00 .

C'è anche un approfondito documento intitolato "Virtual Machine Showdown: Stack Versus Registers" di Shi et al. (2005) , che esplora le differenze tra macchine virtuali basate su stack e registrate.


13

Non so perché Sun abbia deciso di creare una JVM basata sullo stack. Macchina virtuale Erlangs, BEAM è basata sul registro per motivi di prestazioni. E anche Dalvik sembra essere basato sui registri per motivi di prestazioni.

Da Pro Android 2 :

Dalvik utilizza i registri principalmente come unità di archiviazione dei dati invece che come stack. Di conseguenza, Google spera di ottenere il 30% di istruzioni in meno.

E per quanto riguarda la dimensione del codice:

La Dalvik VM prende i file di classe Java generati e li combina in uno o più file Dalvik Executables (.dex). Riutilizza le informazioni duplicate da più file di classe, riducendo in modo efficace lo spazio richiesto (non compresso) della metà rispetto al file .jar tradizionale. Ad esempio, il file .dex dell'app browser Web in Android è di circa 200k, mentre la versione equivalente non compressa di .jar è di circa 500k. Il file .dex della sveglia è di circa 50k e circa il doppio di quella dimensione nella sua versione .jar.

E mentre ricordo Computer Architecture: A Quantitative Approach concludo anche che una macchina a registro funziona meglio di una macchina basata su stack.


2
Se dovessi indovinare, direi che Sun ha deciso di rendere lo stack JVM basato perché è più facile da implementare rispetto a una macchina a registro. (Ma a un costo di prestazione non banale, come indicato qui.)
Mason Wheeler,

Non riesco a trovare un riferimento, ma penso che Sun abbia deciso per l'approccio bytecode basato su stack perché semplifica l'esecuzione della JVM su un'architettura a registro basso.
Flusso

1
Per un ISA hardware, sì, le macchine registrate hanno vinto. Fondamentalmente ogni CPU / microcontrollore è una macchina di registro, perché tutto il resto fa schifo in confronto. Alcuni hanno pochissimi registri, come solo un accumulatore e forse uno o due registri di puntatore o indice, ma è ancora più simile a una macchina di registro nel senso della teoria del calcolo. Ma stiamo parlando di VM che vengono interpretate , quindi il "file di registro" se ce n'è uno sarebbe effettivamente in memoria. A meno che tu non abbia compilato JIT in codice macchina nativo. Le ragioni sono molto diverse per cui reg è più veloce dello stack.
Peter Cordes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.