Wissen von A bis Z

Common Intermediate Language (CIL)

CIL ist das Esperanto der .NET-Welt – egal ob Sie C# oder F# sprechen, am Ende verstehen sich alle in dieser einen Zwischensprache.

Die Common Intermediate Language (CIL), gelegentlich noch als Microsoft Intermediate Language (MSIL) bezeichnet, ist die sprachneutrale, stack-basierte Zwischensprache der .NET-Plattform. Jeder Quellcode aus C#, VB.NET, F# oder anderen .NET-Sprachen wird zunächst in CIL übersetzt und in Form von Assemblies (DLL- oder EXE-Dateien) ausgeliefert; erst zur Laufzeit erzeugt der Just-in-Time-Compiler der CLR daraus plattformspezifischen Maschinencode.

Eingesetzt wird CIL implizit in jedem .NET-Programm, sichtbar wird sie unter anderem in Werkzeugen wie ildasm, ilspy, dotPeek oder JetBrains Rider, die Assemblies disassemblieren und ihren CIL-Inhalt darstellen. Auch dynamische Codegenerierung — etwa über System.Reflection.Emit, Expression Trees oder Roslyn-Source-Generators — operiert letztlich auf CIL-Ebene oder direkt darüber.

Der Einsatzzweck von CIL liegt in der Sprach- und Plattformneutralität: Eine in C# geschriebene Bibliothek lässt sich aus F# konsumieren, weil beide Sprachen denselben CIL-Code und dasselbe Common Type System nutzen. Gleichzeitig entkoppelt CIL den Build- vom Ausführungsschritt: Eine kompilierte Assembly kann auf x86, x64, ARM oder ARM64 unter Windows, Linux oder macOS ausgeführt werden, weil die CLR die Übersetzung in nativen Code erst auf der Zielmaschine vornimmt. Damit löst CIL ein klassisches Verteilungsproblem nativer Sprachen, bei denen Binaries plattformspezifisch produziert werden müssen.

Historisch ist CIL gemeinsam mit dem .NET Framework 1.0 im Jahr 2002 eingeführt und über ECMA-335 als Bestandteil der Common Language Infrastructure standardisiert worden. Die CIL-Spezifikation hat sich seither nur in Details weiterentwickelt (etwa neue Instruktionen für Generics in CLR 2.0); zentrale Operationen wie ldarg, stloc, call, callvirt, box und ret sind seit Beginn unverändert.

Eingeführt wurde CIL durch Microsoft, eingebracht in die Standardisierung gemeinsam mit Hewlett-Packard und Intel. Anders Hejlsberg hat in mehreren Vorträgen erwähnt, dass die Designprinzipien von CIL bewusst von Java-Bytecode lernten, aber zugleich gezielt anders gesetzt wurden — insbesondere durch ein ausdrucksstärkeres Typsystem mit Value-Typen, echten Generics ab CLR 2.0 (statt Java-typischer Type Erasure) und expliziten Calling Conventions, was eine deutlich engere Anbindung von Sprachen wie F#, C++/CLI und nativ-nahen Konstrukten ermöglicht hat.

Zurück