IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Le C++ serait-il vraiment victime de son passé ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 194
    Par défaut Le C++ serait-il vraiment victime de son passé ?
    Le C++ serait-il vraiment victime de son passé ?
    Pour l’équipe CoderGears « le plus grand problème du C++ c’est son passé »

    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 ?

  2. #2
    Membre actif
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Août 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Août 2005
    Messages : 45
    Par défaut
    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 !

  3. #3
    Invité
    Invité(e)
    Par défaut
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Dev C/C++
    Inscrit en
    Octobre 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Dev C/C++

    Informations forums :
    Inscription : Octobre 2011
    Messages : 19
    Par défaut
    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

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    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.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    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.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Invité de passage

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    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.
    J'ai du récemment lire ce tuto, il y a beaucoup trop de choses qui vont pas dedans (trop de mauvaises pratiques héritées du C - même si effectivement, ce n'est pas le pire)

    Un cours full C++14 n'exclue pas d'apprendre aussi comment utiliser le C++ "old-school", juste l'ordre d'apprentissage qui change (apprendre les bonnes pratiques modernes puis remonter progressivement sur du code moins sécurisée, plutôt que commencer par du code sale et apprendre ensuite du C++ moderne)

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    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...)

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    De quoi parles-tu, Lolilolight?

    Il n'est pas du tout question de supprimer ou non new et delete, mais de remplacer #include

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Citation Envoyé par leternel Voir le message
    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)
    Je te répond ici même si ce n'est pas vraiment la bonne discussion.

    En réalité, toi tu vois les difficultés techniques pour réaliser les choses, mais ce ne sont pas les difficultés qui bloquent le comité de normalisation (tout simplement car il ne s'occupe pas des détails techniques, ils spécifient juste le comportement des modules). La question du "moyen de dire ceci existe et est là-bas" n'entre pas en jeu pour l'introduction dans la norme des modules.

    Les questions traités dans les documents relatifs au module sont plutôt sur la syntaxe à adopter pour les nouvelles fonctionnalités, les comportements vis-à-vis des résolutions de noms (étant donné qu'un module indique ce qu'il exporte, on est plus dans une logique de copier/coller ou tout les éléments sont nécessairement pris en compte pour la résolution), le respect de l'ODR (idéalement le système va rendre ce respect plus simple à accomplir), la position des points d'instanciation pour les template et les dépendances cycliques.

    Techniquement, clang avait proposé une implémentation pour une proposition de module antérieur. L'idée est la suivante, lorsqu'une unité de compilation est traitée, elle généré un/des fichiers contenant les symboles exportés par l'unité de compilation (schématiquement il y a génération d'un fichier similaire aux headers qu'on écrit aujourd'hui). Ce n'est donc pas si tordu que ça et la compatibilité avec le système actuel est conservé (il y a toujours application du pré-processeur) et aucun impact sur les erreurs détectées ou non à la compilation.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Les codeurs C sont plus rigoureux à cause du domaine où on cantonne les développeurs C et ce n'est clairement pas le langage lui-même qui implique la rigueur et de très loin.
    Le "void*" du C est une vaste blague.

  12. #12
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Les codeurs C sont plus rigoureux à cause du domaine où on cantonne les développeurs C et ce n'est clairement pas le langage lui-même qui implique la rigueur et de très loin.
    Le "void*" du C est une vaste blague.
    Personnellement je trouve ca carrement magique quand je veux m'amuser a faire des trucs un peu "limite" et carrement degueux mais tellement fun.

    Pour en revenir au sujet, le plus gros probleme du C++ est clairement son passe. Ajouter une nouvelle fonctionnalite ne peut se faire au detriment d'une ancienne pas trop vieille au risque de peter tous les codes qui en dependent. Il suffit de voir combien de temps il a fallu avant que le mot auto ne soit reutilise alors que je ne connais personne qui se servait de "l'original". Probleme epineux donc. Mon point de vue sur la question serait de creer une seconde branche du C++ qui ferait du breaking-change pour enfin resoudre tous les aspects les plus decries du C++ mais encore une fois, est-ce que ca sera toujours considere comme du C++ ?

  13. #13
    Membre très actif
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Par défaut
    Citation Envoyé par leternel Voir le message
    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)
    Va voir comment on fait dans Modula-2, Oberon ou même TurboPascal. Ici on ne parle pas du problème de l'inclusion, mais du mécanisme utilisé. i.e. l'inclusion d'un module (ou d'une unité dans pascal/modula2) se fait toujours de la même manière dans tous les langages statiques ou dynamiques (python et autre). Le problème survient quand un module inclus lui même d'autres modules,... dans ce cas là, il est facile d'avoir les références circulaires, i.e. les modules inclus en arrivent à inclure un module qui lui même a besoin d'inclure le module parent. A -> B -> C ->A
    La gestion (et l'évitement) de ce genre d'inclusions est actuellement fait avec des IFDEF en début de chaque header dans le C/C++. En modula2 (Oberon) il y a une gestion plus intelligente des modules lors de la compilation (voir la doc sur le site de Wirth).
    Actuellement, Apple (groupe de travail chez Apple apparement) qui a soumis une étude d'utilisation du système de modules au lieux des header files aux instances de certification du C++ http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf

    Citation Envoyé par leternel Voir le message
    @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...)
    Le problème au niveau de l'allocation dynamique en C++ ne se limite pas à l'aspect simplissime des duos new/delete. Il suffit de les jumeler. Le problème provient des subtilités du C++ lors de la création automatique objets (lors des appels et le retour de fonctions, lors de certaines formes d'initialisation, ...). Aussi les problèmes peuvent survenir dans pleins de cas très subtils lors de la création automatique des constructeurs de recopie, de l'opérateur "=" non overloader, ... bref pleins de cas (faudra lire les livres Effective C++ et More Effective C++ de Scott Mayer).

  14. #14
    Membre chevronné Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Par défaut
    Citation Envoyé par leternel Voir le message
    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)
    Dans les langages intégralement compilés, tu vas avoir Ada qui va effectivement vérifier les utilisations de code externe sans passer par la copie brutale de l'intégralité du header dans le corps de ton code.
    Comment fait-il ? Il considère l'entête comme du code à part entière qu'il est possible de compiler. De cette compilation sont produits des fichiers de description qui servent ensuite à la compilation des fichiers objet (grosso modo) puis des objets au link.
    Un avantage de la méthode est que tout est traité comme du code et pas comme un simple fichier texte dans le cas d'un include C/C++.
    Le principal inconvénient, c'est le temps de compilation.

    Dans le cas d'un module externe comme une bibliothèque dynamique, les fichiers .ali, les fameux descripteurs, sont fournis avec la .dll ou le .so.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Pour moi, l'inconvénient principale d'Ada, c'est la séparation entre la déclaration et l'implémentation, comme en C et en C++.

  16. #16
    Membre chevronné Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Par défaut
    Pour moi, l'inconvénient principale d'Ada, c'est la séparation entre la déclaration et l'implémentation, comme en C et en C++.
    Justement, pour moi, non. La séparation, c'est le contrat et ses contraintes, d'un côté et de l'autre l'implémentation dont l'utilisateur n'a rien à savoir.
    Il n'y a rien de choquant.
    Je fais du Java depuis 15 ans et franchement, si tu n'ouvres pas le code dans un éditeur ad-hoc mais avec un simple éditeur texte ou un navigateur, c'est lourd.

  17. #17
    Invité de passage

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Par défaut
    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.

  18. #18
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    ... 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.

  19. #19
    Membre actif
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Août 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Août 2005
    Messages : 45
    Par défaut
    Citation Envoyé par sizvix Voir le message
    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 d'accord avec ça, j'aime avoir un plan clair de ma classe. Mais je pense juste que c'est le genre de tâche automatisable très facilement.
    C'est une tâche extrêmement automatique, que de faire la liste des fonctions.

    En général, j'écris le prototype dans le header, et je génère automatiquement le corps avec l'IDE.

    Mais autant quand je développe en C (très bas niveau en général, parfois sans OS) je comprend la nécessité du header : j'en fais parfois plusieurs pour une même librairie, un public et un privé par exemple.
    Mais en C++, où la notion de public et privé est explicite, on écrit toujours le header de la même manière, strucutré, etc. D'où, automatisable.

    Je pense juste que là dessus, la norme pourrait prévoir un outil pour réaliser cette tâche, tout en laissant la possibilité bien sûr de le faire manuellement.
    Par exemple, rechercher dans la liste des fichiers compilés si la classe existe pour en extraire les infos nécessaires si aucun header n'est spécifié pour la classe.
    Les meta-infos de type static, private, etc. devraient bien sûr alors être répétées dans le .cpp.
    Mais cela pourrait au moins faciliter la tâche pour les classes au sein d'une même librairie.

    Je rêve peut-être, mais n'est-ce pas le sujet de l'article ?

    Citation Envoyé par Guikingone Voir le message
    J'ai toujours considérer le C++ comme une alternative au C, en moins bien cependant, le C reste à mes yeux un modèle, il est touffu, complexe et déroutant mais il forme des dévs de qualité qui savent mettre les mains dans la sauce sans rechigner et qui savent gérer un language strict.

    Le C++ n'est pas mauvais en soi, disons qu'il différe du C en une version moins directe et moins "lisible" à mes yeux, mais là encore, chacun y verra midi à sa porte.
    J'ai, au début, considéré le C++ comme une extension du C.

    Moi qui venait du C, bas niveau, strict, avec une gestion de la mémoire au plus proche, j'ai au début été très dérouté.
    Ma première approche du C++ a été d'y voir un artifice d'« enrobage » du C dans une couche haut niveau. Du C pour les flemmards, presque ^^.

    Mais après un usage un peu plus poussé maintenant, je ne vois en fait aucune similitude entre ces deux langages.
    Une même syntaxe, bien sûr. Une compatibilité, effectivement.
    Mais un style, une manière de raisonner qui se situaient sur des niveaux tellement différents qu'il est impossible de les comparer.

    Pour moi, le C et le C++ sont deux langages totalement différents, et cela s'accentue je trouve avec les dernières révisions du C++, pour le meilleur.

    Mais je crois qu'il est possible d'enrichir le C++, par exemple comme expliqué ci-dessus, sans pour autant casser la compatibilité. Et donc contenter à la fois les devs haut niveau comme ceux plus proches du matériel.

  20. #20
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ah oui, en effet, on est dans cette discussion-là.
    Comme en parallèle, il y en a une sur les includes et modules, j'ai crû être dans l'autre

Discussions similaires

  1. Serait-ce vraiment la fin du réseau peer-to-peer ?
    Par Cedric Chevalier dans le forum Actualités
    Réponses: 16
    Dernier message: 14/07/2013, 01h04
  2. Réponses: 3
    Dernier message: 03/02/2012, 08h52
  3. Réponses: 238
    Dernier message: 10/03/2011, 21h44
  4. Réponses: 4
    Dernier message: 15/04/2010, 09h49
  5. [power AMC] Quels est vraiment son utilité?
    Par alpachico dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 08/08/2005, 08h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo