C++/CLIC++/CLI ist eine von Microsoft entwickelte Variante der Programmiersprache C++, die den Zugriff auf die virtuelle Laufzeitumgebung des .Net-Frameworks mit Hilfe von speziell darauf zugeschnittenen Spracherweiterungen ermöglicht. C++/CLI erfüllt die ebenfalls von Microsoft entwickelte Spezifikation namens Common Language Infrastructure (CLI) zur Sprach- und Plattform-neutralen Entwicklung und Ausführung von .NET-Anwendungen. Programme, die in C++/CLI geschrieben sind, können vom Compiler in CIL übersetzt und auf der virtuellen Maschine der .NET-Plattform betrieben werden. Seit Dezember 2005 liegt ein offiziell von der Ecma ratifizierter Standard für C++/CLI vor. Microsoft Visual Studio ab Version 2005 und das Compiler-Frontend der Edison Design Group bieten eine Implementierung von C++/CLI an.[1] Sinn und Zweck der ErweiterungenZiele bei der Entwicklung von C++/CLI waren:
Unterschiede zu Managed C++C++/CLI ist das Ergebnis einer grundlegenden Überarbeitung von Managed C++, der ersten Version von C++ mit Spracherweiterungen für die .NET-Plattform. Managed C++ litt unter Akzeptanzproblemen, weil viele Programmierer die Syntaxerweiterungen als schwer lesbar empfanden. Beispielsweise enthielt die Syntax Bestandteile, die nicht eindeutig erkennen ließen, ob verwaltete oder nichtverwaltete Objekte erzeugt werden.[2] Auch wirkten die mit Managed C++ eingeführten Syntaxelemente für viele Programmierer behelfsmäßig in die Sprache integriert. So waren z. B. viele Schlüsselwörter eingeführt worden, die mit zwei Unterstrichen beginnen. Zwar ist dies bei Spracherweiterungen gegenüber Standard-C++ üblich, die große Anzahl solcher Schlüsselwörter, sowie deren starke Durchdringung in Programmen, die von den Erweiterungen Gebrauch machten, wirkten jedoch störend auf das Gesamtbild der Quelltexte. Beispiele:
1) Deklaration einer Funktion f, die eine CLI-Reihung (array) zurückgibt. Im Unterschied zu Managed C++ wird die Destruktor-Syntax Weitere NeuerungenWeitere Neuerungen gegenüber ISO-C++ sind: verbesserte Aufzählungsklassen (enum class), Delegaten, Verpacken (boxing), Schnittstellenklassen, versiegelte Klassen, Attribute usw. ObjektzeigerDie augenfälligste Neuerung ist die Syntax T^ whole_object_pointer = gcnew T(a, b); Dabei ist gcnew ein Operator zur Allokation von Objekten, die von der automatischen Speicherbereinigung verwaltet werden. Im Vergleich dazu die herkömmliche Syntax für Zeiger: T* plain_old_pointer = new T(a, b); Deinitialisierung und SpeicherfreigabeAnders als bei gewöhnlichen Zeigern wird beim Löschen von Handles mittels Im Unterschied zu anderen Sprachen mit automatischer Speicherbereinigung (z. B. C# oder Java) wird hier also die problematische Zusammenfassung der Verwaltung von Speicher und anderen Ressourcen voneinander getrennt: Speicher und andere Ressourcen werden nicht mehr zusammen mit Hilfe der Speicherbereinigung freigegeben (also keine deterministische Deinitialisierung); siehe Finalisierung. Als automatische Variablen anlegbare CLI-ObjekteEine weitere technische Neuerung und einer der wichtigsten Unterschiede zu anderen Sprachen mit automatischer Speicherbereinigung sind die als automatische Variablen (d. h. auf dem Stack) anlegbaren CLI-Objekte. Die Lebensdauer von automatischen Variablen endet in dem Augenblick, in welchem sie ihren Gültigkeitsbereich verlassen. Im Zusammenspiel mit den neuartigen Objektzeigern bleiben in C++ dadurch häufig angewandte Programmiertechniken wie RAII (Abkürzung für engl. resource acquisition is initialization) auch für die mit der automatischen Speicherbereinigung verwalteten CLI-Objekte möglich. Fehleranfällige Kodiertechniken, wie sie aus anderen Programmiersprachen bekannt sind, lassen sich damit vermeiden. Dazu ein Beispiel in C++/CLI: void Uebertragung()
{
MessageQueue source("server\\sourceQueue");
String^ mqname = safe_cast<String^>(source.Receive().Body);
MessageQueue dest1("server\\" + mqname), dest2("backup\\" + mqname);
Message^ message = source.Receive();
dest1.Send(message);
dest2.Send(message);
}
Beim Verlassen der Funktion Wenn ein automatisches Objekt seinen Gültigkeitsbereich verlässt, oder beim Löschen mit Der Wegfall von Finalisierungsfunktionen kann sich insgesamt positiv auf die Ausführungsgeschwindigkeit auswirken, hilft aber noch andere Probleme zu vermeiden; zu Problemen bei Verwendung der Finalisierungsfunktion siehe Finalisierung. Im Unterschied zu C++/CLI muss beispielsweise in Java oder C# zur Ressourcenfreigabe eine entsprechende Funktion (in C# Vergleich mit anderen .NET-SprachenEine Besonderheit von C++/CLI ist die Mischbarkeit von Code, der auf der virtuellen Maschine läuft, und Code, der direkt auf der CPU ausgeführt wird. Beide Arten von Programmcode können in einer einzigen Programmdatei zusammengestellt werden.[3] Mit dieser Möglichkeit nimmt C++/CLI bislang eine Sonderstellung unter den .NET-Sprachen ein. Literatur
Weblinks
Einzelnachweise
|
Portal di Ensiklopedia Dunia