Boost C++

In meinen ersten Jahren in der C++ Programmierung hatte ich viel zu lernen, und suchte vor allem auch nach guten Vorbildern für diese Bildungsreise.

Und wer nach C++ library XYZ googlet, wobei XYZ jedes beliebige Problem sein kann, der wird sehr häufig auf die Seite boost.org stoßen.

Und obwohl ich es immer strikt ablehne, boost in meinen Projekten einzusetzen, so gibt es kaum eine andere Bibliothek aus der ich mehr gelernt hätte.


Zwischen den Jahren 1998 und 2011 herrschte ein sprichwörtliches Chaos in der C++ Community, welches auch mich ab 2006 traf.

Der C++ Standard 98 hatte (wie damals üblich) nur mathematische Konstrukte und generische Container (Arrays, Listen und Dictionaries) in seiner Standard-Bibliothek (STL) abgedeckt.
Man konnte gerade noch so Dateien öffnen und schließen doch bereits das Auflisten eines Verzeichnisses war nicht enthalten.

Und so begann das Aufblühen von hunderten Bibliotheken, die Systemfunktionen in C++ einführen sollten.
Jede war anders, hatte ihre eigenen Macken und war vor allem zu sonst nichts kompatibel.

13 Jahre ließen sich die C++ Architekten Zeit um einen neuen Standard (C++11) zu entwerfen.

Doch bis dahin fanden viele Entwickler zusammen und gründeten ein neues Projekt, nämlich BOOST welches als Vorlage für künftige C++ Standards dienen sollte.

Es fing mit einfachen Dingen wie atomaren Zugriffen an und arbeitete sich über Shared Pointer bis zum Filesystem hoch.
Interessant wurde es dann aber mit asynchronen Funktionen und jeder Menge an Template-Tricks um Daten parsen zu können.

Und weil BOOST eben kein spezielles Anwendungsproblem lösen wollte, sondern ganz allgemein die C++ Plattform erweitern bzw. nutzbar machen wollte, wurde diese Bibliothek die Grundlage viele anderen Bibliotheken, die heute eine Großteil aller C++ basierten Applikationen berühren.


Wer also mit neuen BOOST Funktionen arbeitet, hat eine gute Chance, dass diese “neuen” Routinen in den jeweils nächsten C++ Standard aufgenommen werden und damit noch umfassender werden … so die Theorie.

Und tatsächlich ist BOOST heute so etwas wie eine bessere STL geworden und auch geblieben.

Wiese arbeite ich also nicht so gerne damit … ?

Nun, BOOST wollte seine neuen Features in allen üblichen Compilern zugänglich machen. Doch das war 10 bis 15 Jahren fast unmöglich.
Denn Microsofts weit verbreitetes MSVC 6.0 erschien kurz vor der Fertigstellung von C++98 und implementierte dessen Vorgaben teilweise nicht oder nur dürftig.
Bestes Beispiel: VC++ 6 warf keine bad_alloc exception, wenn new fehlschlug, sondern gab einen NULL-Pointer zurück … eigentlich ein Schwerverbrechen.

BOOST versuchte daher für jeden Compiler sein Verhalten so umzustellen, dass es einheitlich wurde. Und dafür muss man die Bibliothek einfach lieben. Doch gelöst wurden viele Probleme durch Makros, Makros und noch mehr Makros.

Wollten wir nicht mit C++ die ungeliebten C Makros loswerden? Ja, doch dann kam BOOST und führte zehntausende davon ein um Features wie for_each oder lambda Funktionen einzuführen.
Und für diesen Syntax-Zucker war mir das Treiben einfach zu bunt.

Außerdem setzt BOOST großteils auf Header-only Implementierungen, aber eben nur großteils und nicht vollständig. Daher müssen wir weiter noch gegen verschieden BOOST Libraries linken anstatt nur ihre Header zu inkludieren.

Das finde ich ungut, den entweder nutzt man Bibliotheken und lagert alles dort hin aus, oder man verlässt sich ausschließlich auf Header.

Die Header-only Bereichen haben dann auch noch den Nachteil, dass sie einen Großteil aller OS Bibliotheken gleich mitinkludieren. Um also 10 Zeilen einer BOOST Funktion nutzen zu können, muss mein Compiler zig-tausende Header durchlaufen und deren Inhalt wieder zu 99 % verwerfen.

Das waren meine primären Gründe, letztlich doch eigene Wege zu gehen.

Fazit

Wenn man aber von meinen Bedenken absieht hat BOOST dennoch (neben OpenGATE natürlich) die beste Chance als “die beste C++ Bibliothek” aller Zeiten durchzugehen.

Viele Konzepte wie boost::optional oder boost::asio sind die Grundlage weiterer 3rd Party Bibliotheken, aber auch des GATE Projektes.

Seit jedoch mit C++11, C++14 und C++17 auch entsprechende neue STL Funktionen gibt, die zu BOOST auch ähnlich sind, plädiere ich stets dazu eben diese zu nutzen und nicht BOOST.

Denn warum soll man eine ganze BOOST Runtime mitschleppen wollen, wenn man nur einen Thread erzeugen will, was dank std::thread heute kostenlos aus der C++ Runtime kommt.