Kurze Einleitung
Das Programmieren unter C++ gilt als die Königsklasse der objektorientierten Applikations-Entwicklung:
C++ stellt heute, zu Beginn des 21. Jahrhunderts, die wichtigste Programmiersprache für die Entwicklung leistungsfähiger Anwendungen dar. So ist C++ beispielsweise die am häufigsten verwendete Programmiersprache für die Entwicklung professioneller Anwendungen unter Microsoft Windows. Sehr viele weit verbreitete, erfolgreiche und unter Anwendern beliebte Programme sind in C++ entwickelt.
Als Gründe für die Beliebtheit von C++ unter Software-Entwicklern können die hohe Ausführungsgeschwindigkeit, große Flexibilität und einfache Bewältigung komplexer Aufgabensituationen genannt werden. Auch die Kompatibilität zur Programmiersprache C spielt eine entscheidende Rolle.
In den vergangenen zehn Jahren hat C++ durch Java und die .NET-Plattform starke Konkurrenz bekommen. Während bei Java eine hohe Portabilität im Vordergrund steht – also die Möglichkeit, ein Programm ohne Anpassung auf verschiedenen Betriebssystemen laufen zu lassen – ermöglicht die .NET-Plattform ein reibungsloses Zusammenspiel von Softwarekomponenten, die in völlig unterschiedlichen Programmiersprachen geschrieben sind. Die .NET-Plattform unterstützt zwar mit C++/CLI eine modifizierte Version von C++, um C++-Entwicklern die .NET-Plattform schmackhaft zu machen. C++ und C++/CLI sind dennoch unterschiedliche Programmiersprachen mit unterschiedlichen Zielen.
Ein wichtiger Bestandteil sowohl von Java als auch der .NET-Plattform und gleichzeitig ein entscheidender Unterschied zu C++ ist die virtuelle Maschine. Sie gaukelt einem Java- und .NET-Programm vor, auf einem in der Java- oder .NET-Spezifikation klar definierten Computer zu laufen. Java- und .NET-Programme laufen auf dieser virtuellen Maschine und greifen ausschließlich auf diese zu. Die virtuelle Maschine ist eine Zwischenschicht, die die Schnittstellen zum Betriebssystem und zur Hardware abstrahiert und quer über alle Computerkonfigurationen hinweg Java- und .NET-Programmen eine einheitliche Ausführungsumgebung zur Verfügung stellt. Java- und .NET-Programme wissen also grundsätzlich nicht, ob Ihr Computer einen Prozessor von Intel, AMD oder den eines anderen Herstellers besitzt. Sie müssen es auch nicht wissen, da sie lediglich auf der virtuellen Maschine laufen und nie direkt auf Ihren Prozessor zugreifen.
C++-Programme haben direkten Zugriff auf den Prozessor und profitieren daher grundsätzlich von einer hohen Ausführungsgeschwindigkeit: Der direkte Zugriff auf einen Prozessor ist im Allgemeinen schneller als der Zugriff auf eine virtuelle Maschine, die ihrerseits auf den Prozessor zugreifen muss. Der direkte Zugriff auf den Prozessor ermöglicht es Entwicklern außerdem, ein C++-Programm für einen Prozessor zu optimieren und einen zusätzlichen Geschwindigkeitsvorteil zu erreichen. Software, bei der es auf eine herausragende Performance ankommt, wird daher üblicherweise in C++ entwickelt.
C++ gilt als eine sehr flexible Programmiersprache, die mehrere Programmierparadigmen unterstützt. Unter Programmierparadigma versteht man eine bestimmte Sicht- und Herangehensweise an ein Problem. Programmierparadigmen sind Hilfsmittel, um Entwicklern das Lösen von Problemen zu erleichtern. Das bekannteste und heute am weitesten verbreitete Programmierparadigma ist die Objektorientierung. Sie ist auch das am häufigsten eingesetzte Programmierparadigma in C++. Dennoch können Sie auch ein C++-Programm ohne objektorientierte Konzepte erstellen. Die Objektorientierung wird Ihnen in C++ als ein Paradigma von vielen angeboten. So ist es mit C++ möglich, verschiedene Paradigmen in unterschiedlichen Komponenten der gleichen Software zu verwenden oder auch Paradigmen zu mischen. Weil kein Paradigma grundsätzlich besser oder schlechter ist als ein anderes und es von Fall zu Fall abhängt, welches Paradigma am sinnvollsten ist, bietet Ihnen C++ die freie Auswahl. Genaugenommen hängt die Auswahl eines Programmierparadigmas sogar vom Entwickler ab, da Entwickler sich bei gleicher Aufgabenstellung durchaus für unterschiedliche Paradigmen entscheiden können.
Neben der hohen Ausführungsgeschwindigkeit dank direktem Zugriff auf die Hardware und der Unterstützung verschiedener Programmierparadigmen zur Bewältigung unterschiedlicher Aufgabenstellungen ist die Kompatibilität zur Programmiersprache C von großer Bedeutung. C ist eine ältere Programmiersprache als C++, in der unglaublich viel Software entwickelt wurde und verfügbar ist. Darüberhinaus wird C als Systemprogrammiersprache zur Entwicklung zahlreicher Betriebssysteme inklusive Windows und Linux verwendet. Die hohe Kompatibilität zu C ermöglicht C++-Entwicklern den direkten Zugriff auf sämtlichen existierenden C-Code inklusive Betriebssystemfunktionen. Auf diese Weise können C++-Programme optimal mit ihrer Umgebung kommunizieren und in diese eingebettet werden.
System Kompatibilität
Ein guter C++ Programmcode unterstützt alle gängigen Betriebssysteme. Selbst wenn ein Programm mit dem kostenlosen Visual Studio Express entwickelt wurde, kann der Quellcode problemlos auf z.B. Linux mit g++ neu compiliert werden. Zu beachten ist allerdings, dass alle Headerdateien usw. mit einbezogen werden. Im Programm selber kann z.B. mit Präprozessor-Direktiven zwischen den Betriebssystemen unterschieden werden.
Sprachabgrenzung
C++ ist für den Programmieranfänger einfach nur der Name einer neuen Programmiersprache. Hinter dem Kürzel C++ können sich jedoch recht unterschiedliche Dinge verbergen, die ganz klar getrennt werden sollten, um im allgemeinen Sprachgebrauch zu wissen, was der andere meint.
Unter C++ versteht man erst einmal die Syntax und Semantik einer Programmiersprache. Das heißt, C++ definiert eine Reihe von Schlüsselwörtern und legt fest, welche Bedeutung die einzelnen Schlüsselwörter haben. Dies ist die eigentliche Definition einer Programmiersprache.
C++ als Programmiersprache wurde vor langer Zeit von Bjarne Stroustrup basierend auf der Programmiersprache C entwickelt und ist schon lange standardisiert. Das heißt, Man kann ein C++-Programm normalerweise mit jedem beliebigen C++-Compiler übersetzen - egal, von welchem Hersteller der Compiler stammt, egal, unter welchem Betriebssystem er läuft. Der Grundwortschatz ist nicht compiler- oder betriebssystemabhängig.
Seit 1998 gibt es einen offiziellen C++ Standard. Dieser Standard bezieht sich zum einen auf die Syntax und Semantik der Programmiersprache C++. Dies ist der eher uninteressantere Teil des Standards, weil hier eigentlich nur die bis dato bereits weit verbreitete und allgemeingültige Syntax von C++ von offizieller Seite bestätigt wurde. Es gibt zwar ein paar Neuheiten zum bisherigen Standard, aber diese Erweiterungen halten sich in Grenzen und sind leicht überschaubar.
Der viel wichtigere Teil des Standards ist die C++-Standardbibliothek. In dieser Bibliothek sind nützliche Funktionen, Klassen und Objekte zusammengefasst und standardisiert worden, um diese Hilfsmittel allen C++-Programmierern in einheitlicher Form zur Verfügung zu stellen. Es handelt sich also bei dieser Bibliothek um eine Art Werkzeugkasten, auf den jeder C++-Programmierer in seinen Programmen zugreifen kann. In diesem Werkzeugkasten liegen Werkzeuge, die alle mit Hilfe von C++ entwickelt wurden. Der Standard selbst legt nun fest, was für Werkzeuge im Werkzeugkasten enthalten sein müssen, welche Funktion diese Werkzeuge haben, wie sie angewandt werden etc.
Ein C++-Programmierer braucht sich nicht an der Standardbibliothek zu bedienen. Er kann seine Programme auch ohne diesen Werkzeugkasten erstellen. In der Praxis jedoch greift fast jedes C++-Programm auf Elemente der Standardbibliothek zu. Eine Programmierung ohne die Standardbibliothek würde oftmals bedeuten, dass Funktionen selber programmiert werden müssten, obwohl sie in der Standardbibliothek definiert sind. So müssen zum Beispiel viele Programme Dateien öffnen und lesen – die Standardbibliothek bietet entsprechende Hilfsmittel an, die wiederverwendet werden können, ohne Betriebssystemfunktionen aufzurufen und viele kleine Schritte selber machen zu müssen. Da kein C++-Programmierer das Rad neu erfinden will, was zeitaufwändig und fehleranfällig wäre, findet sich daher kaum ein C++-Programm, das nicht auf Funktionen, Klassen und Objekte aus der Standardbibliothek zugreift.
Die Entwicklung der Standardbibliothek ist gleichzeitig ein Schritt in Richtung höherer Portabilität. Denn mit dieser Standardbibliothek kann auf jedem Betriebssystem auf ganz bestimmte Werkzeuge in C++-Programmen zugegriffen werden. Anstatt zum Beispiel auf jedem Betriebssystem andere Funktionen aufzurufen, um Dateien zu öffnen und zu lesen, kann auf die Standardbibliothek zugegriffen werden, die bereits für das jeweilige Betriebssystem angepasst ist und weiß, wie mit Hilfe welcher Betriebssystemfunktionen Dateien zu öffnen und zu lesen sind.
Da der C++-Standard von einem internationalen Standardisierungsgremium überwacht und weiterentwickelt wird, wird verhindert, dass Unternehmen inkompatible Versionen von C++ entwickeln. Der C++-Standard hat heute eine so starke Stellung, dass er von keinem Unternehmen, das Entwicklungswerkzeuge zu C++ anbietet, ignoriert werden kann. Es kann daher erwartet werden, dass sich sämtliche Unternehmen nach dem C++-Standard richten. Da im Standardisierungsgremium viele unterschiedliche Interessen aufeinander treffen, schreitet die Entwicklung des C++-Standards aber nicht unbedingt schnell voran.
Da die Entwicklung von C++ in der Praxis schneller voranschreitet als der Standardisierungsprozess, wurde unter anderem von Mitgliedern des Standardisierungsgremiums Boost gegründet. Boost ist ein Tummelplatz im Internet von mehreren tausend C++-Entwicklern, die neue Bibliotheken entwickeln und gemeinschaftlich verbessern - mit dem Ziel, diese eines Tages in eine neue Version des C++-Standards zu integrieren. Die Entwicklung der Boost C++ Bibliotheken geht hierbei schneller voran als die Entwicklung des C++-Standards. Während der C++-Standard von 1998 zum Beispiel keinerlei Hilfsmittel zur Entwicklung von Netzwerkanwendungen bietet, gibt es eine entsprechende Netzwerk-Bibliothek bei Boost. Da sich Boost sehr stark am C++-Standard ausrichtet, sind die Boost C++ Bibliotheken im Allgemeinen auf einem sehr hohen Niveau. Da sie noch nicht standardisiert sind, können sie sich aber schneller ändern, was ein ständiges Lernen erfordert. In der Praxis sind die Boost C++ Bibliotheken ungemein wichtig, da der C++-Standard von 1998 zu alt ist, um für alle Aufgabenstellungen in der heutigen Softwareentwicklung bereits fertige Lösungen bieten zu können.
Vom Quellcode zum Maschinencode
Um ein C++-Programm zu schreiben, wird der Quellcode einfach in einer Text-Datei (genauer ASCII-Datei) gespeichert. Ein einfacher Text-Editor, wie er beispielsweise standardmäßig unter Windows installiert ist, reicht zum Schreiben von C++ aus. Während der Programmierer Quellcode schreiben und lesen kann, versteht der Computer nur Maschinencode. Das heißt, der Quellcode muss in Maschinencode übersetzt werden, damit das Programm vom Computer überhaupt ausgeführt werden kann.
Eine Übersetzung von Quellcode in Maschinencode findet in C++ in zwei Schritten statt: Zuerst wird der Quellcode durch den Compiler in Objektcode übersetzt. Dann wird der Objektcode durch den Linker in eine ausführbare Datei umgewandelt.
Im ersten Schritt übersetzt der Compiler den von Ihnen geschriebenen C++-Quellcode direkt in den äquivalenten Maschinencode. Der Compiler geht Schritt für Schritt durch den Quellcode und verwendet sozusagen ein Wörterbuch, um bestimmte Anweisungen in C++ durch fest definierten Maschinencode zu ersetzen. Die Datei, die vom Compiler nach getaner Arbeit erzeugt wird, heißt Objektdatei. Während C++-Quellcode normalerweise in Dateien mit der Endung cpp gespeichert wird, erhalten Objektdateien standardmäßig die Endung o oder obj.
Nun kann es sein – und das ist in der Praxis normalerweise immer der Fall – dass man im Quellcode auf Hilfsmittel zugreift, die man nicht selber programmiert hat, sondern wiederverwendet. Es wird beispielsweise eine Funktion aufgerufen, die von einem anderen Programmierer entwickelt wurde. Dieser andere Programmierer muss diese Funktion natürlich irgendwie zur Verfügung stellen. Dies geschieht normalerweise durch Bibliotheken. Eine Bibliothek ist nichts anderes als eine Datei, in der lauter Funktionen definiert sind. Eine Bibliothek muss hierbei nicht unbedingt als Quellcode vorliegen, sondern kann auch in Maschinencode zur Verfügung gestellt werden.
Wenn also die Funktion des anderen Programmierers aufgerufen wird, kann der Compiler nicht den dazugehörigen Quellcode übersetzen, weil diese Funktion nicht vorhanden ist. Der Linker merkt nun, dass zu der besagten Funktion der Maschinencode fehlt, und kopiert den entsprechenden Maschinencode aus der Bibliothek in die Objektdatei hinein. Hat der Linker den Maschinencode für alle Funktionen kopiert, die nicht in der eigenen cpp Datei stehen, erhält man eine ausführbare Datei. Diese Datei ist das fertige Programm in Maschinencode. Der Computer kann nun das C++-Programm ausführen.