Est le CLR une machine virtuelle?

J'ai lu un livre qui se réfère à l' .net CLR comme une machine virtuelle? Quelqu'un peut-il justifier cela? Qu'est-ce que la raison nous avons besoin de la notion de machines virtuelles sur certaines plates-formes de développement?

N'est-il pas possible de développer un cadre autochtone [sans machine virtuelle] qui est entièrement orienté objet et aussi puissant .net?

Le livre qui fait référence à CLR que la machine virtuelle est "Professionnel .Net Framework 2.0".

  • C'est vraiment juste un argument de plus à ce qu'est une "machine virtuelle" est. Notez que les "indigènes" jeu d'instructions x86 peut être considéré comme une machine virtuelle du jeu d'instructions, interprété par le PROCESSEUR. Donc, si le CLR s'exécute sur une machine virtuelle, est-il possible pour elle de ne pas être considéré comme une machine virtuelle?
  • Le CLR ne fonctionne pas sur une "machine virtuelle". Le CLR est un juste-à-temps compilateur et un garbage collector. Lorsque le CLR doit invoquer dans une bibliothèque en C il n'ont pas les frais généraux qui JNI n'parce qu'il est déjà en code natif, ce qui il a à faire est d'appuyer les arguments sur la pile et de sauter à la méthode. Alors que Java a à faire toutes sortes de cher de gymnastique pour faire que le scénario de travail, résultant en une très lente pont en code natif.
  • fonctionne très bien à l'intérieur de VMware, VirtualBox, Virtual PC, etc, donc je ne sais pas pourquoi vous faites un universel prétendre qu'il ne s'exécute pas sur les ordinateurs virtuels. Mais je suppose que vous vouliez dire, si CLR est elle-même une VM, pas de savoir s'il s'exécute sur le dessus de l'un. Comme vous le dites, le CLR a un compilateur JIT et un garbage collector. Mais vous avez raté le vérificateur. Et le modèle de sécurité. Et sa propre implémentation des threads distincts de l'OS. Et son propre chargeur. De l'exécution et de l'introspection, y compris un système sophistiqué de débogage de l'API. C'est certainement une machine virtuelle.
  • Il choisit de partager beaucoup de choses avec la machine physique, telles que l'adresse de l'espace (qui est virtualisé sur la machine physique de toute façon), afin de réduire la quantité de travail que p/invoke a faire.... mais selon les types impliqués p/invoke fait beaucoup de travail, et même pour les types simples, il est nulle part près d'aussi simple que de "pousser les arguments sur la pile et de sauter". Chaque géré/native de transition implique de changer le collecteur d'ordures de l'état, à la broche de paramètres passés par référence, et aussi pour permettre au gouvernement pour mettre en pause le thread sur le retour en code managé.
  • Voigt - oui, si vous ajoutez un groupe de travail, je n'ai jamais spécifié, alors il n'y a plus de travail à faire pour l'appel des indigènes, mais si vous utilisez uniquement blittable types de la différence entre le CLR et Java devient tout à fait évident. Sans compter poussant les arguments sur la pile, un calli instruction compile à 6 ASM instructions. Je doute sérieusement une interprétation d'une méthode Java pouvez le faire n'importe où près aussi efficace. L'interprétation est ce qui fait une course de méthode Java "virtuel", tandis qu'un exécutant CLR méthode est aussi réel que tout compilé en C++ méthode.
  • Mais je n'ai pas "ajouter", le CLR toujours fait ces choses et vous avez choisi de les laisser hors de votre mise en œuvre à l'appui de votre description d'une très fine couche. Mais le code en cours d'exécution avec le CLR est "géré" pas "natif", et géré/native transitions sont compliquées bêtes. Même si une grande partie du travail est effectuée à l'aide de la table de recherches (le même type de démarche que zéro charge la gestion des exceptions), de sorte qu'il n'apparaisse pas sur le site d'appel, le fait demeure que, pour chacune de ces transitions a le potentiel pour être un point de synchronisation avec le garbage collector.