1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 500
    Points : 569
    Points
    569

    Par défaut Je dois renvenir au C++ quinze ans après l'avoir quitté. Qu'est-ce qui a changé ?

    Bonjour,

    J'ai entamé le C++ jadis à sa sortie, quand on développait encore sur Turbo C++.
    Puis Borland C++ avec Owl pour Windows 3.x, et puis les MFC sous Visual C++.
    Je l'ai quitté en 2001, quelques années avant que n'arrive Visual Studio et que ne débute côté Windows une unification avec .NET.

    Je l'appréciais bien, mais c'est Java qui a été mon activité les années suivantes.

    Depuis peu, j'y trouve un nouvel intérêt pour des programmes où la célérité va prendre plus d'importance.

    À l'époque où je l'ai quitté le C++ avait connu pour dernière nouveauté d'évolution du langage (depuis deux ou trois ans, je crois), les références avec &.
    Voilà, je crois que j'en étais là, alors, dans sa pratique. J'ai beaucoup codé avec, mais maintenant l'API de sous-bassement Windows que je connaissais à l'époque ne me servira plus à rien, elle est obsolète. Et de toutes façons, ce sera sur des environnement Debian que je vais développer.


    J'aimerais bien savoir à quoi me préparer.
    Quelles ont été les évolutions majeures du C++ depuis l'an 2000 ?
    Avec quelles librairies de classes standard évolue-ton désormais avec les compilateurs gcc ou équivalents, pour faire l'essentiel de la programmation ?
    Compile t-on toujours ses projets à l'aide de makefiles, ou bien la pratique a changé ?

    Merci à vous !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 128
    Points : 4 737
    Points
    4 737

    Par défaut

    Citation Envoyé par grunt2000 Voir le message
    Quelles ont été les évolutions majeures du C++ depuis l'an 2000 ?
    La méta-programmation (templates) partout

    Ensuite, le C++ moderne (C++1y avec C++11, C++14, C++17, C++19, ...)
    • désambiguifie le C : par exemple les rvalue reference, les move constructor, pointeur NULL, de nouvelles façons de coder tout un tas de choses constant
    • permet aux développeurs de se concentrer sur leur code et non plus sur le "comment faire" : les raw pointeurs sont planqués et par exemple il y a les lambdas, l'inférence des types, les fermetures (closures)
    • a un timide élargissement des possibilités : par exemple inclusion des threads (mais ratée), de l'unicode, du temps, table de hachage, regex
    • améliore/ renforce les templates : par exemple templates externes, templates variadiques, les chevrons >>, variable templates


    Citation Envoyé par grunt2000 Voir le message
    Avec quelles librairies de classes standard évolue-ton désormais avec les compilateurs gcc ou équivalents, pour faire l'essentiel de la programmation ?
    Le compilateur numéro 1 c'est le compilateur Apple clang. C'est boost la bibliothèque non officielle qui a été reprise en partie par le C++ moderne


    Citation Envoyé par grunt2000 Voir le message
    Compile t-on toujours ses projets à l'aide de makefiles, ou bien la pratique a changé ?
    Le comité C++ prévoit des changements qui se font attendre : par exemple les modules
    Mais le seul truc que le comité est d'accord c'est de normaliser les entêtes pré-compilées pour pouvoir faire des exports dynamiques à la Java (si je ne dis pas de bêtises)

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2011
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : juin 2011
    Messages : 483
    Points : 2 063
    Points
    2 063

    Par défaut

    Le changement le plus profond et aussi le plus complexe à appréhender concerne la sémantique de déplacement (rvalue). Ce qui est est la base de pléthore de nouveautés dont les pointeurs intelligents font partie.

    Au niveau langage:

    - Les nouveaux mots clefs auto, decltype, override, constexpr et changement sur for, if, while (http://en.cppreference.com/w/cpp/keyword)
    - les lambdas
    - les boucles sur intervalle
    - plusieurs choses pour la méta-prog: template variadique, if constexpr, variable template et alias template, en tête <type_traits> etc

    La liste des en-têtes: http://en.cppreference.com/w/cpp/header

    C++20 ou après réserve pas mal de chose qui vont avoir de gros impacte sur le langage et la manière d'écrire son code:

    - module
    - méta-class
    - coroutine
    - reflexion
    - concept
    - range

    @foetus: Pourquoi est-ce raté pour les threads ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 128
    Points : 4 737
    Points
    4 737

    Par défaut

    Citation Envoyé par jo_link_noir Voir le message
    @foetus: Pourquoi est-ce raté pour les threads ?
    C'est vrai que c'est un retour que j'avais lu et que je n'arrive pas à retrouver

    Mais, il me semble que, le problème des threads C++11, c'est que c'est un outil bas niveau :
    • il faut savoir les utiliser : par exemple, on peut créer des fuites ThreadRAII + Thread Suspension = Trouble?
    • il manque des outils plus haut niveau et qui arriveront avec le C++20 que tu mentionnes : coroutines, semaphores, latches et barriers, transactional memory, task blocks

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2017
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2017
    Messages : 70
    Points : 246
    Points
    246

    Par défaut

    Citation Envoyé par foetus Voir le message
    Le compilateur numéro 1 c'est le compilateur Apple clang.
    Heu... non.
    Déjà ce n'est pas Apple clang car le projet est désormais développé par une communauté. Et ensuite clang a amener un peu de concurrence bénéfique mais il n'est ni fondamentalement meilleur ni plus répandu que gcc (https://en.wikipedia.org/wiki/Clang#..._compatibility). Beaucoup d'OS de type BSD sont passés à clang pour des histoires de licences mais, à ma connaissance, les distributions linux sont toujours compilées avec gcc par défaut.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 534
    Points : 23 133
    Points
    23 133

    Par défaut

    Salut,

    Et pour ce qui est des makefiles, comme on utilise toujours (enfin, le plus souvent) make, il restent d'actualité.

    Mais, bien que le système de configuration de projets des "autotools" (autoconf, automake, autoheaders, ...) on se tourne de plus en plus souvent ver l'outil CMake, qui présente l'énorme avantage d'être porté sur différentes plateformes.

    Et puis, de manière générale, tu utilises à peu près l'outil que tu veux pour automatiser la compilation. Sauf erreur, ant, qui est pourtant plutôt orienté vers l'automatisation de java, fonctionne aussi très bien
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre chevronné
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 446
    Points : 1 951
    Points
    1 951

    Par défaut

    Citation Envoyé par foetus Voir le message
    C'est vrai que c'est un retour que j'avais lu et que je n'arrive pas à retrouver
    Le 10/10/2011, Bartosz Milewski a publié un article : Async Tasks in C++11: Not Quite There Yet.

    L'idée générale est que le développeur ne devrait pas gérer le parallélisme en terme de threads mais en terme de tâches. L'implémentation bas niveau, elle, se chargerait d'exécuter les tâches via un pool de threads. Si une tâche X se bloque, par exemple parce qu'elle attend une entrée utilisateur, le thread correspondant pourrait renvoyer la tâche dans la file des tâches en attente et piocher une autre tâche pour l'exécuter. La tâche X sera récupérée plus tard par un des threads, qui ne sera pas forcément le même que le thread de départ.

    Or, le C++11 a été pensé comme si l'exécution d'une tâche commençait et se terminait dans le même thread.

  8. #8
    Expert éminent
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2003
    Messages
    5 139
    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 139
    Points : 9 983
    Points
    9 983

    Par défaut

    Le plus gros changement, et pas des moindres et pourtant on tend à l'oublier, c'est qu'il ne faut en aucun cas essayer de gérer la mémoire à la main ou croire que l'on puisse y arriver dans un monde d'exceptions.

    Ce petit gros détail est à l'origine de l’appellation "C++ moderne" en opposition à "C++ historique" où le C++ est perçu comme une simple surcouche du C. Si tu es resté aux références comme "nouveautés", c'est le premier changement important. Beaucoup d'autres choses dans le C++98, dans le C++11 et suivants découlent de cela. Le mot clé est RAII.

    Je ne peux que renvoyer à https://www.developpez.net/forums/d1...ne-stroustrup/
    Du même auteur, "A Tour of C++" est une présentation du langage orientée mise à niveau si mes souvenirs sont bons.
    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...

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    janvier 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2007
    Messages : 500
    Points : 569
    Points
    569

    Par défaut

    Merci pour vos premières orientations.

    Ce que je comprends, c'est que je suis à la norme C++ 98, et que j'ai à rattraper les normes C++ 03, 11 et 14 au minimum.
    La C++ 17 est en préparation, Ai-je bien compris que la C++ 1z désigne aussi cette future C++ 17 ?

    Les templates, je me rappelle en avoir fait. La généricité sous Java ne doit pas en être trop éloignée.
    La gestion de la mémoire à l'ancienne, je me doute qu'effectivement ça doit être fini. Prendre un pointeur dans un coin et lui loger des valeurs en *(monPointeur - 7) = 152; ça ne doit plus être très apprécié.

    Je vais voir ce que je peux acquérir.
    Je n'apprendrai pas tout. J'ai pour habitude de n'utiliser que ce que je peux ensuite expliquer à deux développeurs autour de moi au moins, d'une manière que je sois sûr qu'ils y adhèrent et acceptent de le maintenir.
    Cela me permet d'exclure les choses trop originales qui ne peuvent finalement pas être soutenues. (Exemple typique en Java : la programmation orientée aspect. Géniale sur le principe, mais éminemment casse-gueule, incomprise et le plus souvent mal maitrisée avec tous les effets de bords dont on en cauchemarde la nuit qu'ils se soient provoqués pendant qu'on dormait).


    @koala, ci-dessous : "– Je n'apprendrai pas tout.
    – Tu aurais tort.
    "
    C'est humain de le souhaiter, mais Java ou C++ ont un univers de plus de 10 000 classes qu'ils proposent dans des domaines variés.
    Dans la pratique, même un développeur faisant beaucoup de révisions et de veille ne gardera pas plus que la connaissance de l'emploi, d'une manière plus ou moins approfondie, de 1 500 classes.
    Et rares sont ceux qui sont si connaisseurs qu'ils savent de plus utiliser chaque méthode de chaque classe, parce qu'ils ont pris le temps de les éprouver effectivement en les expérimentant et pas seulement en lisant leur documentation.

    On ne peut pas apprendre tout. Il faut choisir ce que l'on apprend, puis accepter de le remplacer. Acquérir des connaissances nouvelles et accepter d'en abandonner d'autres. Cela, l'abandon, se fait naturellement :
    On croit se rappeler ce que l'on savait dix ans auparavant, pour se rendre compte qu'on ne s'en souvient plus que des reliefs parce que le cerveau a acté qu'un certain nombre de connaissances ne lui serviraient plus et les a évacuées.

    Ce qui fait que je pense que la stratégie n'est pas de tout apprendre. Mais plutôt d'avoir un fil directeur dans l'apprentissage.
    Pour ma part, j'ai favorisé tout ce qui peut être transmis à une équipe de développeurs entre un et cinq ans d'expérience. Je connais des pratiques au delà, parfois. Mais je n'en fais la promotion qu'avec prudence.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 534
    Points : 23 133
    Points
    23 133

    Par défaut

    Citation Envoyé par grunt2000 Voir le message
    Merci pour vos premières orientations.

    Ce que je comprends, c'est que je suis à la norme C++ 98, et que j'ai à rattraper les normes C++ 11 et 14 au minimum.
    La C++ 17 est en préparation, Ai-je bien compris que la C++ 1z désigne aussi cette future C++ 17 ?
    oui, ou n'importe quelle norme qui pourrait sortir entre maintenant et 2019 inclus (à cause du 1 )
    Les templates, je me rappelle en avoir fait. La généricité sous Java ne doit pas en être trop éloignée.
    Pour ce que j'en sais, il n'y a vraiment que le principe de base : si on ne sait pas quel type de donnée on va manipuler, on sait comment on va le faire

    Pour le reste, je crois que c'est vraiment totalement différent
    La gestion de la mémoire à l'ancienne, je me doute qu'effectivement ça doit être fini. Prendre un pointeur dans un coin et lui loger des valeurs en *(monPointeur - 7) = 152; ça ne doit plus être très apprécié.
    Ben, c'est toujours le même problème : si tu as de bonnes raisons de le faire, il n'est pas question de ne pas apprécier

    Ce qui est moins apprécié, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type * ptr = new Type;
    /*...*/
    delete ptr;
    (surtout si new et ptr ne sont pas dans la même fonction)
    Que l'on remplacera de préférence par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::unique_ptr<Type> ptr= std::make_unique<Type>();
    ou par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::shared_ptr<Type> ptr= std::make_shared<Type>();
    car std::unique_ptr et std::shared_ptr nous garantisse que la mémoire allouée à l'élément sera libérée "en temps et en heure".

    Et puis, on part du principe maintenant qu'il vaut mieux éviter l'utilisation d'un pointeur (et surtout de l'alloation dynamique de la mémoire) à chaque fois que faire se peut : on essaye de n'y avoir recours que... lorsque l'on n'a vraiment pas d'autre choix.

    La différence entre la sémantique de valeur et la sémantique d'entité nous aide énormément à faire ce genre de choix
    Je vais voir ce que je peux acquérir.
    Bah, si tu n'est pas totalement idiot, tu devrais pouvoir acquérir à peu près tout

    Seul le temps que l'on met à le faire changera d'une personne à l'autre
    Je n'apprendrai pas tout.
    Tu aurais tord : quand on ne maitrise "qu'à moitié son véhicule", il arrive toujours un moment où l'on fini contre l'arbre ou dans le fossé qui trainait par là au moment où l'on en a perdu le contrôle

    Le principe est le même ici: il y a une différence entre connaitre (et donc, maitriser le langage) et utiliser
    J'ai pour habitude de n'utiliser que ce que je peux ensuite expliquer à deux développeurs autour de moi au moins, d'une manière que je sois sûr qu'ils y adhèrent et acceptent de le maintenir.
    Cela me permet d'exclure les choses trop originales qui ne peuvent finalement pas être soutenues.
    Alors là, je ne peux que te féliciter de cette manière de voir les choses.

    Mais, encore une fois, il y a une différence entre connaitre et utiliser
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    juillet 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 25
    Localisation : France

    Informations forums :
    Inscription : juillet 2010
    Messages : 36
    Points : 56
    Points
    56

    Par défaut

    De mon point de vue, après une utilisation intensive depuis ~5 ans, je dirais presque que c++11 est un langage différent de C++98/C++03.
    La façon de programmer n'est plus du tout la même, tout comme le passage du C au C++ est plein de nouveautés et différences, le passage à C++11 c'est vraiment un nouveau monde.

    Beaucoup plus simple, avec notamment les pointeurs intelligents, move et les rvalues, les templates variadiques, les lambdas, etc, ainsi que des ajouts très bénéfiques a la bibliothèque standard (thread, random, chrono par ex).
    On n'utilise plus de pointeurs nus, à part en tant "qu'observateurs" (dont on sait qu'ils n'ont pas la main mise sur la ressource), on fait du RAII, on ne s’embête plus a retourner de gros objets par reference dans les paramètres de fonction, on les retournes par valeur (et avec move, c'est tout aussi rapide).
    Sans compter le nombre incroyable d'ajouts de choses qui paraissent "mineures" a première vue, mais qui changent définitivement la façon de programmer (et en bien).

    C++14 pour sa part je ne peux pas encore l'utiliser, j'ai regardé un peu mais les changements sont "mineurs".
    C++17 n'apporte pas autant de choses incroyables qu'entre le passage c++03/c++11, mais il y a beaucoup d'outil très intéressants (if_constexpr, fold expressions, structured binding) et des ajouts importants a la bibliothèque standard (comme filesystem qui manquait vraiment).

    C++20 quand a lui semble sur la voie de changer beaucoup de choses, tout comme c++11, avec les modules (finis la "galère" des includes?) et les concepts par exemple (qui vont vraiment changer la façon de coder en c++).

    Le futur du c++ semble très prometteur en tout cas (reflexion, networking...).
    Et certains papers sont très alléchants, comme les metaclasses:
    https://herbsutter.com/2017/07/26/me...-generative-c/


    La seule chose regrettable est que le support semble assez lent à se faire, que ce soit en entreprise, ou du côté des SDK, comme par exemple pour export sur les consoles de dernière génération (qui semblent limités a c++11 d'après les retours).

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    4 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 4 554
    Points : 18 241
    Points
    18 241

    Par défaut

    Pour ma part, les plus gros changements ont été, et donc la courte liste de choses à voir et utiliser qui sont vraiment game changer que je conseillerais :
    - variadic templates
    - lambda
    - move semantic
    - if constexpr (C++17)

    Les pointeurs intelligents c'est mignon, mais on avait déjà vite fait d'avoir l'équivalent d'un unique_ptr sur un projet un minimum gros donc c'est juste sympa de fournir ça dans la std mais n'est pas une révolution imo.
    shared_ptr ça reste un gadget dont on peut se passer dans de très nombreux cas où leur utilisation relève plus de la feignantise ou mauvaise conception.
    Je range les ranged-for-loop dans la catégorie gadget aussi : si tu connais autant les utiliser, mais tu ne perds rien à ne pas le faire dans un premier temps en tous cas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Que faire après quinze ans en tant que développeur?
    Par alineas1 dans le forum Emploi
    Réponses: 11
    Dernier message: 05/02/2016, 09h42
  2. [Opinion]Que pensez vous du .net framework 10 ans après?
    Par Hinault Romaric dans le forum Général Dotnet
    Réponses: 177
    Dernier message: 02/09/2010, 14h32
  3. Réponses: 15
    Dernier message: 08/10/2009, 09h24
  4. Réponses: 10
    Dernier message: 09/09/2009, 16h32
  5. problème de positionnement 4 ans après.
    Par Ekimasu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 30/03/2008, 16h00

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