Newsletter Developpez.com

Inscrivez-vous gratuitement au Club pour recevoir
la newsletter hebdomadaire des développeurs et IT pro

C++ serait-il vraiment victime de son passé ? Pour CoderGears Team
« le plus grand problème du C++ c'est son passé »

Le , par Amine Horseman, Expert éminent sénior
CoderGears Team revient avec une nouvelle analyse concernant le langage de programmation C++. Après avoir affirmé que C++ devra d’abord revoir son mécanisme d’inclusion pour devenir « vraiment un langage moderne », CoderGears Team estime aujourd’hui que « le plus grand problème du C++ c’est son passé »

Rappelons d’abord que la nouvelle norme du langage, sortie en 2011, avait reçu un accueil chaleureux de la part de la communauté C++. « Cependant, à cette année, ce langage avait un passé de plus de 30 ans. Et ce n’est pas facile de convaincre les développeurs que le nouveau C ++ simplifiera les nombreuses facettes frustrantes du langage », proclame l’équipe de CoderGears.

L’exemple donné est la gestion de la mémoire. Pendant de nombreuses années, on utilisait les deux mots clés: "new" pour allouer de l’espace mémoire et "delete" pour libérer l’espace alloué. Ce qui était contraignant surtout c’était qu’il ne fallait pas oublier de libérer la mémoire allouée manuellement. Chose dont les développeurs n’ont plus besoin d’y penser maintenant, puisque le Modern C++ encourage l’utilisation des pointeurs intelligents. Ce serait donc une bonne nouvelle, mais quel est le problème ? Selon CoderGears, le gêne est que « nous avons encore la possibilité d'utiliser new et delete, et bien sûr nous ne pouvons pas éliminer cette possibilité pour de nombreuses raisons » et ils expliquent que tous les efforts de la communauté C++ et les experts du domaine n’étaient pas suffisants pour changer les anciennes habitudes et que « si vous donnez à quelqu'un la possibilité de faire quelque chose avec un langage ou un outil, ne soyez pas surpris s'il le fait ».

Ils donnent aussi quelques exemples pour appuyer leur argument : « il suffit de chercher sur le Web "C++ object allocation" et regardez si le premier lien parle de pointeurs intelligents ». Sinon, « allez dans n'importe quelle bibliothèque universitaire, et demandez un livre C++, et vous trouverez que le chapitre sur l'allocation mémoire et la création des objets parle surtout des mots clés new et delete ».

En résumé : si un nouveau développeur veut apprendre le C++, il va trouver plus de ressources sur le "C avec des classes" que le "C ++ moderne".

Quant aux solutions, l'équipe de CoderGears est d'accord sur le fait qu'il n'y a pas de solution magique. Selon eux, nous pourrons faire en sorte que les compilateurs affichent des avertissements lors de l'utilisation de mots clés et fonctions obsolètes, « mais cette solution n'aura pas un grand impact », et elle conseille aux nouveaux développeurs qui veulent apprendre le C++ de considérer que le langage a changé son nom et s'appelle maintenant "Modern C++". En effet, cela donne un résultat nettement différent dans les recherches sur le web.

Source : CoderGears Blog

Et vous ?

Êtes-vous d’accord avec CoderGears ? Pourquoi ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de Epok__ Epok__ - Nouveau membre du Club http://www.developpez.com
le 28/11/2014 à 11:21
Je pense que le mécanisme d'inclusion de C++ est certainement la partie la plus archaïque de ce langage. Il est vrai que de devoir répéter à chaque fois le prototype de la fonction dans le .h, puis la classe d'appartenance dans le .cpp est très verbeux et assez couteux en temps, sans compter les redéclarations de classes à mettre en haut du .h pour chaque classe utilisée (j'évite les include non nécessaires car j'ai souvent eu des problèmes de déclaration circulaires).

A moins de mettre l'intégralité de la classe dans le .h, comme je l'ai déjà vu, ce qui me semble pas très propre, je ne vois pas de solution à l'heure actuelle.
Si ceci est nécessaire pour la compatibilité avec le C, il serait pourtant relativement aisé de s'en libérer, si le compilateur effectuait de par lui même une première analyse des classes nécessaires avant la compilation...
Ou alors, un mécanisme d'inclusion alternatif (indiquer quelle classe on utilise, mais pas en incluant un header), laissant le soin au comilo de faire les inclusions strictement nécessaires en générant dynamiquement un header ?

