Windows »unplugged« DotGNU befreit .NET aus seiner Abhängigkeit

Windows wird in der Industrie meist wegen des verbreiteten Programmier-Know-hows und seiner grafischen Oberfläche eingesetzt. In vielen Bereichen der Automatisierung hat sich für Echtzeit-Anwendungen dagegen Linux etabliert. Die Laufzeitumgebung DotGNU bringt beide Welten zusammen, indem sie eine Ablaufumgebung für Windows-.NET-Programme unter Linux schafft.

Wenn es um grafische Oberflächen geht, denken noch immer Viele an Microsoft-Lösungen. Dass es auch anders geht, beweist DotGNU, eine Open-Source-Software-Infrastruktur für Linux, unter der Windows-.NET-Programme ablaufen können. Mit dem Einsatz von DotGNU bei Trumpf Laser hat diese Lösung jetzt auch die Feuerprobe im industriellen Einsatz bestanden.

Hintergrund

Microsoft hat im Jahr 2000 mit der Einführung von .NET damit begonnen, eine plattformunabhängige Lösung anzubieten – ähnlich zu Java und der Java Virtual Machine. Für Microsoft bot die Entwicklung von .NET nicht nur die Möglichkeit, einen Gegenpol zu Java zu schaffen, sondern auch die eigenen, in die Jahre gekommenen Technologien COM und DCOM (Distributed Component Object Model) zu ersetzten. Was bei Java die JVM ist, ist bei .NET die Common Language Runtime (CLR). Sie ist die Laufzeitumgebung dazu angepasster Hochsprachen. Diese virtuelle Maschine (VM) führt den standardisierten Zwischencode der Common Intermediate Language (CIL) aus. Die CIL ist in der ISO/IEC 23271:2006 normiert und wurde während der Normierung von „Microsoft Intermediate Language“ in CIL umbenannt. Microsoft hat sich mit dem Bekenntnis zu .NET auch zu einem laufzeitbasierten System bekannt und damit gegen eine direkte Compilierung in Maschinencode.

.NET benötigt zu seiner Programmierung wie bereits erwähnt eine an die CLR angepasste Programmiersprache. Von Microsoft werden hierfür unterschiedliche Lösungen angeboten. Originär für die CLR wurde C# entwickelt, geeignet sind aber auch C++, das Microsoft-spezifische Visual Basic .NET sowie J# und JScript .NET. All diese Sprachen lassen sich unter Microsofts Entwicklungsumgebung Visual Studio nutzen oder werden zusammen mit dieser ausgeliefert (Bild 1).

Code, der mit diesen Sprachen geschrieben wurde, wird in die CIL übersetzt und kann dann vom Laufzeitsystem abgearbeitet werden. Die einzelnen Komponenten lassen sich auch gemischt gemeinsam nutzen. Verantwortlich hierfür ist unter anderem das Typsystem bei .NET, das eine gemeinsame Schnittmenge von Datentypen für alle Sprachen beschreibt. Die Frage der Wartbarkeit von Code, der mit unterschiedlichen Programmiersprachen erzeugt wurde, wird kontrovers diskutiert. Generell gilt, dass der Aufwand für die Wartung mit dem Einsatz mehrerer (Ursprungs-)Sprachen steigt.

Theoretisch ist mit Definition der CLR und der CIL eine vollständige Plattformunabhängigkeit gegeben. Realität ist aber, dass es von Microsoft nur für die eigene Windows-Familie eine Implementierung von .NET gibt. Microsofts Projekt Rotor [2], ursprünglich für FreeBSD gedacht, ist heute nur in einer Version für Windows XP auf der Download-Seite von Microsoft erhältlich. Die ursprünglichen Lizenzbedingungen von Microsoft für dieses Projekt wurden von vielen als zu restriktiv betrachtet. Implementierungen für andere Betriebssysteme von Drittanbietern sind bis heute nicht bekannt. Zu Beginn des Jahres 2001 ist daher in der Open-Source-Gemeinde ein Projekt gestartet worden, dessen Ziel genau diese Implementierung für Linux war und ist – DotGNU Portable .NET. Mit „Mono“ wurde ein weiteres Open-Source-Projekt gestartet, das ebenfalls eine Laufzeitumgebung (CLR) für .NET zum Ziel hat.

DotGNU Portable .NET

Ziel der DotGNU-Initiative ist es, eine Laufzeitumgebung für .NET zu schaffen, die frei erhältlich ist und einfach auf andere Systeme portiert werden kann. Portable .NET besteht aus drei grundlegenden Komponenten:

  • Byte-Code-Laufzeitumgebung (Common Language Runtime, CLR)
  • C#-Compiler
  • C#-Basis-Klassenbibliothek

Die CLR von DotGNU erhält ihre Portierbarkeit in erster Linie durch die Verwendung eines Interpreters. Just-in-Time-Übersetzung wird nur dort verwendet, wo es aus Performance-Gründen unbedingt notwendig ist. Eine der größten Herausforderungen für die Entwickler von DotGNU war die Zulässigkeit von polymorphen Instruktionen durch die CIL. Dies bedeutet, dass die gleiche Instruktion für unterschiedliche Datentypen benutzt werden kann. Bei anderen virtuellen Maschinen wie der Java Virtual Machine wird für jeden Datentyp ein dedizierter Befehl verwendet. Zur Lösung dieses Problems übersetzen die DotGNU-Entwickler den CIL-Code in eine einfachere Abstraktion: die CVM (Converted Virtual Machine). Die CVM-Anweisungen werden dann von einem sehr schnellen Interpreter ausgeführt.

Zusammen mit einigen weiteren Optimierungen innerhalb des Interpretercodes kam so eine Lösung zustande, die extrem schnell ist und auch, zumindest gemäß [3], weitaus leistungsfähiger als beispielsweise Mono. Die Offenheit des Ansatzes zeigt sich im Aufwand, DotGNU auf andere Systeme zu portieren: ein Port nach MacOSX soll laut [3] nur einen Tag in Anspruch genommen haben.