2016-07-27 6 views

Répondre

2

Le bytecode Java a été optimisé pour être exécuté par un interpréteur, les JVM précoces n'avaient pas encore de Hotspot. .NET msil a été conçu dès le premier jour à toujours être jitted, pas d'opcodes spéciaux pour les différents types d'opérandes étaient nécessaires.

La gigue connaît le type d'opérande à partir de l'état de la pile. Quel que soit l'opcode poussé une valeur sur la pile indique également le type. Dites un Opcodes.Ldarg_0, la gigue connaît le type de la signature de la méthode. Garder la trace de l'état de la pile est quelque chose que vous ne voulez jamais avoir à faire dans un interpréteur, il ralentit considérablement l'exécution du code, une gigue ne doit le faire qu'une seule fois.

1

De l'Common Language Infrastructure (CLI) Partition I: Concepts and Architecture, Section 12.1:

... CLI prend en charge un sous-ensemble de ces types dans ses opérations sur des valeurs stockées sur son évaluation stack- int32, int64 et native int. En outre, la CLI prend en charge un type de données interne pour représenter les valeurs à virgule flottante sur la pile d'évaluation interne .

...

Comme décrit ci-dessous, les instructions CIL ne précisent pas leurs types d'opérandes. Au lieu de cela, l'interface CLI conserve une trace des types d'opérandes en fonction du flux de données et est aidée par une exigence de cohérence de pile décrite ci-dessous. Par exemple, l'instruction unique add ajoutera deux entiers ou deux flottants de la pile.

Le « en dessous » de discuter la cohérence de la pile se réfère à l'article 12.3.2.1:

La pile d'évaluation est constitué de fentes qui peuvent contenir tout type de données, y compris une instance unboxed d'une valeur type. L'état de type de la pile (la profondeur de pile et les types de chaque élément de la pile) à un point donné dans un programme doit être identique pour tous les chemins de flux de contrôle possibles. Par exemple, un programme qui boucle un nombre inconnu de fois et qui pousse un nouvel élément sur la pile à chaque itération serait interdit.

C'est, chaque fois qu'il rencontre une instruction add, il connaît toujours la « forme » de la pile au point et peut donc construire les instructions natives correctes. Et cela fonctionne avec un nombre limité de types de toute façon.

(autres spécifications de la CLI sont disponibles à partir this page)

1

Si vous écrivez un programme de test C# et décompiler à MSIL, vous pouvez voir la taille sont définies par ldc ou conv instructions avant add est appelé.