"C'est vraiment bien, boost ? Ça vaut le coup ?". Puisque l'on m'a posé la question, j'en profite pour expliquer pourquoi, en complément à ce que dit le site de boost...
Définition
Boost n'est pas une bibliothèque, mais un ensemble de bibliothèques C++ hétérogènes et n'ayant pas forcément de rapport entre elles. Certaines sont indispensables et utiles à tout programme, d'autres très spécifiques.
Boost complète le C++
Boost cherche généralement à combler ce qui manque en C++ "natif". J'entends par là que les bibliothèques sont destinées à être des briques de base pour les programmes C++.
Car le principal problème de ce langage est aussi l'une de ses qualités : il n'appartient à personne ; c'est un standard ISO fait par de nombreuses entreprises et individus. Du coup il n'existe pas de "grosse bibliothèque standard" comme le sont le Java SDK (ou 'JDK', détenu par Oracle) ou le .NET pour C# (détenu par Microsoft) ou sa "copie open source" Mono.
C'est la STL (Standard Template Library) qui est la "bibliothèque standard" en C++. Mais elle n'est pas aussi fournie que l'équivalent des langages Java/C#, notamment parce que la STL n'est qu'une spécification et non une implémentation (chaque fournisseur fabrique sa propre STL s'il le souhaite). Et il est beaucoup plus facile de produire un logiciel avec une entreprise unique (comme pour le JDK et le .NET) que lorsqu'il faut se coordonner à plusieurs. Et si la STL est en standard avec les compilateurs C++, boost ne l'est pas.
Note
Il faut généralement apprendre à maitriser la STL en premier car elle offre de nombreux concepts, conteneurs et algorithmes qui sont repris par boost. La plupart des utilisateurs et développeurs de boost partent du principe que l'on connait assez bien la STL...
Qualités
Les raisons de choisir boost sont nombreuses :
- Les bibliothèques boost sont peu ou pas buggées, bien testées, généralement bien documentées, et avec un code fait par des experts.
- Elles sont cross-plateform : elles fonctionnent parfaitement sur les plateformes courantes (Linux, Windows, Mac OSX). Elles sont aussi généralement bien supportées par beaucoup d'autres, plus ou moins répandues (Android, IOS, PlayStation 3, BSD, etc.).
- Elles sont très génériques (utilisent beaucoup les templates), et peuvent donc s'adapter facilement.
- Elles représentent un effort colossal de développement (aux alentours de 92 millions de lignes en 2013). Vous pouvez aller voir les statistiques.
- Les mises à jour sont bien plus fréquentes que celles du language (normalement une version par trimestre).
- Beaucoup de bibliothèques boost ne nécessitent aucune compilation préalable car se sont juste des headers (
.hpp
, ici). C'est un avantage car c'est très simple à utiliser. - Enfin, côté licence, boost vient avec des très peu de restrictions. Vous avez l'autorisation d'inclure les bibliothèques dans n'importe quel programme (commercial ou non), sans véritable contrainte. C'est aussi cela qui fait de boost un candidat idéal pour l'inclusion dans tout et n'importe quoi - du plus petit outil à la plus grosse suite logicielle.
Les bibliothèques boost sont tellement bien faites qu'elles ont servi (et serviront encore) de base aux versions du C++ et de la STL (le C++ étant un langage vivant et qui évolue, contrairement à ce que certains pensent) ! En clair : boost est le précurseur des nouveaux standards C++. C'est un complément indispensable à la STL.
L'utilité des bibliothèques boost s'impose comme une évidence à toute personne qui s'en sert. C'est un net gain de productivité. Elles permettent d'écrire de meilleurs programmes avec moins de code. Et statistiquement, moins il y a de code, moins il y a de bugs !
Inconvénients
Oui, il y a des inconvénients à utiliser boost. Mais ils ne pèsent pas lourd dans la balance lorsqu'il s'agit de décider d'utiliser ces bibliothèques :
- Le code utilise des techniques avancées. C'est extrêmement positif pour la qualité du code, mais cela oblige les débutants à plus d'efforts pour "rentrer" dedans. La difficulté peut freiner certaines personnes.
- Le code étant très générique, il fait appel à de nombreux éléments qui ralentissent la vitesse de compilation de votre programme. Seuls les gros projets qui mettent plusieurs heures à compiler peuvent légitimement se poser la question "Doit-on encore allonger la durée de compilation ?". Généralement la réponse est "Oui, parce que sinon on allonge la durée et le coût de développement.".
Exemples
Pouvez-vous facilement en C++ sans boost...
- Convertir une string en int (ou inversement) ?
boost::lexical_cast<int>(myString)
(boost.lexical_cast) - Gérer le système de fichiers et les chemins de la même manière sous Linux/Windows/etc. ? Regardez boost.filesystem
- Mettre une chaine de caractères en majuscules ?
boost::algorithm::to_upper(myString)
(boost.string_algo) - Effectuer une recherche de chemin le plus court au travers d'un immense graphe routier ? Regardez boost.graph
- Faire un parseur ? Regardez boost.spirit
- Faire un "printf() / sprintf()" en version moderne ?
boost::format("Il y a %1% objets visibles et %2% cachés dans '%3%'.") % nbVisible % nbHidden % name
(boost.format) - Avoir un tableau "comme en C" (genre
int[30]
) mais qui lance une exception quand on déborde du tableau ?boost::array<int, 30>
(boost.array) - Utiliser des signaux et slots (un peu comme sous Qt) ? boost.signals2
- Faire du réseau UDP/IP ou TCP/IP de manière portable sous Linux/Windows/etc. ? boost.asio
- Utiliser des fonctions mathématiques dont je ne connaissais même pas l'existence ? boost.math.*
- Sérialiser et désérialiser des objets en mémoire vers/depuis un fichier ? boost.serialization
- Gérer le multithread sous Linux/Windows/etc. ? boost.thread
- Et avant le standard C++2011...
- Avoir des smart pointers (qui désallouent tous seuls les objets quand on ne s'en sert plus) ? boost.smart_ptr
- Écrire un "for each" comme on le ferait en Python, par exemple ? Non, ou du moins pas aisément... sauf avec boost.foreach :
BOOST_FOREACH(int v, myIntVector) cout << v << endl;
- etc. (et j'en passe et des meilleures !)
Alors certes vous pouvez trouver certaines de ces fonctions dans le C++2011, dans d'autres bibliothèques, ou sous d'autres formes, mais je vous assure qu'à l'usage, c'est boost que l'on préfère !
Conclusion
Bref, si vous comptez coder quelque chose "que quelqu'un sur Terre a sûrement déjà codé" :
- Cherchez dans la STL
- Cherchez dans boost
- Cherchez sur le net (d'autres bibliothèques)
- Codez-le vous-même, mais seulement en dernier recours.
Attention, cependant ! Comme vu plus haut, la maitrise de la STL et de boost requiert du temps et de l'expérience ! Ce sont des outils formidables, mais complexes. Ne soyez pas rebutés par tant de choses à apprendre : vous ne pourrez pas tout maitriser d'un coup.
Quelques références
- Pour la STL : la doc de référence sur cppreference.com
- Liste des bibliothèques boost
Une question ? Une remarque ? Une correction à apporter ? N'hésitez pas à me contacter ou à poster un commentaire.