Blog 5 Min. Lesezeit

Der Weg zur fünften Generation von C++

Diesen Artikel teilen
The Road to the Fifth Generation of C++

Seit seiner Entstehung hat sich C++ kontinuierlich weiterentwickelt und zahlreiche wichtige Meilensteine erreicht – von C with Classes bis zum Aufkommen der neuen Standards. Was wird der nächste Schritt in der Entwicklung von C++ sein? Sehen wir uns zunächst an, wie sich C++ im Laufe der Jahre entwickelt hat:

C++ der ersten Generation: C with Classes

Vor seiner ersten Standardisierung im Jahr 1998 wurde C++ seit 1979 von Bjarne Stroustrup bei Bell Labs als Erweiterung der Sprache C entwickelt. Sein Ziel war eine effiziente und flexible Sprache mit einer mit C vergleichbaren Performance.

1983 wurde „C with Classes“ in „C++“ umbenannt. Hinzu kamen neue Funktionen wie virtuelle Funktionen, das Überladen von Funktionsnamen und Operatoren, Referenzen, Konstanten, typsichere dynamische Speicherverwaltung (new/delete) sowie eine verbesserte Typprüfung.

Hier ist ein Codeausschnitt aus der ersten Generation:

WriteFraction(n) long n;
{
   unsigned short i, low, digit; unsigned long k;
   putchar(n < 0 ? '-' : ' '); n = abs(n);
   putchar((n>>fractionBits) + '0'); putchar('.');
   low = k = n << (longBits-fractionBits); /* align octal point at left */
   k >>= 4; /* shift to make room for a decimal digit */
   for (i=1; i<=8; ++i)
   {
      digit = (k *= 10L) >> (longBits-4);
      low = (low & 0xf) * 10;
      k += ((unsigned long) (low>>4)) - ((unsigned long) digit <<   (longBits-4));
      putchar(digit+'0');
   }
}

Hier ist ein weiterer Codeausschnitt aus „Microsoft Word 1.1“, dessen Quellcode kürzlich demComputer History Museum zur Verfügung gestellt wurde.

c1

C++ der zweiten Generation: die OOP-Revolution

1989 erschien C++ 2.0, gefolgt von der aktualisierten zweiten Auflage vonThe C++ Programming Languageim Jahr 1991. Zu den neuen Funktionen von 2.0 gehörten Mehrfachvererbung, abstrakte Klassen, statische Memberfunktionen, const-Memberfunktionen und geschützte Member. 1990 wurdeThe Annotated C++ Reference Manualveröffentlicht; dieses Werk bildete die Grundlage für den späteren Standard. In den 1990er-Jahren wurde OOP sehr populär und viele Entwickler übernahmen dieses Paradigma. Herb Sutter bezeichnete die Einführung von OOP in seinemArtikelals Revolution:

Objektorientierte Programmierung gibt es mindestens seit den Tagen von Simula Ende der 1960er-Jahre. Doch erst in den 1990er-Jahren wurde OO zu einer Revolution und setzte sich im Mainstream durch. Warum gerade damals? Vor allem deshalb, weil unsere Branche immer größere Systeme entwickeln musste, die immer größere Probleme lösten und die stetig wachsenden CPU- und Speicherressourcen nutzten. Die Stärken von OOP bei Abstraktion und Abhängigkeitsmanagement machten den Ansatz zu einer Voraussetzung für wirtschaftliche, zuverlässige und reproduzierbare Softwareentwicklung im großen Maßstab.

C++ der dritten Generation: Generics und Metaprogrammierung

Templates wurden 1991 eingeführt. Zu dieser Zeit interessierten sich nur wenige C++-Experten für das Paradigma der generischen Programmierung, und es gab nur wenige Veröffentlichungen dazu.

Alexander Stepanov war ein wegweisender C++-Experte, der die Möglichkeiten der generischen Programmierung erforschte, um einen modernen Ansatz für die Entwicklung von C++-Projekten zu schaffen.

Hier ist ein interessantesDokumentmit dem Titel „Algorithm-Oriented Generic Libraries“, das 1993 von Alexander A. Stepanov und David R. Summer veröffentlicht wurde.

So erläutern die Autoren die Motivation in diesem Dokument:

