Je suis curieux de savoir pourquoi Sun a décidé de rendre la pile JVM basée sur la pile et Google a décidé de créer la base de registre DalvikVM?
Je suppose que la JVM ne peut pas vraiment supposer qu'un certain nombre de registres sont disponibles sur la plate-forme cible, car elle est censée être indépendante de la plate-forme. Pour cela, il reporte simplement l'allocation de registre, etc. au compilateur JIT. (Corrige moi si je me trompe.)
Alors les gars d'Android ont pensé, "hé, c'est inefficace, allons tout de suite pour une VM basée sur un registre ..."? Mais attendez, il existe plusieurs appareils Android différents, quel nombre de registres le Dalvik a-t-il ciblé? Les opcodes Dalvik sont-ils codés en dur pour un certain nombre de registres?
Tous les appareils Android actuels sur le marché ont-ils à peu près le même nombre de registres? Ou, y a-t-il une réallocation de registre effectuée pendant le chargement de dex? Comment tout cela s'articule-t-il?
Réponses:
Il existe quelques attributs d'une machine virtuelle basée sur une pile qui correspondent bien aux objectifs de conception de Java:
Une conception basée sur la pile fait très peu d'hypothèses sur le matériel cible (registres, fonctionnalités du processeur), il est donc facile d'implémenter une machine virtuelle sur une grande variété de matériel.
Les opérandes des instructions étant largement implicites, le code objet aura tendance à être plus petit. Ceci est important si vous allez télécharger le code via une liaison réseau lente.
Utiliser un schéma basé sur des registres signifie probablement que le générateur de code de Dalvik n'a pas à travailler aussi dur pour produire un code performant. Fonctionner sur une architecture extrêmement riche en registres ou pauvre en registres handicaperait probablement Dalvik, mais ce n'est pas la cible habituelle - ARM est une architecture très intermédiaire.
J'avais également oublié que la version initiale de Dalvik n'incluait pas du tout de JIT. Si vous allez interpréter les instructions directement, alors un schéma basé sur des registres est probablement un gagnant pour les performances d'interprétation.
la source
Je ne trouve pas de référence, mais je pense que Sun a opté pour l'approche bytecode basée sur la pile, car elle facilite l'exécution de la JVM sur une architecture avec peu de registres (par exemple IA32).
Dans Dalvik VM Internals de Google I / O 2008, le créateur de Dalvik Dan Bornstein donne les arguments suivants pour choisir une VM basée sur les registres sur la diapositive 35 des diapositives de la présentation :
et sur la diapositive 36:
Selon Bornstein, c'est "une attente générale de ce que vous pourriez trouver lorsque vous convertissez un ensemble de fichiers de classe en fichiers dex".
La partie pertinente de la vidéo de présentation commence à 25h00 .
Il existe également un article perspicace intitulé "Virtual Machine Showdown: Stack Versus Registers" de Shi et al. (2005) , qui explore les différences entre les machines virtuelles basées sur des piles et des registres.
la source
Je ne sais pas pourquoi Sun a décidé de créer une pile JVM. Machine virtuelle Erlangs, BEAM est basée sur les registres pour des raisons de performances. Et Dalvik semble également être basé sur les registres pour des raisons de performances.
Depuis Pro Android 2 :
Et concernant la taille du code:
Et comme je me souviens de Computer Architecture: A Quantitative Approach, nous concluons également qu'une machine de registre fonctionne mieux qu'une machine basée sur une pile.
la source