Les différences entre MSIL et le bytecode Java?
Je suis nouveau sur .Net et j'essaie de comprendre les bases en premier. Quelle est la différence entre MSIL et le bytecode Java?
- Question connexe: stackoverflow.com/questions/453610/...
- Un peu plus à l'comparaison générale sur: stackoverflow.com/questions/682608/...
Vous devez vous connecter pour publier un commentaire.
D'abord, laissez-moi vous dire que je ne pense pas que les différences subtiles entre le bytecode Java et MSIL est quelque chose qui devrait déranger un novice .NET développeur. Ils servent tous les deux le même but, à savoir la définition d'un abrégé de la machine cible qui est une couche au-dessus de la machine physique utilisé dans la fin.
MSIL et le bytecode Java sont très semblables, en fait, il existe un outil appelé Sauterelle qui se traduit par MSIL pour le bytecode Java, je faisais partie de l'équipe de développement pour la Sauterelle, donc je peux partager un peu de mes (fanée) de la connaissance.
Veuillez noter que j'ai arrêté de travailler sur ce autour de lors de .NET framework 2.0 est sorti tellement de certaines de ces choses ne peut pas être plus vrai (si s'il vous plaît laissez un commentaire et je vais le corriger).
struct
).enums
ne sont pas beaucoup plus que les wrappers autour de types d'entiers alors que Javaenum
sont un peu à part entière classes (grâce à Internet Ami pour les commentaires).out
etref
paramètres.Il y a d'autres différences de langue, mais la plupart d'entre eux ne sont pas exprimées à l'octet de code de niveau, par exemple si la mémoire est de Java non-
static
les classes internes (qui n'existent pas dans .NET) ne sont pas un code binaire en fonction, le compilateur génère un argument supplémentaire à l'intérieur du constructeur de la classe et passe à l'objet extérieur. La même chose est vraie pour les .NET des expressions lambda.Ils sont essentiellement faites la même chose, MSIL est la version de Microsoft du bytecode Java.
Les principales différences à l'interne sont:
Beaucoup plus d'informations et une comparaison détaillée peut être trouvée dans cet article par K John Gough (document postscript)
CIL (le vrai nom de MSIL) et le bytecode Java sont plus les mêmes qu'ils sont différents. Il y a d'importantes différences cependant:
1) CIL a été conçu dès l'origine pour servir de cible pour plusieurs langues. En tant que tel, il prend en charge beaucoup plus riches type de système, y compris les entiers signés et non signés, les types de valeur, les pointeurs, les propriétés, les délégués, les événements, les génériques, un objet avec une seule racine, et plus encore. CIL qui prend en charge les fonctionnalités pas requis lors de la première CLR langages (C# et VB.NET) tels que les fonctions globales et queue-appel optimisations. En comparaison, le bytecode Java a été conçu comme une cible pour le langage Java et reflète beaucoup de contraintes trouvé en Java lui-même. Il serait beaucoup plus difficile d'écrire C ou de l'utilisation de bytecode Java.
2) CIL a été conçu pour s'intégrer facilement dans les bibliothèques natives et code non managé
3) le bytecode Java a été conçu pour être interprété ou compilé tout CIL a été conçu en supposant compilation JIT seulement. Cela dit, la mise en œuvre initiale de Mono utilisé les services d'un interprète à la place d'une équipe commune d'enquête.
4) CIL a été conçu (et spécifié) d'avoir un homme de lecture et d'écriture de l'assemblée forme de langage que les cartes directement sur le bytecode forme. Je crois que le bytecode Java est (comme son nom l'indique, destiné à être uniquement lisible par la machine. Bien sûr, le bytecode Java est relativement facile à décompilé en arrière à l'original Java et, comme indiqué ci-dessous, il peut aussi être "démonté".
Il est à noter que la JVM (la plupart d'entre eux) est plus optimisé que le CLR (l'un d'eux). Donc, la performance brute pourrait être une raison de préférer le ciblage de bytecode Java. C'est un détail d'implémentation cependant.
Certaines personnes disent que le bytecode Java a été conçu pour être multi-plateforme, tandis que CIL a été conçu pour Windows uniquement. Ce n'est pas le cas. Il y a quelques "Windows"ismes dans le .NET framework, mais il n'en existe aucune dans CIL.
Comme un exemple de nombre de point 4) ci-dessus, j'ai écrit un jouet Java à CIL compilateur a tout à l'arrière. Si vous nourrissez ce compilateur Java suivantes du programme:
mon compilateur va cracher le suivant CIL:
C'est valable CIL programme qui peut être introduit dans un CIL assembleur comme
ilasm.exe
pour créer un fichier exécutable. Comme vous pouvez le voir, CIL est entièrement humain, de lecture et d'écriture de la langue. Vous pouvez facilement créer valide CIL programmes dans tout éditeur de texte.Vous pouvez aussi compiler le programme Java ci-dessus avec le
javac
compilateur, puis exécutez la classe résultante des fichiers par le biais de lajavap
"désassembleur" pour obtenir le suivant:La
javap
de sortie n'est pas compilable (à ma connaissance), mais si on le compare à la CIL de sortie ci-dessus, vous pouvez voir que les deux sont très similaires.CIL aka MSIL est conçu pour être lisible par l'homme. Le bytecode Java n'est pas.
Pense du bytecode Java comme étant en code machine pour le matériel qui n'existe pas (mais qui Jvm imiter).
CIL est plus comme langage d'assemblage - une étape de code machine, tout en restant lisible par l'homme.
Il n'y a pas beaucoup de différences. Les deux sont des formats intermédiaires du code que vous avez écrit. Lorsqu'il est exécuté, les machines Virtuelles qui exécutent le langage intermédiaire géré cela signifie que la Machine Virtuelle contrôle les variables et les appels. Il y a même une langue dont je ne me rappelle maintenant que peut courir .Net et Java de la même façon.
Bref, c'est juste un autre format pour la même chose
Edit: Trouvé le langage (en plus de la Scala): Il est FAN (http://www.fandev.org/), semble très intéressant, mais pas de temps encore pour évaluer
Convenu, les différences sont infimes assez pour ingore comme un débutant. Si vous voulez apprendre .Net à partir de la bases, je vous recommande de regarder le Common Language Infrastructure et le Système de Type Commun.
Serge Lidin auteur d'un décent livre sur les détails de MSIL: L'Expert .NET 2.0 IL Assembleur. J'ai aussi été capable de ramasser MSIL rapidement en regardant des méthodes simples à l'aide de .NET Réflecteur et Ildasm (Tutoriel).
Les concepts entre MSIL et le bytecode Java sont très similaires.
Je pense que MSIL ne faut pas comparer à bytecode Java, mais "l'instruction qui composent le Java bytecode".
Il n'y a pas de nom de démonté le bytecode java. "Bytecode Java" devrait être un non-officiel alias, comme je ne trouve pas son nom dans le document officiel.
Le Fichier De Classe Java Désassembleur dire
À la fois "de la machine virtuelle Java instructions" et "MSIL" sont assemblés en .NET bytecode Java et le code, qui ne sont pas lisibles par un humain.