Boost C++
« | 19 May 2019 | »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.