C++20 Concepts

Ein kurzer geschichtlicher Überblick über die Entwicklung der Programmiersprache und die Umsetzung von “Templates” und “Concepts” von Michael Hava

© iStock/mediaphotos
© iStock/mediaphotos

12.11.2020

Der berühmte Bjarne Stroustrup, der Erfinder der auch heute noch weit verbreitenden Programmiersprache C++, begann 1979 in den Bell Labs ursprünglich mit der Entwicklung von C with Classes. Sein Ziel war eine Programmiersprache, welche die Geschwindigkeit von C mit den für große Projekte notwendigen Organisationsfähigkeiten (= Objektorientierung) von Simula verbinden soll.

Aufgrund des großen Erfolgs beginnt Stroustrup kaum 10 Jahre später (1987) mit der Arbeit an einer Erweiterung der inzwischen in C++ umbenannten Sprache: Templates – dieses generische Konzept soll die Implementierung von generischen Klassen und Funktionen ermöglichen, und so nebenbei die aus der C übernommenen Präprozessor-Makros weitgehend ersetzen. Die Entwicklung dieser Templates beruhte im Wesentlichen auf drei Designzielen:

  • full generality: Templates sollen nicht auf einzelne Anwendungsfälle ausgerichtet werden, sondern für die breite Verwendung ausgelegt sein.
  • zero overhead: Mittels Templates erzeugter Code soll nach dem Kompilieren von handgeschriebenem Code (hinsichtlich Effizienz, Performance, etc.) nicht unterscheidbar sein.
  • good interfaces („constraints“): Ähnlich wie C++ die Typsicherheit im Vergleich zu C verbessert hatte, sollen auch generische Schnittstellen eine Verbesserung darstellen.

Ergebnis der Arbeit: Es scheint zum gegenwärtigen Forschungsstand unmöglich, alle drei Ziele gleichzeitig zu erreichen. Da die ersten beiden Ziele essenziell für die Akzeptanz von Templates sind, während Constraints „nur“ die Usability verbessern, werden Templates ohne ihnen zu C++ hinzugefügt. Constraints sollen so bald als möglich nachgeliefert werden.
 

Algorithmen werden auf algebraischen Strukturen definiert

1994 wird C++ (inzwischen auf dem Weg ein ISO-Standard zu werden) um die Standard Template Library (STL), einer Bibliothek für generische Algorithmen und Behälterklassen, erweitert. Sie ist das Ergebnis von Alexander Stepanovs fast 20-jähriger Forschung zum Thema generische Programmierung und unterscheidet sich fundamental von zeitgenössischen objektorientierten Ansätzen.

Am Anfang dieser Forschungstätigkeit stand 1976 seine Erkenntnis: algorithms are defined on algebraic structures. Basierend auf dem mathematischen Modell der algebraischen Strukturen entwickelte er Concepts [1], den zentralen Grundpfeiler von generischer Programmierung. Analog zu algebraischen Strukturen beschreiben Concepts die benötigten Operationen und unterliegenden mathematischen Axiome, welche ein Algorithmus an die zu verarbeitenden Daten stellt. Ziel der generischen Programmierung ist es, Algorithmen nur basierend auf den minimal notwendigen Concepts zu definieren und sie so für eine Vielzahl an konkreten Typen verwendbar zu machen.

Nach Experimenten in mehreren Programmiersprachen (Scheme, Ada, …) ist C++ die erste, welche in seinen Augen ausdrucksstark genug für generische Programmierung ist – auch wenn die fehlende Unterstützung für Concepts aufwändige Emulationen notwendig macht. Mit der Integration der STL in die Standardbibliothek wird auch die Idee von Concepts in C++ übernommen. Aus programmiersprachlicher Sicht stellen Concepts eine formale Repräsentierung von Constraints dar. Der Fokus für die Fertigstellung von Templates verschiebt sich in der Folge zu Concepts. Nichtsdestotrotz erscheint der erste C++ ISO-Standard 1998 (C++98) ohne Erweiterungen des Template-Systems, Concepts müssen weiterhin emuliert werden.
 

Keine Fertigstellung von Templates in Sicht

In den ersten Jahren nach C++98 fokussierte das Standardkomitee sich auf Fehlerbehebung und Stabilisierung. Daher nahm die Entwicklung von Concepts erst ab 2003 im Rahmen der Arbeiten am nächsten C++ Standard (C++0x) wieder Fahrt auf. Bjarne Stroustrup und Gabriel Dos Reis veröffentlichten eine Reihe von Papers über ein mögliches Concepts Design. Eine Forschungsgruppe der Universität Indiana veröffentlichte 2005 ebenfalls ihre Ergebnisse. Aus den beiden konträren Ansätzen entstand 2006 das gemeinsame Design der C++0x Concepts, welches 2008 in den Arbeitsentwurf des C++ Standards integriert wurde.

In den folgenden Monaten wurden allerdings einige Probleme am Design ersichtlich. Da die Fertigstellung des neuen Standards schon mehrfach verschoben wurde und davon auszugehen ist, dass die Fehlerbehebung zu weiteren Verschiebungen führen wird, entfernt das Standardkomitee Concepts 2009 wieder aus dem Arbeitsentwurf. C++11 erschien somit 13 Jahre nach dem ersten Standard immer noch ohne Fertigstellung von Templates.
 

Erste Concepts-basierte Bibliothek

Während den Arbeiten an C++14 entwerfen Bjarne Stroustrup, Gabriel Dos Reis und Andrew Sutton basierend auf den Erkenntnissen von C++0x Concepts bereits 2013 einen neuen Entwurf – Concepts Lite. Der zentrale Unterschied zum alten Ansatz: diesmal fokussiert man sich auf ein „minimales Feature“ [2], welches später bei Bedarf erweitert werden kann. Das Ergebnis ihrer Arbeit wird 2015 als Technical Specification (TS) [3] veröffentlicht.

Im Sommer 2017, vier Monate nach der Fertigstellung von C++17, werden Concepts basierend auf dem TS in den Arbeitsentwurf für C++20 integriert. Zusammen mit der Spracherweiterung wird eine Bibliothekserweiterung von vorgefertigten grundlegenden Concepts bereitgestellt. 2018 folgt mit Ranges, die erste Concepts-basierte Bibliothek – sie enthält unter anderem die mit Concepts überprüften STL-Algorithmen. C++20 wird im Februar 2020 verabschiedet und im September 2020 einstimmig angenommen.
 

Fußnoten

[1] Das implizite Pendant der generischen Programmierung zu den expliziten Interfaces aus der objektorientierten Programmierung.
[2] So fehlen unter anderem Sprachmittel zu Axiomen und Definitionschecks.
[3] Eigenständiges ISO Dokument das mögliche Erweiterungen für einen Standard enthält. Das Ziel ist Nutzerfeedback zu erhalten und eine (überarbeitete) Version des Inhalts in einen ISO Standard einzubringen.
 

Autor

Michael Hava MSc ist Senior Software Architect in der Abteilung Industrial Software Applications und Mitglied des C++ Standard Committee.

risc-software.at


zur Übersicht