Unterschiede zwischen MSIL und Java-Bytecode?
Ich bin neu zu .Net und ich bin versucht, zu verstehen, die Grundlagen zuerst. Was ist der Unterschied zwischen den MSIL-und Java-bytecode?
InformationsquelleAutor der Frage user18055 | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst einmal möchte ich sagen, dass ich nicht glaube, dass die subtilen Unterschiede zwischen Java bytecode und MSIL ist etwas, das sollte die Mühe einem Anfänger .NET-Entwickler. Beide dienen dem gleichen Zweck, der Definition der abstrakten Zielmaschine, die eine Ebene über der physischen Maschine verwendet wird, in das Ende.
MSIL-und Java-bytecode sind sehr ähnlich, in der Tat gibt es ein tool namens Heuschrecke die MSIL übersetzt, um Java-bytecode, ich war Teil des Entwicklungsteams für die Heuschrecke, so kann ich teilen, ein bisschen von meinem (verblichenen) wissen.
Bitte beachten Sie, dass ich aufgehört zu arbeiten auf diese um, wenn .NET framework 2.0 kam also einige dieser Dinge kann nicht wahr sein (wenn ja, bitte einen Kommentar hinterlassen und ich werde es richtig).
struct
).enums
sind nicht viel mehr als Wrapper integer-Typen, während JavaEnumerationen
sind ziemlich vollwertige Klassen (Dank Internet-Freund für die Kommentare).out
undref
Parameter.Gibt es andere sprachliche Unterschiede, aber die meisten von Ihnen sind nicht ausgedrückt an der byte-code-Ebene, zum Beispiel, wenn der Speicher dient Java ist nicht
static
innere Klassen (die nicht existieren .NET) sind keine bytecode-Funktion generiert der compiler ein zusätzliches argument zu der inneren Klasse den Konstruktor und übergibt die äußeren Objekt. Das gleiche gilt für .NET lambda-Ausdrücke.InformationsquelleAutor der Antwort Motti
Sind Sie im wesentlichen die gleiche Sache zu tun, MSIL ist Microsofts version von Java-bytecode.
Die wichtigsten Unterschiede, die intern sind:
Viele weitere Informationen und einen detaillierten Vergleich finden Sie in dieser Artikel von K John Gough (postscript Dokument)
InformationsquelleAutor der Antwort Guy Starbuck
CIL (der richtige name für MSIL) und Java-bytecode sind mehr die gleichen, als Sie anders sind. Es gibt einige wichtige Unterschiede, obwohl:
1) CIL wurde von Anfang an als Ziel für mehrere Sprachen. Als solche unterstützt es eine viel reichere Typ system einschließlich signed-und unsigned-Typen, Datentypen, Zeiger, Eigenschaften, Delegaten, Ereignisse, Generika, ein Objekt-system mit einer einzigen Wurzel, und mehr. CIL unterstützt Funktionen, die nicht erforderlich für das erste CLR-Sprachen (C# und VB.NET) wie Globale Funktionen und tail-call-Optimierungen. Im Vergleich, Java-bytecode wurde als Ziel für die Java-Sprache und spiegelt viele der Marker gefunden, in Java selbst. Es wäre viel schwieriger zu schreiben, C oder Scheme mit Hilfe von Java-bytecode.
2) CIL wurde entwickelt, um eine einfache Integration in native-Bibliotheken und nicht verwalteten code
3) Java-bytecode entworfen, um entweder interpretiert oder kompiliert, während CIL wurde entwickelt, vorausgesetzt, die JIT-Kompilierung nur. Das heißt, die erste Implementierung von Mono verwendet einen interpreter anstelle eines JIT.
4) CIL konzipiert wurde (und angegeben) zu einer lesbaren und beschreibbaren assembly-Sprache, die form, die Karten direkt auf dem bytecode-form. Ich glaube, dass Java-bytecode wurde (wie der name schon sagt) gemeint zu sein, nur maschinenlesbar. Der Kurs, der Java-bytecode ist relativ leicht dekompiliert zurück zur ursprünglichen Java-und, wie unten gezeigt, es kann auch "zerlegt".
Sollte ich beachten Sie, dass die JVM (die meisten von Ihnen) ist höher optimiert als die CLR (jeder von Ihnen). So, raw-Leistung könnte ein Grund sein, lieber targeting Java-bytecode. Dies ist eine Implementierung detail, obwohl.
Einige Leute sagen, dass der Java-bytecode wurde entwickelt, um multi-Plattform, während CIL wurde entwickelt, um nur Windows. Dies ist nicht der Fall. Es gibt einige "Windows" - Ismen in der .NET framework, aber es sind keine in CIL.
Als ein Beispiel für die Punkt-Zahl 4) oben schrieb ich ein Spielzeug Java-CIL-compiler eine Weile zurück. Wenn Sie füttern diese compiler die folgende Java-Programm:
mein compiler spuckt folgende CIL:
Dies ist eine gültige CIL-Programm eingespeist werden kann, in einem CIL-assembler wie
ilasm.exe
erstellen Sie eine ausführbare Datei. Wie Sie sehen können, CIL ist eine vollständig lesbare und schreibbare Sprache. Sie können ganz einfach erstellen Sie gültigen CIL-Programme, die in einem beliebigen text-editor.Können Sie auch kompilieren des Java-Programms mit der
javac
- compiler und führen Sie dann die resultierenden class-Dateien durch diejavap
"disassembler", um die folgenden:Den
javap
Ausgang ist nicht kompilierbar (meines Wissens nach) aber wenn Sie es vergleichen, um die CIL-Ausgabe oben sehen Sie, dass die beiden sich sehr ähnlich sind.InformationsquelleAutor der Antwort Justin
CIL aka MSIL ist gedacht für Menschen-lesbar. Java-bytecode ist nicht.
Denke, dass der Java-bytecode als Maschinencode für hardware, die nicht vorhanden ist (aber die JVMs emulieren).
CIL ist mehr wie Assembler - einen Schritt von der Maschine code, während immer noch lesbar sind.
InformationsquelleAutor der Antwort slim
Gibt es nicht viel Unterschiede. Beide sind mittleren Formaten der code, den Sie schrieb. Wenn es ausgeführt wird, den Virtuellen Maschinen ausgeführt wird, die intermediate language verwaltet, die bedeutet, dass die Virtuelle Maschine steuert den Variablen und Aufrufe. Es gibt sogar eine Sprache, die ich nicht kenne, gerade jetzt, das betrieben werden kann .Net und Java auf die gleiche Weise.
Im Grunde, es ist nur ein anderes format für die gleiche Sache
Edit: Gefunden, die Sprache (neben Scala): Es ist ein FAN (http://www.fandev.org/), sieht sehr interessant, aber noch gar keine Zeit, um zu bewerten
InformationsquelleAutor der Antwort GHad
Vereinbart, die Unterschiede sind winzig genug, um ingore als Anfänger. Wenn Sie lernen wollen .Netto-ausgehend von den Grundlagen, würde ich empfehlen, sich auf die Common Language-Infrastruktur und dem Gemeinsamen Typ System.
InformationsquelleAutor der Antwort Internet Friend
Serge Lidin verfasste ein anständiges Buch über die details des MSIL: Experte .NET 2.0 IL Assembler. Ich war auch in der Lage zu pick-up MSIL schnell durch den Blick auf die einfachen Methoden mit .NET Reflector und Ildasm (Tutorial).
Konzepte zwischen den MSIL-und Java-bytecode sehr ähnlich sind.
InformationsquelleAutor der Antwort Jeffrey LeCours
Ich denke, MSIL, sollten Sie nicht zu vergleichen, um Java-bytecode, sondern "die Anweisung, aus den Java-Bytecode".
Es ist kein name zerlegt java-bytecode. "Java-Bytecode" sollte eine inoffizielle alias, da ich nicht finden Ihren Namen im offiziellen Dokument.
Das Java Class File Disassembler sagen
Beide "Java-VM-Anweisungen" und "MSIL" montiert werden .NET-bytecode und Java-code, der nicht von Menschen lesbar.
InformationsquelleAutor der Antwort Dennis C