Après, il est possible qu'il existe des mécanismes de ce genre que je ne connais pas : je viens du C, j'utilise C++ depuis peu, et j'ai naturellement appliqué les méthodes que je connaissais...
Je les remplace peu à peu (j'aime le concept de nullptr de C++ 11 par exemple), mais j'ai des habitudes assez bien ancrées.

Pour les Smart pointers, je compte m'y mettre à terme, mais j'ai déjà eu du mal à dissocier la notion de malloc de celle de new, alors chaque chose en son temps !
Avatar de Laurent7601 Laurent7601 - Provisoirement toléré http://www.developpez.com
le 28/11/2014 à 11:37
Salut, il m'arrive encore d'avoir à utiliser new et delete dans certains cas, je ne penses pas qu'il faille supprimer ces mots clé, je prend un exemple :

J'ai une grille dynamique qui contient x * y * z cellules, qui contiennent des entités, et je veux delete la cellule lorsqu'elle ne contient plus aucune entité.

Je ne crois pas qu'un pointeur intelligent me permettrait de faire cela, tout du moins, pas sans devoir faire un release et puis un delete...

Donc bon pour les tableaux de pointeur dont certains pointeur peuvent être null, ont a encore besoin de du mot clé delete.

Pour le mot clé new, je ne sais pas par contre, je ne pense pas qu'on en aie encore réellement besoin..., mais bon, peut être que dans certains cas, il reste aussi nécessaire, et puis, beaucoup de bibliothèques utilisent encore le c++ 98.

PS : ou bien alors je peux me tromper, le pointeur intelligent delete peut être le pointeur si je le met à nullptr.
Avatar de ternel ternel - Expert éminent sénior http://www.developpez.com
le 28/11/2014 à 11:46
Dans ce débat inclusion/import, je me demande comment font d'autres langage intégralement compilés (dans ni Java, ni C#, ni python...)
Il faut bien au cours de la compilation associer des morceaux de codes séparés.

Cela sous-entend d'avoir un moyen d'écrire dans un morceau de code "ceci existe, et c'est là bas", tout en limitant la taille du code.
Jusque-là, on a des symboles externes (toutes les déclarations de fonctions, et les variables extern), qu'il faut déclarer manuellement dans l'unité de compilation pour pouvoir les utiliser.
Pour avoir des modules utilisables, il faudra quelque chose d'assez subtile/tordu pour ne pas changer l'aspect du code.
La force du C++, c'est que (quasiment) toutes les erreurs de code sont connues à la compilation, et garder cela avec les modules est difficile.
C'est d'ailleurs pour ca que ca prend du temps.
Ca et le fait de ne pas devoir briser les codes existant (même les récents)

@Epok__
Pour le malloc!=new, il y a une manière de voire les choses: T * var = new T(...); équivaut à peu près à T * var = malloc(sizeof T);*var=T(...);.
C'est à la fois l'allocation et l'initialisation de la mémoire. Un petit peu comme un calloc, mais en mieux, beaucoup mieux.
Il s'agit de respecter une règle simple "toute chose est construite ou n'est pas du tout".
Une valeur n'est ainsi pas allouée mais inconstruite.

C'est aussi pour cela qu'on ne doit pas coder une classe avec une fonction init() que l'utilisateur doit appeler. (hors le builder...)
Avatar de ternel ternel - Expert éminent sénior http://www.developpez.com
le 28/11/2014 à 11:49
De quoi parles-tu, Lolilolight?

Il n'est pas du tout question de supprimer ou non new et delete, mais de remplacer #include
Avatar de ternel ternel - Expert éminent sénior http://www.developpez.com
le 28/11/2014 à 11:50
Et aussi delete[] et les smart array pointers
Avatar de Errata Errata - Membre régulier http://www.developpez.com
le 28/11/2014 à 11:51
Citation Envoyé par Lolilolight  Voir le message
ou bien alors je peux me tromper, le pointeur intelligent delete peut être le pointeur si je le met à nullptr.

Tu as même mieux, une fonction "reset()" qui faire tout ça proprement.
Et pour ce qui est du tableau, std::vector<> fait très bien le boulot
Avatar de sizvix sizvix - Membre habitué http://www.developpez.com
le 28/11/2014 à 11:54
... devoir répéter à chaque fois le prototype de la fonction dans le .h

c'est, je trouve, une contrainte plutôt positive de faire un plan et de le suivre, et ça permet d'avoir un résumé clair de la classe, même si les IDE actuels permette d'afficher de tel prototypes facilement avec des classes dans d'autres langages.
Je suis sous java depuis quelques années maintenant ( je dois bosser sur du Java EE ) , et quand je lis du code C++ en passant par les .h puis .cpp , je m'y retrouve plus que dans une classe java .
Après, même si les IDE permettent d'afficher de tel résumé dans d'autres langages, ils peuvent, inversement, générer une base de tes fonctions depuis le prototype...

Pour ce qui est du passé, c'est sûr que les anciennes versions de C++ ont bien des différences avec le C++ actuel ( ont a eu un peu la même discussion sur Java ce matin, même si il y a moins de différences, c'est quand même plus efficace maintenant )

