Question

Je suis curieux, pourquoi Sun décide de faire de la base de pile JVM et Google décide de faire la base de registres DalvikVM?

Je suppose que la machine virtuelle Java ne peut pas présumer vraiment qu'un certain nombre de registres sont disponibles sur la plate-forme cible, car il est censé être indépendant de la plate-forme. Il reporte à cet effet que le registre d'allocation etc, au compilateur JIT. (Corrigez-moi si je me trompe).

Alors les gars Android pensé, « hé, c'est inefficace, allons-y pour un droit vm fondé sur les registres de suite ... »? Mais attendez, il y a plusieurs différents appareils Android, quel nombre de registres ont fait la cible Dalvik? Sont les opcodes Dalvik pour un certain codés en dur nombre de registres?

Ne tous les appareils Android actuellement sur le marché ont le même nombre de registres? Ou, est-il une réallocation de registre effectué au cours Dex-chargement? Comment tout cela forme ensemble?

Était-ce utile?

La solution

Il y a quelques attributs d'une machine virtuelle basée sur la pile qui cadrent bien avec les objectifs de conception de Java:

  1. Une conception basée sur la pile fait très peu hypothèses sur la cible matériel (registres, caractéristiques du CPU), il est donc facile à mettre en œuvre une machine virtuelle sur un grande variété de matériel.

  2. Depuis les opérandes pour obtenir des instructions sont en grande partie implicite, l'objet le code aura tendance à être plus petits. Cette est important si vous allez être télécharger le code sur une lente lien réseau.

Voulez-vous profiter d'un système fondé sur les registres signifie probablement que le générateur de code de Dalvik n'a pas à travailler aussi dur pour produire un code performant. En cours d'exécution sur une architecture riche registre extrêmement pauvres ou de registre serait Dalvik probablement un handicap, mais ce n'est pas la cible habituelle -. ARM est une architecture très centriste


J'ai aussi oublié que la version initiale de Dalvik ne comprenait pas du tout JIT. Si vous allez interpréter les instructions directement, un système fondé sur les registres est probablement un gagnant pour la performance d'interprétation.

Autres conseils

Je ne peux pas trouver une référence, mais je pense que Sun a décidé de l'approche de bytecode basée sur la pile, car il est facile d'exécuter la machine virtuelle Java sur une architecture avec quelques registres (par exemple IA32).

Dalvik VM Internes de Google I / O 2008, la Dalvik créateur Dan Bornstein donne les arguments suivants pour le choix d'une machine virtuelle à partir des registres sur la diapositive 35 de la présentation de diapositives :

  

enregistrer la machine

     

Pourquoi?

     
      
  • envoi d'instructions éviter
  •   
  • éviter l'accès mémoire inutile
  •   
  • consommer flux d'instructions efficacement (densité plus élevée sémantique par instruction)
  •   

et le coulisseau 36:

  

enregistrer la machine

     

Les statistiques

     
      
  • 30% moins d'instructions
  •   
  • 35% de moins d'unités de code
  •   
  • 35% plus d'octets dans le flux d'instructions      
        
    • mais on arrive à consommer deux à la fois
    •   
  •   

Selon ce Bornstein est « une attente générale ce que vous pourriez trouver lorsque vous convertissez un ensemble de fichiers de classe aux fichiers dex ».

La partie pertinente de la vidéo de présentation href="http://www.youtube.com/watch?v=ptjedOZEXPM#t=1500" commence à 25:00 .

Il y a aussi un document intitulé "Showdown Virtual Machine: Stack Versus registres » par Shi et al. (2005) , qui explore les différences entre les machines virtuelles stack- et basées sur les registres.

Je ne sais pas pourquoi Sun a décidé de faire pile JVM en fonction. Erlang machine virtuelle, BEAM est basé registre pour des raisons de performance. Et Dalvik semble également être basé registre pour des raisons de performance.

De Pro Android 2 :

  

Dalvik utilise des registres comme principalement des unités de stockage de données à la place de la pile. Google espère atteindre 30 pour cent moins d'instructions en conséquence.

Et en ce qui concerne la taille du code:

  

Le Dalvik VM prend les fichiers de classe Java générés et les moissonneuses-batteuses-les dans un ou plusieurs fichiers Dalvik Exécutables (de .dex). Il réutilise des informations en double à partir de plusieurs fichiers de classe, réduisant l'encombrement (non compressé) par la moitié du fichier .jar traditionnel. Par exemple, le fichier .dex de l'application de navigateur Web dans Android est 200k, alors que la version équivalente .jar non compressé est d'environ 500k. Le fichier .dex de l'horloge d'alarme est d'environ 50k, et à peu près deux fois cette taille dans sa version .jar.

Et comme je me rappelle Computer Architecture: Une Approche quantitative conclure aussi que Machine registre de meilleurs résultats que d'une machine sur la base de la pile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top