Quand j'ai appris le C ++ pour la première fois il y a 6 à 7 ans, ce que j'ai appris était essentiellement "C with Classes". std::vector
était définitivement un sujet avancé, quelque chose que vous pouviez apprendre si vous le vouliez vraiment . Et il n'y avait certainement personne qui me disait que les destructeurs pouvaient être exploités pour aider à gérer la mémoire. Aujourd'hui, partout où je regarde, je vois RAII et SFINAE , STL et Boost et, enfin, C ++ moderne. Même les personnes qui commencent à peine avec la langue semblent apprendre ces concepts presque dès le premier jour.
Ma question est la suivante: est-ce simplement parce que je ne vois que le "meilleur", c'est-à-dire les questions ici sur SO et sur d'autres sites de programmation qui ont tendance à attirer les débutants (gamedev.net), ou est-ce réellement représentatif du Communauté C ++ dans son ensemble?
Le C ++ moderne devient-il vraiment la valeur par défaut? Plutôt que d'être quelque chose d'extraordinaire sur lequel les experts écrivent, est-ce en train de devenir "la façon dont C ++ est"? Ou suis-je tout simplement incapable de voir les milliers de personnes qui apprennent encore "C avec classes" et écrivent leurs propres tableaux dynamiques au lieu d'utiliserstd::vector
, et font la gestion de la mémoire en appelant manuellement new / delete de leur code de niveau supérieur?
Autant que je veux le croire, il semble incroyable que la communauté C ++ dans son ensemble ait tellement évolué en quelques années. Quelles sont vos expériences et impressions?
(avertissement: quelqu'un qui n'est pas familier avec C ++ pourrait mal interpréter le titre comme demandant si C ++ gagne en popularité par rapport à d'autres langages. Ce n'est pas ma question. "C ++ moderne" est un nom courant pour un dialecte ou un style de programmation dans C ++, nommé d'après le livre " Design C ++ moderne: Programmation générique et modèles de conception appliqués ", et je suis uniquement intéressé par cela par rapport à" l'ancien C ++ ". Donc, inutile de me dire que le temps de C ++ est passé, et nous devrions tous utiliser Python;))
Réponses:
Voici comment je pense que les choses ont évolué.
La première génération de programmeurs C ++ était des programmeurs C, qui utilisaient en fait C ++ comme C avec des classes. De plus, la STL n'était pas encore en place, c'est donc ce qu'était essentiellement C ++.
Lorsque la STL est sortie, cela a fait avancer les choses, mais la plupart des gens qui écrivaient des livres, élaboraient des programmes et enseignaient les classes avaient d'abord appris le C, puis ces trucs supplémentaires en C ++, donc la deuxième génération a appris de cette perspective. Comme l'a noté une autre réponse, si vous êtes à l'aise pour écrire des boucles for régulières, changer pour utiliser
std::for_each
ne vous achète pas grand-chose sauf le sentiment chaleureux et flou que vous faites les choses de manière «moderne».Maintenant, nous avons des instructeurs et des rédacteurs de livres qui ont utilisé tout le C ++ et qui ont obtenu leurs instructions dans cette perspective, comme le C ++ accéléré de Koenig & Moo et le nouveau manuel de Stroustrup. Donc on n'apprend pas
char*
alorsstd::strings
.C'est une leçon intéressante sur le temps qu'il faut pour remplacer les méthodes «héritées», en particulier lorsqu'elles ont des antécédents d'efficacité.
la source
Absolument oui. Pour moi, si vous ne programmez pas C ++ dans ce style "C ++ moderne" comme vous le dites, alors il est inutile d'utiliser C ++! Vous pourriez tout aussi bien utiliser C. "C ++ moderne" devrait être la seule façon dont le C ++ est programmé à mon avis, et je m'attendrais à ce que tous ceux qui utilisent C ++ et ont programmé de cette manière "moderne" soient d'accord avec moi. En fait, je suis toujours complètement choqué quand j'entends parler d'un programmeur C ++ qui n'est pas au courant de choses comme un auto_ptr ou un ptr_vector. En ce qui me concerne, ces idées sont fondamentales et fondamentales pour C ++, et je ne pourrais donc pas l'imaginer autrement.
la source
À l'époque de Windows 3.1, C était la norme. Lorsque C ++ a frappé le marché des développeurs et est devenu plus tard la norme ANSI, c'était la nouvelle tendance. Il a popularisé l'acronyme OOP et certains des modèles de conception de base en utilisant le polymorphisme.
Maintenant, avec la plus grande acceptation des plates-formes gérées à faible barrière à l'entrée, comme C # / .NET, il y a moins de raisons d'utiliser C ++. Une grande partie de la base de développeurs aura le choix et soyons honnêtes: C ++ est un ours à apprendre pour un novice. Avec C #, vous pouvez simplement l'exécuter.
Cela ne laisse vraiment que les plates-formes qui ont besoin de C ++ et les évangélistes inconditionnels du C ++ pour continuer à pratiquer cet art. C'est la communauté qui a besoin et qui veut toutes les couches d'abstraction considérées comme du "C ++ moderne".
Alors oui, je crois que le "C ++ moderne", comme vous le dites, est de plus en plus répandu. Bien qu'il soit courant avec un public différent de celui qui l'a utilisé dans le passé.
la source
Je fais partie de ces types qui ont appris à travailler avec la STL et qui ont beaucoup entendu parler de RAII et des bonnes pratiques de programmation C ++ dès le premier jour. ) concentrez-vous sur l'utilisation des outils STL au lieu de regrouper vos propres trucs, et donnez également beaucoup de «règles» pour une programmation efficace (ou «moderne»).
Mais en parlant avec des amis, j'ai également remarqué que certaines entreprises travaillent toujours avec "C with Classes", pas avec "C ++ moderne". Peut-être que la culture proposée par les auteurs et utilisateurs du "C ++ moderne" prévaudra un jour :)
la source
Je pense que vous venez de vivre une mauvaise expérience au départ.
Vous devez vous procurer des livres Scott Meyers Effective C ++. J'ai commencé le C ++ dans la colère en 1999, mon chef d'équipe m'a fait m'asseoir et lire le C ++ efficace et le C ++ plus efficace avant d'être autorisé à enregistrer N'IMPORTE QUEL code.
La plupart de ses conseils sont du type "N'utilisez pas cette fonctionnalité , mais si vous le devez, gardez cela à l'esprit"
Si vous suivez ses conseils, vous écrirez du bon C ++ ou "moderne".
Il a aussi un livre sur STL maintenant, mais que je n'ai pas lu.
la source
Dans mes emplois C ++, j'ai trouvé que les fonctionnalités modernes étaient de plus en plus utilisées, et de plus en plus de gens m'ont posé des questions à leur sujet lors de projections téléphoniques et d'entretiens. Autant que je sache, ils sont en train de se répandre.
J'ai appris le C ++ à l'origine comme quelque chose comme C avec des classes; bien que le langage ait avancé bien au-delà de cela, les livres que j'ai lus et les personnes avec lesquelles j'ai travaillé étaient fermement attachés à «l'ancien C ++». RAII quelque chose que les gens penseraient, plutôt que de faire automatiquement, et je me souviens avoir lu certains des premiers articles sur les problèmes de sécurité des exceptions.
Comme indiqué, il y a de nouveaux livres maintenant. Bon nombre des anciennes sont toujours pertinentes, mais elles semblent de plus en plus explicites pourquoi les mauvaises idées sont manifestement mauvaises. (De même, il est difficile pour les lecteurs modernes de comprendre à quel point les idées révolutionnaires de Freud sur l'inconscient étaient, puisque c'est maintenant la sagesse conventionnelle.)
Stroustrup vient de sortir un manuel, Programming: Principles and Practice Using C ++ . Je l'ai acheté parce que je n'ai pas encore manqué d'apprendre de bonnes choses d'un livre de Stroustrup, mais je n'ai pas dépassé les premiers chapitres. Jusqu'à présent, tout ce que je peux dire, c'est que j'approuve la façon dont il a débuté, et c'est au moins une bonne introduction à la façon dont C ++ devrait être utilisé.
la source
Tout en travaillant sur le projet dans lequel je suis actuellement impliqué, il y a beaucoup de code C ++ qui a évolué sur une période de temps significative (plus de 10 ans maintenant). L'évolution dont vous parlez y est clairement visible: l'ancien code est souvent «C avec classes» - pointeurs bruts,
char*
chaînes de caractères et utilisation des fonctions C associées, des tableaux, etc. le code plus récent utilise des pointeurs intelligents ATL et autres pour gérer les ressources, mais s'en tient toujours aux boucles codées à la main la plupart du temps, et l'itérateur est un spectacle rare; et le plus récent regorge de conteneurs STL, d'algorithmes,shared_ptr
(y compris des suppressions personnalisées pour gérer les poignées, etc.), des modèles de fonctions et de classes fortement génériques, etc. La plupart des techniques de codage traditionnelles "C avec classes", telles que les pointeurs bruts non encapsulés avec gestion manuelle de la durée de vie, sont très mal vues dans les revues de code de nos jours. À en juger par cela, il semble que votre observation soit exacte.Le développement le plus récent semble être une mode pour les lambdas C ++ 0x - qui a un côté positif en ce sens qu'il fait également pencher la balance en faveur de l'utilisation d'algorithmes standard sur des boucles codées à la main, puisque maintenant vous pouvez avoir tout votre code en ligne avec algorithmes aussi.
la source
Je ne dirais pas que std :: vector est qualifié de "moderne" de nos jours. C'est vraiment basique.
En général, j'ai l'impression que les gens ont acquis une certaine expérience avec le style C ++ moderne et se sont un peu dégrisés. Juste pour prendre un exemple simple, STL for_each était intéressant mais en pratique, il n'ajoute pas beaucoup de valeur sur une boucle C simple. Il est plus difficile à déboguer et ne fournit parfois pas les meilleures performances. De plus, les constructions pour la programmation fonctionnelle dans la STL actuelle sont généralement très lourdes, surtout si vous avez une expérience d'un vrai langage fonctionnel comme ML.
la source
D'après mon expérience (Université espagnole), malheureusement, la norme est de ne pas considérer les langues en soi. Ils utilisent les langages les plus simples pour enseigner la programmation (c'est-à-dire Java), parce que c'est censé être facile pour les enseignants et les étudiants, puis ils utilisent C pour les classes OS et autres.
Le C ++ est introduit très légèrement (en tout cas en tout cas), juste pour fournir à un C des classes. Ils n'entrent pas dans le boost ou même le STL. Je pense que suivre toutes les caractéristiques et la façon de penser du C ++ est coûteux pour les enseignants et les étudiants. Combien de programmeurs C ++ ici connaissent suffisamment toutes les bibliothèques Boost pour les utiliser pour donner une meilleure solution ou pour la concevoir? Il faut avoir intérêt à se tenir au courant de toutes les nouvelles bibliothèques et idiomes.
Cependant, comme je l'ai dit, il semble que la programmation en général (et les langages de programmation en particulier) ne soient pas pris trop au sérieux, car cela semble être une affectation temporelle lorsqu'ils commencent un travail, puis oublient comment programmer au fur et à mesure qu'ils montent dans le arbre d'entreprise. De nombreuses entreprises ici, et l'Université elle-même, ont le sentiment que la programmation peut être faite par n'importe qui.
Si vous suivez cette philosophie, alors pour la plupart des gens que je connais, C ++ sera toujours "C avec classes".
Cordialement,
la source
D'après mon expérience, cela dépend largement de l'âge du produit / projet logiciel. La plupart des nouveaux projets que je connais utilisent du C ++ moderne (RAII, STL, Boost). Cependant, il existe de nombreux projets C ++ qui ont plus de 10 ans et vous n'y voyez pas de C ++ moderne.
De plus, gardez à l'esprit que certaines des implémentations STL les plus populaires étaient à peu près cassées jusqu'à il y a peut-être 5 ans (MSVC <7.0 et GNU <3.00)
la source
Je pense que le plus gros obstacle que j'ai rencontré est le support de la chaîne d'outils, en particulier sur les projets multiplateformes. Jusqu'à il y a quelques années, il était courant de voir des notes de construction disant que «la plate-forme x a besoin de STLport pour fonctionner parce que son compilateur est en panne». Même maintenant, je vois des problèmes avec des personnes essayant d'utiliser plusieurs dépendances tierces liées à différentes versions de BOOST. Cela rend la liaison impossible, ce qui signifie que vous devez revenir en arrière et reconstruire vos deps à partir de zéro.
Maintenant que presque tout le monde a cessé d'utiliser MSVC ++ 6, le désordre de STLport est derrière nous. Mais dès que TR1 est sorti, nous revenons à «quelles versions de quels environnements le supportent et le font correctement» et encore une fois, cela ralentira l'adoption.
Je travaille sur un projet commencé en C (et non en C ++) en 1992. Déployer des pratiques modernes à travers la base de code héritée serait impossible. De même, je travaille sur un autre projet qui est beaucoup plus proche de la pointe du langage C ++.
la source
De nombreuses équipes dont j'ai fait partie et dont j'ai entendu parler considèrent le grand "Utilisons-nous des exceptions?" question. Ceci est du code pour "utilisons-nous le C ++ moderne?"
Une fois que vous n'utilisez pas d'exceptions, vous n'êtes pas autorisé à utiliser toute la puissance du langage et de ses bibliothèques.
Mais de nombreuses bases de code plus anciennes sont sans exception, et il est perçu comme difficile de trouver des exceptions dans une base de code qui ne les attend pas, ou dans une équipe qui ne sait pas comment les utiliser, donc la réponse dans de tels cas est souvent «non».
D'après mon expérience, le C ++ moderne a besoin de quelqu'un de passionné dans l'équipe, qui ne supporte rien de moins, pour le pousser. Il doit également surmonter les objections de ceux qui veulent qu'il ressemble davantage au code hérité.
Bien que je ne pense pas que les anciennes bases de code C ++ disparaissent très rapidement, je pense qu'il y a plus de ces passionnés dans le monde qu'il y a cinq ans. Ils font face à la même bataille difficile à laquelle ils ont été confrontés il y a cinq ans, mais ils sont plus susceptibles de trouver des esprits apparentés.
la source
Avant de répondre à une telle question, vous devez vous mettre d'accord sur ce qu'est «moderne». Cela ne se produira probablement pas, car «moderne» est un mot mal défini et signifie différentes choses pour différentes personnes. Le titre du livre d'Alexandrescu (Modern C ++ Design) n'aide pas vraiment non plus, puisqu'il s'agit en grande partie d'un livre sur la métaprogrammation des modèles, qui est un domaine spécifique du C ++ mais en aucun cas le seul.
Pour moi, "Modern C ++"! = "Template Metaprogramming". Je dirais que les fonctionnalités de C ++ au-dessus de C relèveraient de ces catégories:
Aucun de ceux-ci n'est particulièrement moderne, car ils existent tous depuis près de 10 ans ou plus. La plupart de ces fonctionnalités sont utiles et vous permettront d'être plus productif que le simple C pour de nombreux cas d'utilisation. Un bon programmeur devrait tous les utiliser et les utilisera tous dans un projet de taille décente, mais l'une de ces choses ne ressemble pas à l'autre:
Métaprogrammation de modèle.
La réponse courte à la métaprogrammation de modèles est simplement de dire non. Malheureusement pour certaines personnes, c'est aussi une "programmation C ++ moderne", à cause du livre, mais en fin de compte, cela crée plus de problèmes qu'il n'en résout. À moins que C ++ ne développe de meilleurs mécanismes de programmation génériques tels que la réflexion, il sera mal adapté à la programmation générique, et les langages de niveau supérieur comme Python conviendront mieux à ces cas d'utilisation. Pour cela et bien d'autres raisons, consultez le C ++ FQA
la source
Le meilleur livre pour apprendre le C ++. "Accelerated C ++" de Koenig & Moo, enseigne ce que vous décrivez comme le C ++ moderne, donc je suppose que la plupart des gens l'utilisent de nos jours. Pour ceux d'entre nous qui utilisent le C ++ depuis un certain temps (depuis le milieu des années 80 dans mon cas), le C ++ moderne est un grand soulagement des tâches fastidieuses d'écrire nos propres tableaux, chaînes, tables de hachage (répéter ad nauseam).
la source
J'ai regardé les Jobs C ++ sur en effet et les bibliothèques "modernes" sont de plus en plus utilisées dans les descriptions de travail, MFC qui est une bibliothèque C ++ "à l'ancienne" est moins utilisée.
la source
La standardisation du langage à la fin des années 1990 a été la première étape, elle a permis aux fabricants de compilateurs de se concentrer sur l'ensemble "standard" de fonctionnalités, a également permis au langage de corriger certaines des aspérités apparues au cours du processus de standardisation.
Cela a à son tour permis le développement de frameworks basés sur les fonctionnalités standard du langage, et non sur les fonctionnalités fournies par une implémentation de compilateur particulière. La bibliothèque Boost est notamment à cet égard. Cela a également permis que le nouveau développement soit basé sur des travaux antérieurs, rendant ainsi possible des solutions à des problèmes plus complexes.
Un changement notable ici est la façon dont les frameworks étaient auparavant basés sur la notion de classes de base et de classes dérivées (une fonctionnalité d'exécution). Mais maintenant, les fonctionnalités les plus avancées sont souvent fortement basées sur des modèles "récursifs" (une fonctionnalité de compilation).
La STL a ses avantages et ses inconvénients, mais elle a survécu à l'épreuve du temps, si vous voulez quelque chose qui fonctionne et qui est simple, la STL a sûrement quelque chose pour vous aider à démarrer. Inutile de réinventer la roue (sauf pour des raisons didactiques).
Le matériel informatique a également fait de grands sauts à partir des années 1990, alors la mémoire et le processeur ne sont plus une contrainte pour le compilateur. Ainsi, la plupart des optimisations théoriques des livres sont désormais possibles.
Les prochaines étapes du langage sont la prise en charge de la programmation multicœur, qui fait partie de l'effort standard 0x.
la source
Oui et non. Certes, pour les nouveaux projets, il est de plus en plus populaire. Cependant, il existe encore des obstacles à l'adoption qui sont pratiques et non politiques, que d'autres n'ont pas mentionnés. Il existe de nombreuses bibliothèques C ++ commerciales qui utilisent des ABI d'anciens compilateurs qui ne prennent pas correctement en charge les fonctionnalités du C ++ moderne, et de nombreuses entreprises s'appuient sur ces bibliothèques. Sun Studio sur Solaris, par exemple, ne peut pas fonctionner avec Boost sans l'utilisation de STLport, mais toute bibliothèque commerciale tierce que vous souhaitez utiliser nécessitera la version Sun de la STL. Même histoire avec GCC 2.95 et Redhat Enterprise Linux.
la source
C'est incroyable le peu d'efforts nécessaires pour rendre le C ++ plus stable. Le système d'alerte est en place, mais il évolue peu. C'est encore plus facile de se tirer une balle dans un pied qu'il y a 10 ans. Je ne sais pas pourquoi, mais c ++ est toujours mon langage préféré. :)
la source