Pour ma part, les évolutions du C++ me donnent envie de m'y remettre.
Avatar de mintho carmo mintho carmo - Membre actif http://www.developpez.com
le 28/11/2014 à 11:55
Quand on a un projet de plusieurs milliers de classes et plusieurs millions de lignes de code, mulit plateformes, qui utilise des dizaines de libs différentes, difficile de changer du jour au lendemain tout le code. Rien que le fait de mettre a jour les compilateurs utilisés peut déjà pose des problèmes (mettre a jour un compilateur sur son poste personnel ne pose généralement pas de problème, mais mettre a jour l'ensemble des serveurs de build, pour toutes les versions prises en charge, cela devient compliqué)

Donc oui, forcement, un langage qui est plus ancien aura une base de code a maintenir, il sera plus difficile de casser la compatibilité du langage. Un langage nouveau n'aura pas ce problème, il n'a pas de code existant a préserver, il peut faire tous les choix sémantique qu'il veut.

Et le langage en soi n'est pas le problème, c'est bien l’incapacité des gens a faire évoluer leur pratique qui pose problème. Les pointeurs intelligents et le RAII existe depuis de nombreuses années.
Le problème des ressources d'apprentissage obsolète du C++ est surtout un problème français. Les bons ouvrages en C++ moderne sont courant en anglais (C++ Primer, PPPC++, Langage C++ ont été mis a jour) et les "vieux" experts du C++ sont les premiers a recommander d'utiliser du C++ moderne (citons par exemple Meyers qui vient de sortir Effective Modern C++).
Le pire, c'est probablement les ressources en français sur internet. Les principaux sites internet francophones ont des ressources obsolètes (developpez et sdz ont un article sur le C++11, qui ont été écrit avant la sortie de la norme et qui sont plus des résumés qu'un cours complet - et celui sur développez n'est pas complet. Et rien sur le C++14, voire les TS et le C++1z). Et on ne parlera même pas des cours debutants

@Lolilolight: reset() pour unique_ptr. Pour shared_ptr, il faut libérer tous les pointeurs pour que la ressource soit delete. Mais dans tous les cas, rien n'interdit a un pointeur intelligent d’être nullptr.
Avatar de Luc Hermitte Luc Hermitte - Expert éminent http://www.developpez.com
le 28/11/2014 à 11:55
En C++11, std::vector<std::unique_ptr<T>> libère automatiquement la ressource allouée.
En C++98, on avait boost::ptr_vector<T>.
En C++14, on aura make_unique en plus de make_shared. De fait, on pourra se passer de new également.

Bref, cela fait longtemps qu'un code lambda peut, et doit, se passer de delete. Et on va pouvoir étendre cette règle à new.

Pour un code de bibliothèque qui doit adresser des choses bas-niveau ou optimiser certaines choses (typiquement, vector n'est pas terrible pour coder des matrices à cause de la 0-initialisation), on doit garder l'accès à new et delete. Mais pour du code que l'on écrit tous les jours, ces mots clés fragilisent le code.

Et les développeurs de CppDepend ont parfaitement raison. Pour beaucoup le C++ est un C avec des classes, où l'on croit que la mémoire (et autres ressources) se gère à la main. Or, il n'y a rien de tel si on veut des codes non maintenables. Pour ceux qui n'avaient jamais entendu parler du C++ moderne, ou pourquoi il est important de renier le C++ historique, je renvoie à mon billet de blog, et à l'article (/démonstration) d'Aaron Lahman traduite par Alexandre Laurent.
Avatar de Luc Hermitte Luc Hermitte - Expert éminent http://www.developpez.com
le 28/11/2014 à 12:08
Citation Envoyé par leternel  Voir le message
Il n'est pas du tout question de supprimer ou non new et delete, mais de remplacer #include

Non, le sujet est le C++ moderne. Il y a eu une malheureuse référence à un précédent article de CoderGears sur les modules faite par notre chroniqueur, mais le sujet est bel et bien le C++ moderne.
Et donc de remplacer new et delete dans les moeurs.

Citation Envoyé par mintho carmo  Voir le message
a- Quand on a un projet de plusieurs milliers de classes et[...] mais mettre a jour l'ensemble des serveurs de build, pour toutes les versions prises en charge, cela devient compliqué)

b- [...] Les principaux sites internet francophones ont des ressources obsolètes (developpez et sdz ont un article sur le C++11, qui ont été écrit avant la sortie de la norme et qui sont plus des résumés qu'un cours complet - et celui sur développez n'est pas complet. Et rien sur le C++14, voire les TS et le C++1z). Et on ne parlera même pas des cours debutants

a- Mon gros problème, c'est quand on a des machines linux sous une version redhat/centos bien précise et stable, ce qui implique bien évidemment des compilateurs pré C++11. Et pour mettre à jour les compilos, il est préférable de d'abord mettre à jour les OS de dev et de production, et ça ... c'est pas envisageable.

b- Je ne classe pas le tuto V2 du sdzoc dans la catégorie "C++ historique". Certes, cela n'aborde pas le C++11. Mais dans l'ensemble, ce n'est pas du C++ historique -- ou du moins, il y a bien pire...
Pour le C++14, il y a eu des dépêches sur divers sites. Mais effectivement, pas de cours full C++14. Ce qui poserait un soucis pragmatique : les élèves seraient dans l'impossibilité de mettre en pratique ce qu'ils auraient appris dans nos SSII. Cela n'est possible que dans quelques très grosses boites ou dans du FOSS pour l'instant.
Offres d'emploi IT
H/F-Ingénieur système unix
Sogeti - Régions - Ouest - Pays de la Loire - OUEST
Consultant junior Crise et Affaires Publiques
I&E - Ile de France - Paris
Développeur.net (H/F)
Groupe Bel - Ile de France - Suresnes (92150)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Accueil