Microsoft Intermediate Language (MSIL)
Eintrag zuletzt aktualisiert am: 15.06.2009
Microsoft Intermediate Language (
MSIL) ist die in .NET verwendete Zwischensprache.
Sowohl die
Programmiersprache Java als auch das
.NET Framework basieren auf dem Konzept
Write Once Run Anywhere (
WORA), d. h., eine einmal entwickelte und kompilierte Anwendung kann auf verschiedenen Betriebssystemen ablaufen. Das
.NET Framework arbeitet – genau wie
Java – mit einem
Intermediationskonzept auf Basis einer Zwischensprache und einer virtuellen Maschine (WM). Ein Compiler einer .NET-Hochsprache erzeugt also keinen prozessorspezifischen Maschinencode, sondern einen plattformunabhängigen Zwischencode. Dieser Zwischencode wird Microsoft Intermediate Language (
MSIL) oder – im
ECMA- und
ISO-Standard –
Common Intermediate Language (
CIL) genannt. Code in
MSIL wird auch als verwalteter Code (Managed Code) bezeichnet. Im Gegensatz dazu wird prozessorspezifischer Maschinencode als nicht-verwalteter (
Unmanaged Code) oder
Native Code bezeichnet.
Erst zur Laufzeit wird der
MSIL-Code dann in einen prozessorspezifischen Maschinencode (
Native Code) umgewandelt.
MSIL-Code wird nicht interpretiert, sondern von einem sogenannten
Just-in-Time-Compiler stückchenweise umgewandelt und dann ausgeführt. Dabei berücksichtigt der
Just-in-Time-Compiler prozes-
sorspezifische Optimierungsmöglichkeiten. Dadurch, dass nicht interpretiert, sondern vor der Ausführung kompiliert wird und der
Just-in-Time-Compiler sehr schnell arbeitet, ist der Leistungsverlust durch die
Intermediation sehr gering. Im Zweifel gibt es auch die Möglichkeit, das Ergebnis der Kompilierung von
MSIL zu Maschinencode zu speichern und später auszuführen. Dies nennt man
Native Image. Ein
Native Image ist jedoch nicht mehr plattformunabhängig. Es ist nicht verboten, dass Sprach-Compiler wahlweise auch direkt
Native Code erzeugen, der nicht unter der Kontrolle der .NET-Laufzeitumgebung abläuft.
Der
Just-in-Time-Compiler (JIT-Compiler oder JITter) ist Teil der .NET-Laufzeitumgebung, die
Common Language Runtime (
CLR) genannt wird. Das
Intermediationskonzept ist die Basis für die Plattformunabhängigkeit der Anwendungen. Managed Code kann auf jedem Betriebssystem ausgeführt werden, für das eine Implementierung der
Common Language Runtime verfügbar ist.
Natürlich ist Managed Code langsamer als
Native Code, wobei der Geschwindigkeitsunterschied sehr viel geringer ist, als man vermutet. Wenn jedoch die optimale Geschwindigkeit notwendig ist, besteht die Möglichkeit, eine Managed-Code-Datei einmalig in eine Native-Code-Datei umzuwandeln. Dazu dient das Werkzeug ngen.exe. Der Vorgang wird als Pre-Jitting bezeichnet. Das Resultat von ngen.exe nennt man ein
Native Image. Ngen.exe wurde in
.NET 2.0 stark vereinfacht (z. B. werden nun alle referenzierten Kompo-nenten automatisch mitübersetzt).
Grundsätzlich kann zwar ein
Native Image bereits während der Entwicklung erzeugt werden; aufgrund der plattformspezifischen Übersetzung bietet es sich jedoch an, das
Native Image erst bei der Installation einer .NET-Anwendung zu erzeugen (Install Time Compilation). Das
Native Image ist spezifisch für eine bestimm-te Version der .NET-Laufzeitumgebung. Auch benötigen
DOS- und NT-basierte Windows-Systeme verschie-dene
Native Images. Eine .NET-Anwendung, die in einem
Native Image gespeichert ist, braucht ebenfalls die .NET-Laufzeitumgebung, um ausgeführt werden zu können.