Généralité sur le langage C++
Généralités sur le langage
Pourquoi apprendre C++
C++ est actuellement le langage de programmation dominant pour les logiciels scientifiques interactifs de large envergure. Que ce soit pour des applications en 3D et en graphique: Maya, 3DStudio, ZBrush, Houdini, Photoshop, Unreal Engine, etc., mais également dans de nombreux autres domaines: MS Word, Facebook, Tensor Flow, etc. possèdent tout un coeur (partie du programme réalisant les taches les plus critiques de calculs) codé en C++.
Notez que la plupart de ces logiciels possèdent des interfaces avec des langages de scripts de plus haut niveau afin de pouvoir être utilisés plus efficacement pour réaliser des prototypes (ex. Python, Lua, C#, etc.). Ces scripts ne sont cependant qu'un moyen de faire appel facilement aux fonctionnalités du coeur de ces logiciel qui sont codés pour leur part en C++. Ne négligez donc pas l'apprentissage du C++ si vous souhaitez être en mesure de pouvoir comprendre le fonctionnement de ces logiciels de manière approfondie.
Principes du C++
Principe généraux et comparaisons à d'autres langages
Le langage C++ est dit multi-paradigm. C'est-à-dire qu'il peut être utilisé dans une vaste gamme d'application, et suivant plusieurs approches (procédural, objet, fonctionnel, meta-programmation, etc.). C'est à l'heure actuelle l'un des seuls langages ayant un écosystème stable et complet permettant, d'un côté, de développer à très bas niveau en étant très proche du système d'exploitation/matériel (et donc très efficace), et d'un autre côté de proposer des abstractions de plus haut niveau quasiment sans aucun surcout en temps de calcul.
A titre de comparaison:-
- Java est largement utilisé dans le développement de logiciels de services de grande envergure. Mais son execution par le biais d'une machine virtuelle le rend moins adapté à une utilisation pour des applications temps-réels, et/ou associé à du calcul scientifique, et impose l'utilisation du développement objet.
-
- Python est le langage de haut niveau qui se développe largement pour le prototypage de calcul scientifique (numpy, scipy, pytorch, binding pour TensorFlow, etc.). Son absence de typage statique et son temps de calcul le rendent cependant moins adapté pour passer à l'échelle d'un logiciel de grande envergure, surtout si celui-ci doit s'exécuter en temps réel et/ou interagir avec l'utilisateur.
- - D'autres langages récents encore en cours de développement (Rust, Julia, nim, etc.) possèdent pour certains les avantages de C++ sans en avoir les inconvénients, mais manquent encore de maturité (stabilité des instructions en fonction des versions, bugs du compilateur, etc) et d'environnements de développement avancé permettant une utilisation dans le cadre industriel.
Le pendant de la richesse du langage C++ est cependant sa complexité. Il n'existe ainsi pas une unique manière de coder en C++ (utilisation de pointeurs à la C, pur objet, fonctionnel, etc); chaque approche pouvant se prêter plus ou moins à un type d'application ou d'habitude. Le C++ est un langage très technique difficile à lire et à écrire de par la précision et la rigueur nécessaire à l'écriture du code associé (type de variable, positionnement en mémoire, template, etc.).
Dans le cas présent, nous utiliserons principalement une programmation procédurale, où les objets seront généralement de petites structures allouées statiquement afin de pouvoir être créées et manipulées de manière légère (en mémoire) et rapide (en temps de calcul). Nous utiliserons les surcharges d'opérateurs pour modéliser et manipuler aisément des objets mathématiques (vecteurs, matrices). Nous utiliserons également largement les conteneurs de la librairie standard permettant de gérer des objets dynamiques sans avoir à manipuler explicitement les allocations mémoires, ainsi que les instructions du C++ dit "moderne" (norme C++14 ou supérieur) qui permet une écriture plus succinte et lisible de certaines instructions.
A l'opposé, nous n'aborderons dans ce cours pas (ou que très marginalement) la gestion manuelle de la mémoire, l'utilisation de pointeurs, le polymorphisme, et l'écriture de templates.
Notion de langage compilé
C++ est un langage dit "compilé". C'est-à-dire que le code C++ est converti en code assembleur qui peut être directement exécuté par le processeur central (CPU) dans un fichier binaire dit "exécutable". La compilation peut être une opération longue. Par contre, une fois celui-ci compilé, l'exécution est généralement beaucoup plus rapide que l'exécution d'un langage interprété.
C++ est un langage dit "typé statiquement" (à l'opposé des langages de scripts dits "dynamiques"). Toute variable doit avoir un type fixe connu au moment de la compilation, et ce type ne peut pas varier au cours de la durée de vie de la variable.
Le typage des variables implique d'être rigoureux lors de l'écriture du code. Cette plus grande rigueur permet cependant au compilateur d'être plus précis pour détecter les erreurs (avant même l'exécution du programme) et garantir automatiquement la cohérence globale du code (ex. passage de données ayant un type cohérent d'une fonction à l'autre, etc.). Bien que plus contraignant à écrire dans un premier temps (par rapport à un langage de script), le typage statique est souvent indispensable pour le développement de logiciels de grande envergure (100aines-milliers - millions de lignes de codes).
Références
Pour approfondir vos connaissances en C++, il vous est possible de vous référer au cours INF442 qui aborde davantage de détails sur le langage, ainsi qu'au livre "The C++ Programming Language" de Bjarne Stroustrup (créateur du langage C++).
De manière générale, n'hésitez pas à chercher des informations sur la référence en ligne du langage ainsi que de sa bibliothèque standard : CPP Reference.