11.5.3 : C++



Le langage C++ se voulait initialement être une surcouche du langage C, apportant des capacités d'abstraction supplémentaires comme le support de la programmation orientée objet. Si la base commune des deux langages a légèrement divergé depuis, ils restent remarquablement compatibles, pour le meilleur (interfaçage extrêmement aisé des bibliothèques C) comme pour le pire (héritage de tous les défauts de conception du C).

La longue évolution du C++, à travers plusieurs décennies d'ajouts de fonctionnalités tout en préservant une grande compatibilité descendante, a conduit le langage à devenir très complexe. Le C++ moderne fournit ainsi, entre autres, la surcharge de fonction et d'opérateurs, un modèle de programmation objet basé sur l'héritage, des types génériques basés sur la génération de code spécialisé (les templates), un environnement d'exécution de code à la compilation, un support natif du parallélisme multi-thread, et un ensemble très complet quoique malcommode d'outils pour manipuler des types à la compilation.

Cette pléthore de fonctionnalités rend le langage extrêmement difficile à apprendre et maîtriser, d'autant plus que les fonctionnalités du langage ne sont pas conçues de façon irréprochable et interagissent de manière très complexe entre elles. En contrepartie, les experts C++ tirent parti de sa richesse pour produire des bibliothèques extrêmement expressives, offrant des fonctionnalités telles que l'optimisation automatique des calculs d'algèbre linéaire ou la vectorisation par intrinsèque indépendante de l'architecture matérielle cible.

Comme il est difficile de maîtriser la totalité du langage, les programmeurs C++ tendent à se spécialiser dans un sous-ensemble avec lequel ils sont à l'aise, ce qui complique l'interaction entre équipes indépendantes. Ainsi, il existe des équipes qui utilisent le C++ comme un C avec quelques fioritures, d'autres qui l'utilisent principalement pour ses fonctionnalités objet, d'autres encore qui l'utilisent principalement pour ses capacités de génération de code et d'exécution de travaux à la compilation et ces sous-communautés communiquent difficilement.

Le C++ permettant un contrôle matériel fin, il est possible, moyennant un certain effort, d'en tirer des bonnes performances. Cette combinaison de bonnes performances à de bonnes capacités d'abstraction en a fait un choix standard pour les grandes applications à fortes contraintes de performance. Mais sa complexité le réserve aux spécialistes qui sont prêts à lui dédier leur carrière, ce qui l'a aussi souvent conduit à être couplé avec des langages plus haut niveau comme Python ou Lua pour ouvrir certaines utilisations de bibliothèques C++ à des publics moins experts.

C'est une telle combinaison de "cœur de calcul" C++ avec une interface haut niveau en Python qui est couramment utilisée à l'IN2P3 aujourd'hui.

Le C++ est généralement compilé statiquement vers des binaires natifs, même si ROOT permet aussi de le compiler à la volée comme Julia.