Vous avez décidé de vous lancer dans l'aventure C++ et nous vous en félicitons. Mais avant de démarrer votre apprentissage, il
est bon de lire ce qui suit afin de partir sur de bonnes bases.
Le C++ est un langage dit "libre", c'est-à-dire non propriétaire, et soumis à une standardisation par un organisme indépendant : l'ISO
(voir Le C++ est-il normalisé ?). Le but de ce standard est de permettre la portabilité d'un programme, moyennant la
recompilation de son code source. Le C++ est en effet conçu pour être compilé en un exécutable spécifique à une plateforme donnée.
On ne parle donc pas de script ni de commande C++, mais de code source et d'instruction. Le C++ n'est pas non plus un programme, un
environnement ou un éditeur de logiciel. Ainsi, on ne développe pas avec le C++ de Microsoft, mais en C++ avec le compilateur de Microsoft.
Ce langage a été initialement développé comme extension du langage C par Bjarne Stroustrup au sein de Bell Labs, au début des années 1980.
Ce dernier y a développé le premier compilateur C++ (nommé cfront), qui a évolué au fil du temps. Petit à petit, cette extension du C est
devenue un langage à part entière, réellement différent du langage C. Aussi, ne vous y méprenez pas : programmer en C++ ne se résume pas à faire du
C avec des classes, loin de là ! Ce sont deux langages très différents, qu'il faut distinguer. De plus, beaucoup de spécialistes s'accordent
à dire qu'il n'est pas nécessaire d'apprendre le C avant le C++, voire même qu'il ne faut pas apprendre le C.
Ce n'est qu'en 1998 que le langage C++ a été normalisé, soit une quinzaine d'années après le début de son développement. Or, la communauté
C++ était déjà très importante à ce moment, et la plupart des compilateurs actuels existaient déjà (dans d'anciennes versions) et ne
pouvaient donc pas respecter une norme postérieure à leur sortie. Chacun d'entre-eux évoluant indépendamment des autres, on fait donc une
distinction importante au niveau des compilateurs et de leur version, et non au niveau du langage (comme pour PHP4, PHP5, ...) qui reste
toujours le même (celui défini par la norme).
Cela implique deux choses importantes :
- Un code C++ valide vis à vis de la norme peut parfaitement ne pas compiler sur la plupart des compilateurs, car utilisant des possibilités
avancées du langage qui n'ont pas encore été implémentées.
- Un code C++ invalide du point de vue de la norme peut être accepté par certains compilateurs peu rigoureux
On peut néanmoins relativiser ces propos en précisant que dans l'ensemble, depuis quelques années, la majorité des compilateurs tend vers
une conformité élevée avec la norme, voire totale. C'est pourquoi il faut veiller à en utiliser une version récente.
Cette situation peut un peu être comparée à celle des navigateurs web. Bien que le HTML/CSS soient standardisés, chaque navigateur propose
des extensions qui lui sont propres, et ne respecte pas totalement le standard. Un code HTML valide peut donc produire un résultat différent
en fonction du navigateur utilisé. Plus le navigateur est ancien, plus il sera difficile de lui faire accepter un code aux normes.
A l'inverse, les navigateurs récents tendent à s'uniformiser autour des standards, et en implémentent de plus en plus de choses. En C++,
c'est un peu la même chose. Il est facile de lier son code à un compilateur en particulier, en profitant des extensions de ce dernier. Et
plus le compilateur est ancien, et moins il respecte le standard.
C'est pourquoi on fait une distinction entre ce qui est portable, et ce qui ne l'est pas (la notion de portabilité incluant la
compatibilité entre compilateurs).
Il existe un grand nombre de compilateurs. Certains sont Open Source (GCC, Open Watcom), et beaucoup d'autres sont commerciaux (Borland,
Comeau, HP, IBM, Intel, Microsoft, SGI, Sun, ...). Le C++ étant simplement une norme, il n'y a pas d'implémentation de référence, ni même
de site internet central comme c'est le cas pour des langages comme Python, Perl, ... Il n'y a donc pas non plus de documentation de
référence autre que la norme elle même (voir Où trouver de la documentation de référence sur le C++ ? et Où puis-je obtenir une copie de la norme ?).
Cette norme couvre deux aspects :
- le langage lui même, c'est-à-dire sa syntaxe, etc...
- la bibliothèque standard qui l'accompagne
Cette dernière est assez limitée au regard d'autres langages. En particulier en ce qui concerne l'interaction avec le système (afin de
faciliter son implémentation). Ainsi, on ne peut pas faire grand chose de plus que des opérations élémentaires sur la console et les
fichiers. La norme ne définit rien en ce qui concerne :
- la programmation réseau / internet
- le multitâche / la gestion de processus
- les interfaces graphiques
- le graphisme / multimédia
- etc...
Ceci explique en partie le manque d'empressement des développeurs de compilateurs à réaliser des outils qui respectent le standard à 100%.
Ils ont généralement préféré investir dans la réalisation de bibliothèques et d'environnements comblant ces lacunes. De ce fait, on peut
bien faire tout cela en C++, mais pas en C++ standard. Il faut avoir recours à des bibliothèques tierces, et pour chacun de ces domaines,
le C++ est richement fourni, très richement même.
Ainsi, il n'y a pas une manière de développer des interfaces graphiques en C++, mais des dizaines (voir Comment créer une interface graphique en C++ ?), et
aucune n'est standard.
On peut résumer les choses ainsi :
- ce qui est standard peut ne pas être portable à cause des anciens compilateurs encore utilisés. Mais un code standard est toujours
préférable dans la mesure où c'est au compilateur de s'adapter pour parvenir à le compiler, quelque soit la plateforme cible. Les
principaux compilateurs modernes vont dans ce sens.
- ce qui n'est pas standard peut malgré tout être rendu portable en adaptant le code pour qu'il compile sous plusieurs compilateurs /
systèmes. C'est donc au code de s'adapter au compilateur, ce qui revient parfois à écrire plusieurs fois la même bibliothèque (une version
pour Windows, une autre pour Linux...).
Sachez que la portabilité a un coût, notamment au niveau des fonctionnalités. Pour qu'une bibliothèque soit portable, on a intérêt à ce
qu'elle utilise le moins possible les spécificités d'une plateforme donnée. Par exemple, pour réaliser une interface graphique, vous pouvez
utiliser les MFC de Microsoft, uniquement avec le compilateur Visual C++ sous Windows. Ou alors vous pouvez utiliser Qt de Trolltech, qui
compile avec Visual C++, mais aussi Borland C++ Builder, GCC, ... sous Windows, UNIX/Linux ou Mac. Pour que cela soit possible, elle a
forcément fait l'impasse sur certaines spécificités de Windows absentes des autres OS (comme la base de registre...) alors que les MFC,
plus proches du système, y donnent accès de manière directe. Alors, des MFC ou de Qt, laquelle est la meilleure ? A vous de le dire,
en fonction de vos souhaits et de vos contraintes.
Les nombreuses bibliothèques tierces existantes se distinguent donc d'abord par le compromis qu'elles offrent entre portabilité et
fonctionnalités. C'est l'antagonisme entre ces deux notions qui guidera votre choix de l'une d'entre elle, ainsi que les critères de coût,
de pérennité, de documentation, etc...
Ayez donc bien à l'esprit ce qui est standard de ce qui ne l'est pas. Si vous demandez de l'aide à propos d'une bibliothèque C++ non
standard sur un forum dédié au C++ standard, il est parfaitement normal que personne ne sache répondre, bien qu'il s'agisse de C++.
Essayez de toujours vous orienter vers le forum le plus adapté à votre outil de développement.
|