C++, un langage système et d'applications rapides
Le langage C a été doté d'objets pour faciliter la représentation des entités à traiter, et la réutilisation du code. Cela a permis de transformer ce langage système créé en 1972, en un langage de plus haut niveau, le C++.
D'autres capacités ont été ajoutées avec le temps comme les templates, les tuples, la concurrence.
C++ a été créé en 1981 par Bjarne Stroutstrup, qui avait découvert l'orientation objet dans Simula 67 et voulait l'ajouter au langage C tout en restant compatible avec lui et ainsi conserver ses avantages, notamment la portabilité entre systèmes.
Sa conception obéit à un ensemble de règles:
- Il est défini en fonction des problèmes qui se présentent et y répond immédiatement.
- Il est plus important d'apporter des capacités que de prévenir un mauvais usage du langage.
- Les types créés par l'utilisateur sont aussi performants que les types prédéfinis.
- Les performance ne sont pas pénalisées par des fonctions inutiles.
- Il ne doit pas y avoir de langage intermédiaire entre C++ et le code natif.
Le premier standard ISO pour le langage C++ date de 1998, c'est C++ 98. Une nouvelle version lui a succédé en 2011, c'est C++ 11. Avec cette version qui n'apporte rien quand à la lisibilité et la modernité, le langage s'ancre dans son rôle d'outil système dont il a été détourné un temps.
La complexité croissante de C++ avec les versions 11, 14 etc.. a été critiquée notamment par Donald Knuth et Edsger Dijkstra. Le concepteur lui-même n'est pas satisfait des fonctions ajoutées au cours du temps à la syntaxe du langage et il fait une fois allusion à l'histoire du Vasa, un bateau suédois auquel on a ajouté tant de choses qu'il a coulé dès les premiers mètres. Bjarne Stroustrup:
A l'intérieur de C++, il y a un langage plus simple et plus clair qui se bat pour émerger.
C++ est utilisé comme langage d'application grâce à des interfaces graphiques comme Qt et GTK ou avec des moteurs 3D comme Unreal Engine. Il est clair qu'il a été conçu pour optimiser les performances de l'ordinateur et certainement pas la productivité du programmeur. Les erreurs qui arrivent inévitablement avec sa syntaxe hard-core et peu lisible se paient cher en temps de déboguage. Utilisé là où il convient, pour des outils systèmes, il apporte des avantages indéniable sur C, tels que le RAII, dont on parlera plus loin.
Exemple de code: Afficher les caractères d'une chaîne.
string s = "demo" + "suffixe";
int l = s.length();
for(int i = 0; i < l; i++) {
char c = s[i];
printf("%c\n", c);
}
Bref historique du langage
- En 1979, Bjarne Stroutstrup prépare une thèse en doctorat d'informatique et découvre Simula 67.
- Il commence alors à travailler sur un langage nommé C with Classes. Le but est de profiter de la rapidité et la portabilité de C en lui ajoutant l'orientation objet.
- En 1981, le langage ajoute à C les classes, l'héritage, les fonctions inline, l'argument par défaut aux fonctions. Son compilateur s'appelle CFront mais il se contente de traduire le code en C.
- En 1983 le langage est renommé C++. Il supporte les fonctions virtuelles, la surcharge des fonctions, les références avec &, les méthodes constantes, le symbole // pour un commentaire d'une ligne.
- En 1985 est publié le premier livre décrivant le langage: "The C++ Programming Language".
- En 1989, sont ajoutés les membres static et protected, l'héritage multiple.
- En 1990 apparaît le compilateur Turbo C++ (de Borland) accompagné de bibliothèques essentielles.
- En 1998 est définit le premier standard ISO.
- Sont ajoutés ensuite les templates, les exceptions, les espaces de noms, le type bool.
- En 2003 le standard est révisé.
- En 2011, après 6 années de travail et de retard, apparait un nouveau standard. Il ajoute une boucle for in, la concurrence, les variables dynamiques avec le mot auto.
- En 2014 est prévu un nouveau standard ISO.
Les objets de l'activité formalisés
C++ décrit des classes dans les fichiers d'en-tête, et le
corps des méthodes dans les fichiers source. En déclarant
des instances de classes vous pouvez réutiliser les ensembles de
variables et méthodes sans avoir à les déclarer de
nouveau.
La surcharge des fonctions permet de les déclarer avec des paramètres
différents mais avec le même nom.
Les classes héritent les unes des autres et partagent leurs méthodes. L'héritage multiple lui est propre, cela n'a pas été repris dans les langages dérivés.
Au cours du temps, la définition de struct a évolué au point de devenir l'équivalent de celle d'une classe, avec la différente qu'une structure est publique par défaut alors qu'une classe est privée par défaut. Les structs peuvent être dotées de méthodes et supporter l'héritage et en fait, on peut se passer des classes entièrement dans un programme orienté objet.
Ce modèle conceptuel est critiqué par Trygve Reenskaug, l'inventeur du MVC et du DCI, qui le trouve trop statique et peu adapté à la réalité d'un traitement pour lequel la représentation des objets devrait varier en fonction du contexte. Mais ce défaut est partagé par tous les langages orientés objet actuels sauf peut-être par ceux comme Go qui remplacent l'héritage par la composition.
Gestion mémoire
C++ a introduit le RAII (Resource Acquisition Is Initialization), un principe selon lequel, quand un objet est créé et donc une zone de mémoire est requise, celle-ci sera libérée automatiquement lors de la destruction de l'objet. Cela dispense d'un garbage collector et de l'instruction free du langage C.
La ressource peut être un objet, une classe, une instance de fichier. Elle est déclarée dans un scope et libérée quand on sort du scope.
C++11
Le nouveau langage C++ est amélioré, nous dit Bjarne Stroustrup, son créateur, selon trois plans:
- Le langage.
- La bibliothèque standard.
- La concurrence.
La définition du standard a été approuvée le 25 mars 2011 par le comité C++ ISO.
Le format interne UTF-8 est maintenant supporté pour les chaînes de caractères.
Nouveaux types et mots-clés
- auto
Le type de la variable se déduit de ce qui est assigné.
Exemple:vector<string> v = {"Alicia", "Bea", "Clara", "Dara" }; for (auto x : v) cout << x <<'\n';
- constexpr
Une expression constante. - nullptr
Un mot réservé pour un pointeur nul.
Ex:
char *x = nullptr;
- littéral brut de chaîne (raw string).
Des chaînes où les codes d'échappement ne sont pas interprétés, comme entre guillemets simples en PHP.
Elles ont le préfixe R. - decltype
Mode d'utilisation du type dans une expression, retourne le type et les modifieurs de tout objet y compris une fonction. - Litéraux UTF 8
u8"Un text quelconque".
On utilise u pour l'UTF16 et U pour l'UTF 32.
Sécurité sur les types
- Contrôle de l'alignement des valeurs.
- Contrôle des valeurs par défaut.
Nouvelles constructions
Boucle For sur un intervalle.
Comme cela est implémenté sur la plupart des langages de script.
int arr[5] = {2, 8, 21, 56, 995};
for (int &x : arr) {
printf("%d\n", x);
}
Comme on peut le voir, le langage conserve le principe du code source minimal. Il n'utilise pas le mot-clé in comme le font la plupart des langages, mais est plutôt un symbole.
Une tradition qui est née à l'époque où l'on économisait chaque caractère pour réduire la taille du code! La mémoire coûtait cher en 1972...
Fonction lambda.
Fonctions définies et utilisées sur place de façon contextuelle et éphémère.
rvalue
C'est un mode de référence au contenu d'une variable qui consiste à assigner à A le contenu de B sans le copier mais en déplaçant le pointeur sur le contenu, dans la perspective ou B n'est plus utilisée.
Modèle "variadic".
Template dont le nombre d'arguments est variable.
Assertion statique
Introduite avec le mot-clé static_assert, elle teste la validité d'une assertion à la compilation.
Enumération typée et avec scope
Les classes
Délégation et héritage des constructeurs. Le constructeur d'une classe peut appeler le constructeur d'autres classes.
Les attributs de classes pourront être assignés directement dans la définition de la classe.
La bibliothèque standard
De nouveaux objets apparaîssent qui sont devenus familiers dans les langages de scripts tels que PHP.
- regexp
Expressions régulières - tuple
Propre au langage Python. - array
Tableau statique. - unordered_map
Table de hâchage. - date.
- smart pointer
Pointeur malin;
Plus divers composants de librairies et améliorations. Par exemple on peut maintenant assigner statiquement une liste à un vector dans sa déclaration.
La concurrence
Les threads multiples avec mémoire partagée sont faciles à utiliser. On crée une fonction et on l'appelle grâce à un pointeur de fonction avec la commande thread...
#include <thread>
void f(int a) {
... code...
}
int main() {
...
thread t(&f, 1000);
t.join();
...
}
La commande join() démarre le thread.
La commande async appelle une fonction en mode asynchrone, quelque chose qui est devenu familier avec Ajax.
Caractéristiques de la concurrence sous C++11:
- Modèle de mémoire adapté aux ordinateurs actuels avec processeurs multi-coeurs.
- Thread ABI.
- Types atomiques.
- Mutexes et verrous.
- Stockage local de thread.
- Echange de messages asynchrone.
Outils et documents
- No Make. Compiler un projet C++ sans makefile.
- Visual C++. Visual Studio Community par Microsoft. IDE gratuit pour développer avec ou sans .NET.
- Qt Creator. IDE multi-plateformes basé sur le framework Qt. Un éditeur d'interface graphiques est intégré (cliquer sur les fichiers .ui).
- Eclipse. Interface graphique de développement et intégrateur d'outils avec un plugin pour C++. (Java).
- MingW. C'est la version pour Windows de GCC, le compilateur gratuit de la Free Software Fundation.
- CLang. Compilateur C, C++ et Objective C rapide, frontend à LLVM qui produit du code intermédiaire portable, lequel peut être converti en binaire ou JavaScript.
- Cling. Interpréteur pour C++, utilisant un JIT. Outil très utile pour apprendre le langage ou réaliser des scripts.
- C to C++. Convertit un projet de C en C++. (Python 2)
- Boost. Bibliothèques open source pour C++.
Objective C est une version de C orientée objet plus simple d'emploi que C++. GnuStep est un environnement de développement pour Linux et Windows.
La sécurité
C++ est un language qui donne une totale liberté au programmeurs, mais ce n'est pas un langage sûr. La NSA (National Security Agency) aux USA ne recommande pas son usage en raison des vulnérabilités possibles quand à l'utilisation de la mémoire. Les mécréants pourraient utiliser les failles qui apparaissent avec un langage flexible. Quand la sécurité est essentielle les organisations devront plutôt utiliser d'autres langages comme comme C#, Go, Java, Swift ou même Rust pour les masochistes.
Voir aussi: Les candidats successeurs de C++.