Question

De http://code.google.com/p/unladen-swallow / wiki / ProjectPlan Je cite:

"L'utilisation d'un JIT nous permettra également de déplacer Python d'une machine à pile à une machine à registre, ce qui a permis d'améliorer les performances dans d'autres langages similaires (Ierusalimschy et al, 2005; Shi et al, 2005) . "

Au collège, j’ai construit un compilateur simple pour un langage avec des procédures récursives - qui maintenait les cadres de pile pour chaque procédure appelée - afin qu’ils puissent être appelés récursivement et que les paramètres et les valeurs renvoyées fonctionnent ....

2 choses:

1) Ai-je raison de penser que ce que j'ai implémenté serait considéré comme une "machine à pile"? compte tenu de la terminologie utilisée dans la citation ci-dessus?

2) Si mon hypothèse au point (1) était juste, comment fonctionne une "machine à enregistrer"? travail? c'est-à-dire en quoi est-ce différent d'une machine à pile?

Merci!

Était-ce utile?

La solution

Un enregistreur est une unité matérielle ou logicielle qui, lorsqu'elle travaille avec des données, les extrait de la mémoire, les place dans un emplacement où elles peuvent être utilisées rapidement, puis renvoie le résultat.

Par exemple, une CPU normale est une machine à registre. Étant donné que l’ALU (l’unité qui fonctionne avec des nombres dans une CPU) ne peut fonctionner qu'avec des nombres dans un registre.

Un ordinateur basé sur une pile ajoute les données sur une pile, puis les affiche ou les dépose dessus.

Par exemple, ajouter deux nombres serait

.
Push 2 // Push 2 onto the stack
Push 3 // Push 3 onto the stack
Add // Add the top two things on the stack.

Lorsque vous vous trouvez dans une machine de registre, ce serait quelque chose comme ceci.

Load x, r0 // Load x onto register 0
Load y, r1 // Load y onto register 1
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2

Autres conseils

Une machine de registre a presque toujours une pile, également.

Mais une machine à pile possède rarement des registres visibles sur le plan de l'architecture ou ne peut en avoir qu'un ou deux.

Un enregistreur peut avoir des opérations de pile et même un mode d’adressage de pile.

La différence en est une d’orientation. La machine à registres aura principalement des instructions qui opèrent sur les registres, et aura une poignée d'opérations de chargement et de stockage entre les registres et la pile ou la mémoire.

Une machine à pile .. et ceux-ci sont très rares car les périphériques matériels réels .. fonctionneront directement sur la pile avec ses instructions et disposeront de nombreuses opérations de chargement et de stockage entre la pile et la mémoire.

Désormais, les raisons pour lesquelles les machines à registre matériel sont plus rapides que les machines à pile matérielle ne sont peut-être pas liées aux raisons pour lesquelles le logiciel "s'enregistre". Selon le document cité, les ordinateurs virtuels sont plus rapides que les logiciels "empilés". machines.

Pour les machines virtuelles logicielles, il semble que moins d’instructions doivent être exécutées. Cela a été déterminé de manière empirique selon les affirmations du document cité, mais j’imagine que c’est parce qu’il faut beaucoup moins d’instructions, telles que push, pop et échange, dans la machine du registre, et que la machine à registre peut facilement réutiliser des opérandes traîner dans le fichier de registre sans avoir besoin de charger ou de pousser. Bien sûr, ce n’est que de la mémoire; ce sont des registres virtuels.

Une machine à registres utilise un nombre fixe de registres ou de compartiments pour stocker les valeurs intermédiaires à des fins de calcul. Par exemple, l'option " add " Cette instruction peut ajouter les valeurs dans deux registres spécifiques et stocker le résultat dans un autre registre.

Une machine basée sur une pile utilise une pile pour stocker des valeurs intermédiaires pendant le calcul. Par exemple, pour ajouter deux nombres, l'option " add " les instructions séparent deux valeurs de la pile, les ajoute et remet le résultat dans la pile.

  

1) Ai-je raison de penser que ce que je   mis en œuvre serait considéré comme un   "Machine à piles" Compte tenu du   terminologie utilisée dans la citation   ci-dessus?

Pas vraiment. Une sorte de pile est à peu près le seul moyen d'implémenter des appels de fonction récursifs. Mais une "machine à pile" " va beaucoup plus loin en faisant tout via la pile. Pas seulement des appels de fonction, mais aussi des opérations arithmétiques. D'une certaine manière, ils se comportent comme si chaque instruction machine était un appel de fonction géré via la pile. Cela rend la conception de la machine très simple, mais plutôt difficile à écrire code assembleur / machine.

  

2) Si mon hypothèse au point (1) était   à droite, comment fonctionne une "machine à enregistrer"?   travail? c'est-à-dire en quoi est-ce différent d'un   machine à pile?

Une machine à registres dispose d’une mémoire interne rapide (registres) et effectue la plupart de ses opérations sur les données de ces registres. Des instructions machine supplémentaires permettent de copier des données entre des registres et la mémoire principale.

IIRC il existe deux types de machines empilées:

  • Les machines à accumulateur ont un "accumulateur", qui est en gros un registre contenant le résultat des calculs (et pouvant également fournir un opérande), la plupart des instructions de la machine fonctionnant sur l'accumulateur.
  • " Pure " Les machines à pile placent le résultat des calculs sur la pile après avoir consommé les opérandes.

Une machine de registre est une machine abstraite dont les codes d'opération sont définis par référence à leur fonctionnement sur un ensemble de registres nommés, plutôt que par leur opération sur la partie supérieure d'une pile.

Dans une machine de registre: add pourrait être défini pour prendre trois noms de registre en tant qu'opérandes, ajouter le contenu des deux premiers et placer le résultat dans le troisième. (Plus commun est la conception où seulement un ou deux sont nommés et le résultat est toujours placé dans un registre d'accumulateur spécial, mais ce n'est pas le problème.)

Sur une machine à pile: add peut être défini pour extraire deux opérandes de la pile, les ajouter et placer le résultat dans la pile.

Votre compilateur a-t-il généré du code machine? Si tel est le cas, sa cible est une machine à registre (presque tous les modèles de CPU sont des machines à registre).

Les machines à pile stockent toutes les valeurs d'une pile, alors que les machines à registre ont un nombre fixe d'emplacements de stockage dont "adresses". ne change pas (contrairement aux machines à pile).

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