Question

Quels sont exactement les avantages et les inconvénients d’utiliser une machine virtuelle basée sur les registres par rapport à une machine virtuelle basée sur une pile?

Pour moi, il semblerait qu’une machine à base de registres serait plus simple à programmer et plus efficace. Alors, pourquoi la JVM, le CLR et la machine virtuelle Python sont-ils tous basés sur une pile?

Était-ce utile?

La solution

Cette question a déjà été traitée, à un certain niveau, dans la FAQ de Parrot VM et les documents associés: Présentation de Parrot Le texte pertinent de ce document est le suivant:

  

La machine virtuelle Parrot aura une architecture de registre plutôt qu'une architecture de pile. Il aura également des opérations de très bas niveau, plus similaires à celles de Java que celles de Perl et Python de niveau moyen.

     

Le motif de cette décision est principalement qu’en ressemblant dans une certaine mesure au matériel sous-jacent, il est possible de compiler le bytecode de Parrot en langage machine natif efficace.

     

En outre, de nombreux programmes dans les langages de haut niveau consistent en appels de fonctions et méthodes imbriqués, parfois avec des variables lexicales pour conserver les résultats intermédiaires. Sous des paramètres autres que JIT, une machine virtuelle basée sur une pile affichera et répétera plusieurs fois les mêmes opérandes, tandis qu'une machine virtuelle basée sur des registres allouera simplement la quantité appropriée de registres et les exploitera, ce qui réduira considérablement le nombre d'opérations. et temps CPU.

Vous pouvez également lire ceci: Registres contre piles pour la conception d'interprètes En le citant un peu:

  

Il n’ya aucun doute, il est plus facile de générer du code pour une machine à pile. La plupart des étudiants en compilation de première année peuvent le faire. La génération de code pour une machine de registre est un peu plus difficile, à moins que vous ne la traitiez comme une machine à pile avec un accumulateur. (Ce qui est faisable, bien qu’un peu moins qu’idéal du point de vue des performances) La simplicité du ciblage n’est pas un gros problème, du moins pas pour moi, en partie parce que si peu de personnes vont réellement le cibler directement - je veux dire, Allez, combien de personnes connaissez-vous qui essaient réellement d'écrire un compilateur pour quelque chose qui importerait à personne? Les chiffres sont petits. L’autre problème tient au fait que de nombreuses personnes possédant des connaissances en matière de compilation sont déjà à l’aise pour cibler les machines de registre, car c’est ce que sont tous les processeurs matériels couramment utilisés.

Autres conseils

Implémentée dans le matériel, une machine basée sur les registres sera plus efficace simplement parce qu’il y a moins d’accès à la RAM plus lente. Dans le logiciel, cependant, même une architecture basée sur des registres aura très probablement les "registres". en RAM. Une machine basée sur une pile sera tout aussi efficace dans ce cas.

De plus, une machine virtuelle basée sur une pile facilitera considérablement l’écriture des compilateurs. Vous n'avez pas à traiter avec les stratégies d'allocation de registre. Vous avez essentiellement un nombre illimité de registres à utiliser.

Mise à jour: j'ai écrit cette réponse en supposant qu'un ordinateur virtuel est interprété. Cela peut ne pas être vrai pour une machine virtuelle compilée JIT. J'ai rencontré cet article qui semble indiquer qu'un EMI a été compilé La VM peut être plus efficace en utilisant une architecture de registre.

Traditionnellement, les développeurs de machines virtuelles privilégiaient les architectures basées sur des piles plutôt que sur les registres, en raison de la simplicité de mise en œuvre des machines virtuelles, car la plupart des machines virtuelles sont conçues pour héberger un langage unique, une densité de code et des exécutables. pour l'architecture de pile sont invariablement plus petits que les exécutables pour les architectures de registre La simplicité et la densité du code sont un coût de performance.

Des études ont montré qu'une architecture enregistrée requiert en moyenne 47% moins d'instructions de VM exécutées qu'une architecture de pile, et que le code de registre est 25% plus volumineux que le code de pile correspondant, mais cette augmentation du coût de l'extraction d'un plus grand nombre d'instructions de VM Pour une taille de code supérieure, seulement 1,07% des charges réelles de la machine par instruction de machine virtuelle sont négligeables, ce qui est négligeable. La performance globale de la machine virtuelle basée sur les registres est qu’il faut en moyenne 32,3% de temps en moins pour exécuter les tests de performance standard.

Une des raisons pour la construction de machines virtuelles basées sur une pile est que les codes d'opération de machine virtuelle réels peuvent être plus petits et plus simples (pas besoin de coder / décoder des opérandes). Cela réduit le code généré et simplifie également le code de la machine virtuelle.

De combien de registres avez-vous besoin?

J'aurai probablement besoin d'au moins un de plus que cela.

Il n’est pas évident pour moi qu’un " base de registre " machine virtuelle serait "plus simple à programmer" ou "plus efficace". Vous pensez peut-être que les registres virtuels fourniraient un raccourci lors de la phase de compilation de JIT? Ce ne serait certainement pas le cas, car le processeur réel peut avoir plus ou moins de registres que la VM, et ces registres peuvent être utilisés de différentes manières. (Exemple: les valeurs qui vont être décrémentées sont mieux placées dans le registre ECX des processeurs x86.) Si la machine réelle a plus de registres que la machine virtuelle, vous gaspillez des ressources, moins et vous n’avez rien gagné avec l’utilisation de " sur la base d'un registre " programmation.

Les machines virtuelles basées sur la pile sont plus simples et le code est beaucoup plus compact. Comme un exemple concret, un ami a construit (il y a environ 30 ans) un système d’enregistrement de données avec un Forth VM homebrew sur un Cosmac. La quatrième machine virtuelle contenait 30 octets de code sur une machine dotée de 2 Ko de ROM et de 256 octets de RAM.

Il est plus facile de générer du code pour les machines virtuelles à base de pile.

Les machines virtuelles basées sur Register sont plus faciles à créer et implémentées plus rapidement, et à générer un code hautement optimisé pour.

Pour votre première tentative, je vous recommande de commencer avec une machine virtuelle basée sur une pile.

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