Microsoft Intermediate Language (MSIL)


[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ Literaturverzeichnis ]

Übersicht: MSIL


Microsoft Intermediate Language ist die Zwischensprache des .NET Framework. Kompilierte Intermediate-Code-Anwendungen liegen als Portable Executable (PEs) vor und enthalten neben dem MSIL-Code, einen speziellen CLR Header, Schnittstellenbeschreibungen (unsichtbare IDL) und weitere Metadaten. Sie liegen als .dll- oder .exe-Dateien vor. Aufgrund der Verwaltung der Ausführung durch die CLR werden Programme für das .NET Framework als managed Code bezeichnet.

Einer der großen Vorteile von MSIL liegt darin, dass es sich nicht einfach um einen maschinenabhängigen Objektcode auf niedriger Ebene handelt. Tatsächlich ist die Unterstützung objektorientierter Funktionalität wie etwa die Ideen von Klassen, Kapselung und Verbergen von Daten und Vererbung in MSIL integriert.

Somit ermöglicht MSIL eine sprachübergreifende objektorientierte Programmierung.


JIT (Just-in-Time) - Kompilation

MSIL-Code wird vor der Ausführung grundsätzlich in echten Maschinencode übersetzt. Somit ist gewährleistet, das immer die schnellstmögliche Ausführungsgeschwindigkeit gegeben ist. Zudem erlaubt dieses Verfahren eine Entkopplung der Runtime von der zugrundeliegenden Hardware.

MSIL-Code wird nur bei Bedarf durch den JIT-Compiler der Common Language Runtime in nativen Code übersetzt und ausgeführt.

Während der JIT-Kompilierung überprüft die CLR den gesamten verwalteten Code, um die Sicherheit des Arbeitsspeichertyps zu gewährleisten. Dadurch wird das Risiko minimiert, dass Code "unerwartete" Aktionen ausführt oder hervorruft, die den gewöhnlichen Anwendungsfluss und somit auch Sicherheitsüberprüfungen umgehen könnten.


Isolation (Anwendungsdomäne)

Das .NET Framework trennt Anwendungsbereiche durch so genannte Anwendungsdomänen. Normalerweise erzeugen Betriebssysteme diese Isolierung, indem jede Anwendung in einem separaten Prozess ausgeführt wird, wobei jede über unterschiedlichen Adressraum verfügt, so dass die Anwendungen sich nicht gegenseitig stören. Bei stark belasteten Servern kosten die Prozesse jedoch leider viel Systemleistung. Daher ist das Ausführen eines individuellen Prozesses für jeden Benutzer, der auf den Server zugreift, möglicherweise zu aufwändig.

Dank der Typensicherheit von überprüftem, verwaltetem Code kann die CLR innerhalb der Prozessgrenzen einen hohen Grad an Isolation zur Verfügung stellen. Ein einzelner Prozess kann mehrere Anwendungsdomänen mit verschiedenen beweisbasierten Vertrauensebenen und damit verbundenen Principalen enthalten, ohne dass die Gefahr einer mutwillig hervorgerufenen Störung zwischen beiden besteht. Code, der in der einen Domäne ausgeführt wird, kann andere Anwendungen in demselben Prozess nicht direkt beeinflussen oder auf andere Anwendungsressourcen zugreifen. Der gesamte verwaltete Code wird in eine einzige Anwendungsdomäne geladen und entsprechend den Sicherheitsrichtlinien dieser Domäne ausgeführt.


Maschinenbefehle

Bei der Bearbeitung des MSIL-Codes benutzt die CLR nur den Stapel und keine Register.

Während es bei Intel-CPUs üblich ist, lokale Variablen auf dem Stapel unterzubringen, liegen sie in der CLR im Speicher. Die Stapel gelten jeweils lokal in der Methode, in der die Arbeit erledigt wird. Und die CLR bewahrt die Stapel von einem Methodenaufruf zum nächsten auf. Außerdem werden die Ergebnisse mit Hilfe des Stapels zum Aufrufer zurückgegeben.

Die Übetragung der Werte vom Speicher auf den Staperl wird Loading genannt, alle Ladebefehle beginnen deshalb mit ld.

Die Übertragung der Werte vom Stapel in den Speicher wird Storing genannt, alle Speicherbefehle beginnen deshalb mit st.

MSIL hat 240 Operation Codes (OpCodes), hier folgen einige Maschinenbefehle von MSIL:


Beispiele

Der Disassembler ILDASM ermöglicht das Anzeigen von MSIL-Code. Mit Hilfe des ILDASM kann man Parameter und Rückgabetypen ermitteln. Die Parameter erscheinen mit ihren richtigen Namen und Klassenwerte werden im Format [Modul]Namensraum.Klasse angezeigt. So ist erkennbar, dass hinter einem int zum Beispiel int32 steckt.

Alles, was mit einem Punkt beginnt, stellt eine Direktive für den Assembler ILSAM.EXE dar. Kommentare beginnen mit den schon aus anderen Programmiersprachen bekannten doppelten Schrägstrichen.

Im MSIL-Code findet man alle Sprachkonstrukte aus der höheren Programmiersprache wieder. Theoretisch könnte man seine Anwendungen auch in MSIL schreiben.

"Hello World" in MSIL:

Vollständiges Beispiel:

Das nachfolgende Beispiel wurde in C# geschrieben. Diese Anwendung liest Argumente ein, zählt diese und gibt sie anschließend wieder aus.

Die Programmausführung sieht dann wie folgt aus

und die nachfolgende Abbildung zeigt den zugehörigen MSIL-Code. Die Anweisung .locals und die Klammern kennzeichnen die vollständige Parameterliste. Die einzelnen Parameter werden jeweils durch ein Komma voneinander getrennt. Der Typ wird in einem V_#-Format angegeben, wobei # jeweils die Parameternummer darstellt. Diese Nummer wird in einer ganzen Reihe von Befehlen benutzt.

In dem Beispiel wird hier eine lokale Variable für die Argumente (immer vorhanden) und zwei lokale Variablen für die foreach-Anweisung deklariert. Mit ldarg.0 wird die Adresse des Arrays auf den Stapel abgelegt und mit ldlen die Länge des Arrays ermittelt und abgelegt. Mit box und call wird der Wert für den Console.WriteLine Aufruf in einen Verweistyp umgewandelt und auf dem Bildschirm ausgegeben. Danach folgen die Befehle für die foreach-Schleife.


[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ oben ] ... [ weiter ] ... [ Literatur ]