We outline an approach to construction of software libraries in which generic algorithms (algorithmic abstractions) play a more central role than in conventional software library technology or in the object-oriented programming paradigm. Our approach is to consider algorithms first, decide what types and access operations they need for efficient execution, and regard the types and operations as formal parameters that can be instantiated in many different ways, as long as the actual parameters satisfy the assumptions on which the correctness and efficiency of the algorithms are based. The means by which instantiation is carried out is language dependent; in the C + + examples in this paper, we instantiate generic algorithms by constructing classes that define the needed types and access operations. By use of such compile-time techniques and careful attention to algorithmic issues, it is possible to construct software components of broad utility with no sacrifice of efficiency.

Dank der Bemühungen und der bemerkenswerten Arbeit von Alexander Stepanov, David Musser, Meng Lee und dem C++-Standardisierungskomitee erschien 1994 die erste Version der STL.

Die STL war für C++-Entwickler ein echter Fortschritt. Sie bot zahlreiche nützliche Möglichkeiten zur Modernisierung von C++-Code und sorgte dafür, dass sich die Implementierung von Algorithmen in C++ deutlich von ihren C-Pendants unterschied.

1998 wurde einVorschlag für eine Website als C++-Bibliotheksrepositoryvon Beman G. Dawes veröffentlicht, aus dem Boost hervorgehen sollte.

Boost ist eine Sammlung von Bibliotheken für die Programmiersprache C++, die unter anderem lineare Algebra, Pseudozufallszahlengenerierung, Multithreading, Bildverarbeitung, reguläre Ausdrücke und Unit-Tests unterstützt. Sie umfasst mehr als achtzig einzelne Bibliotheken.

C++ der vierten Generation: die neuen Standards

Von 1991 bis 2011 entwickelte sich die Sprache nur langsam weiter; wichtige Neuerungen kamen vor allem aus Bibliotheken wie STL und Boost. Ab 2011 wurden zahlreiche Funktionen direkt in den Standard aufgenommen: C++11, C++14, C++17 und das damals bevorstehende C++20.

Hier ist ein Codeausschnitt aus der Folly-Bibliothek, die zahlreiche Funktionen der neueren Standards intensiv nutzt.

c0

C++ der fünften Generation: der Bruch mit Altlasten

C++ entwickelt sich derzeit sehr schnell. Viele interessante neue Funktionen kommen hinzu, während andere als veraltet eingestuft werden. Vielleicht ist nun die Zeit gekommen, bestimmte Sprachmerkmale ganz zu entfernen – selbst wenn dadurch bestehender Code nicht mehr kompatibel ist.

Bislang hat sich das Standardisierungskomitee dafür entschieden, keine inkompatiblen Änderungen an bestehenden C++-Funktionen vorzunehmen. Dieser Ansatz könnte sich jedoch in naher Zukunft ändern. Ein kürzlich aktualisierterVorschlagbefasst sich mit der Stabilität der Sprache und versucht, folgende Fragen zu beantworten:

  • Ist C++ eine Sprache mit spannenden neuen Funktionen?
  • Ist C++ eine Sprache, die für ihre langfristig hohe Stabilität bekannt ist?
  • Sind wir der Meinung, dass der Umstieg auf eine neue Sprachversion mühelos sein sollte?
  • Wenn ja, wie lässt sich ein müheloses Upgrade mit der praktischen Notwendigkeit vereinbaren, die Sprache weiterzuentwickeln?
  • Wenn wir stattdessen Stabilität über alles stellen, sind wir dann zwangsläufig zu langsamen Fortschritten verdammt und nehmen Änderungen nur vor, wenn wir sicher sind, dass sie korrekt sind und nie wieder korrigiert werden müssen?

Der Vorschlag enthält folgende Empfehlung:

Das Komitee sollte bereit sein, Entwurf und Qualität von Vorschlägen zu berücksichtigen, selbst wenn diese bei bestehendem Code zu Verhaltensänderungen oder Kompilierungsfehlern führen können.

Vielleicht wird die fünfte Generation den Bruch mit den Altlasten von C++ vollziehen, indem einige der von C geerbten historischen Sprachmerkmale entfernt werden.

Diesen Artikel teilen