Pourquoi les développeurs de Microsoft ont-ils choisi de faire du .NET une machine basée sur une pile?

StackOverflow https://stackoverflow.com/questions/5940449

  •  30-10-2019
  •  | 
  •  

Question

Aujourd'hui, j'ai trouvé le désassembleur entre les outils fournis avec VS2008. J'ai essayé de démonter un programme et de donner un coup d'œil au résultat. Opcodes n'était pas si difficile à comprendre mais une chose m'a surpris: le .NET est basé sur la pile ?! En lisant "Écrire un excellent code, Volume II" Je n'ai pas eu une bonne image des machines basées sur la pile parce qu'elles sont assez lentes. Ils sont également faciles à mettre en œuvre, mais je ne pense pas que les développeurs MS ont choisi cette approche en raison de sa simplicité, après tout ce code doit être traduit en code machine réel afin qu'ils déplacent simplement le problème.
L'un de vous peut-il expliquer cet étrange choix?

Ps:
Je poste ici ce que j'ai lu sur ce sujet:

13.1.1 Machines à base de pileLes machines basées sur la pile utilisent la mémoire pour la plupart des calculs, en utilisant une pile en mémoire pour contenir tous les opérandes et résultats. Les systèmes informatiques utilisant une architecture de pile offrent des avantages importants par rapport aux autres architectures:

  • Les instructions sont souvent plus petites (chacune consommant moins d'octets) que celles trouvées dans d'autres architectures car les instructions n'ont généralement pas à spécifier d'opérandes.
  • Il est généralement plus facile d'écrire des compilateurs pour les architectures de pile que pour d'autres machines, car la conversion des expressions arithmétiques en une séquence d'opérations de pile est très facile.
  • Les variables temporaires sont rarement nécessaires dans une architecture de pile, car la pile elle-même sert à cet effet.
Malheureusement, les machines de pile souffrent également d'inconvénients graves:
  • Presque toutes les instructions font référence à la mémoire (qui est lente sur les machines modernes). Bien que les caches puissent aider à atténuer ce problème, les performances de la mémoire sont toujours un problème majeur sur les machines de pile.
  • Même si la conversion de HLLS en une machine à pile est très facile, il y a moins d'opportunité d'optimisation qu'avec d'autres architectures.
  • Étant donné que les machines de pile accèdent constamment aux mêmes éléments de données (c'est-à-dire que les données en haut de la pile), le pipeline et le parallélisme des instructions sont difficiles à réaliser (voir Écrire un code grand, volume 1 pour plus de détails sur le pipelining et le parallélisme de l'instruction).
Une pile est une structure de données qui permet les opérations uniquement sur quelques éléments limités de la pile (souvent appelés haut de la pile et suivant sur la pile). Avec une pile, vous faites généralement l'une des trois choses: pousser de nouvelles données sur la pile, les données pop de la pile ou fonctionner sur les données qui se trouvent actuellement sur le dessus de la pile (et peut-être les données immédiatement en dessous).

et

13.1.1.5 Machines de pile du monde réel
Un grand avantage de l'architecture de pile est qu'il est facile d'écrire un compilateur pour une telle machine. Il est également très facile d'écrire un émulateur pour une machine basée sur la pile. Pour ces raisons, les architectures de pile sont populaires dans les machines virtuelles (VM) telles que la machine virtuelle Java et l'interprète P-Code P Microsoft Visual Basic. Il existe quelques processeurs basés sur des piles réels, comme une implémentation matérielle de la machine virtuelle Java; Cependant, ils ne sont pas très populaires en raison des limites de performances de l'accès à la mémoire. Néanmoins, la compréhension des bases d'une architecture de pile est importante car de nombreux compilateurs traduisent le code source HLL en un formulaire basé sur la pile avant de se traduire par du code machine réel. En effet, dans le pire des cas (bien que rares), les compilateurs sont obligés d'émettre du code qui émule une machine à base de pile lors de la compilation d'expressions arithmétiques complexes.

ÉDITER: Je viens de trouver un article Dans le blog d'Ericlippert répondant à la question et confirmant la réponse d'Aaron

Pas de solution correcte

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