Question

Récemment, j'ai commencé à lire (juste un peu) le brouillon en cours pour le futur standard C ++ 11.

Il existe de nombreuses nouvelles fonctionnalités, dont certaines sont déjà disponibles via Boost Libs. Bien sûr, je suis assez content de ce nouveau standard et j'aimerais jouer avec toutes les nouvelles fonctionnalités dès que possible.

Quoi qu'il en soit, en parlant de ce brouillon avec des amis, des développeurs C ++ de longue date, des inquiétudes sont apparues. Alors, je vous demande (d'y répondre):

1) La langue elle-même

Cette mise à jour est énorme, peut-être trop énorme pour une seule mise à jour standard. Énorme pour les constructeurs de compilateurs (même si la plupart d'entre eux ont déjà commencé à implémenter certaines fonctionnalités), mais également pour les utilisateurs finaux.

En particulier, un de mes amis m'a dit " c'est une sorte de nouvelle langue ".

  • Pouvons-nous considérer cela comme une nouvelle langue après cette mise à jour?
  • Envisagez-vous de passer à la nouvelle norme ou de suivre les "anciennes" " norme (s)?

2) Connaissance de la langue

  • Quel sera l'impact de la nouvelle norme sur la courbe d'apprentissage?
  • L'enseignement de la langue sera plus difficile?
  • Certaines fonctionnalités, bien qu'impressionnantes, semblent un peu trop "académiques". pour moi (comme définition je veux dire). Est-ce que je me trompe?
  • La maîtrise de tous ces nouveaux ajouts pourrait être un cauchemar, n'est-ce pas?
Était-ce utile?

La solution

En bref, non, nous ne pouvons pas considérer cela comme un nouveau langage. C'est le même langage, de nouvelles fonctionnalités. Mais au lieu d’être utilisés avec les bibliothèques Boost, ils deviendront des inclusions standard si vous utilisez un compilateur prenant en charge le standard 0x.

Il n'est pas obligé d'utiliser le nouveau standard avec un compilateur prenant en charge le nouveau standard. Il faudra apprendre et utiliser le nouveau standard si certaines contraintes existent sur le logiciel en cours de développement, mais c'est une contrainte pour toute tentative de logiciel. Je pense que les nouvelles fonctionnalités apportées par la norme 0x vont rendre certaines choses plus faciles et moins sujettes aux erreurs. Il est donc avantageux de connaître les nouvelles fonctionnalités et comment elles vont améliorer leur stratégie de conception. pour les travaux futurs. Il faudra également l’apprendre pour que, lorsqu’ils travaillent sur un logiciel développé avec ce logiciel, ils comprennent ce qui se passe et ne fassent pas de grands boo-boos.

Pour savoir si je vais " passer à la nouvelle norme ", si cela signifie que je vais apprendre la nouvelle norme et l’utiliser où elle est applicable et où elle augmente ma productivité, alors oui, Je prévois certainement de changer . Cependant, si cela signifie que je vais me limiter à ne travailler qu'avec les nouvelles fonctionnalités de la norme 0x, alors non, car une grande partie de mon travail implique du code écrit avant la norme et ce serait une entreprise colossale. tout repenser pour utiliser les nouvelles fonctionnalités. Non seulement cela, mais cela pourrait aussi introduire de nouveaux bugs et problèmes de performances que je ne connais pas sans expérience.

L’apprentissage de C ++ a toujours été l’un des défis les plus difficiles qu’un programmeur puisse entreprendre. L'ajout de nouvelles fonctionnalités à la langue ne changera pas la difficulté d'apprendre sa syntaxe et son utilisation efficace, mais l'approche changera. Les gens continueront à en apprendre davantage sur les pointeurs et leur fonctionnement, mais également sur les pointeurs intelligents et leur gestion. Dans certains cas, les gens vont apprendre les choses différemment d’avant. Par exemple, les personnes devront toujours apprendre à initialiser les éléments, mais à présent, elles découvriront l’initialisation uniforme et les listes d’initialiseurs comme moyens principaux de procéder. Dans certains cas, il sera peut-être plus facile de comprendre les choses en ajoutant la nouvelle syntaxe for pour les plages ou le type de renvoi automatique dans une déclaration de fonction. Je pense que dans l’ensemble, le C ++ deviendra plus facile à apprendre et à utiliser tout en devenant plus facile à enseigner.

Maîtriser une langue est un objectif à long terme, cela ne peut se faire en une nuit. C'est bête de penser qu'on peut maîtriser rapidement quelque chose d'aussi complexe que C ++. Il faut de la pratique, de l'expérience et du code de débogage pour vraiment intégrer quelque chose. L'apprentissage académique est une chose, mais utiliser ces connaissances est un monstre totalement différent. Je pense que si l'on maîtrise déjà le langage C ++, les nouveaux concepts ne constitueront pas un fardeau trop lourd, mais les nouveaux venus auront peut-être un avantage en ce sens qu'ils ne prendront pas la peine d'apprendre certaines des méthodes les plus obsolètes de faire les choses. .

Autres conseils

1) La langue elle-même

Pour autant que je sache, il n'y a vraiment pas de changements décisifs entre C ++ '03 et C ++' 0x. Le seul que je peux penser ici concerne l'utilisation auto en tant que spécificateur de classe de stockage, mais puisqu'il n'a pas de sémantique ce qui signifie que je ne vois pas cela être un problème.

Il existe de nombreux autres correctifs académiques à la norme qui sont très necssary, par exemple de meilleures descriptions de la disposition des membres Les données. Enfin, les architectures multi-core / cpu devenant la norme, Il était indispensable de réparer le modèle de mémoire.

2) Connaissance de la langue

Personnellement, j’estime que pour 99,9% des développeurs C ++, le nouveau langage sera plus facile à utiliser. Je pense en particulier aux fonctionnalités telles que auto, lambda's et constexpr. Ces fonctionnalités devraient rendre l'utilisation de la langue plus agréable.

À un niveau plus avancé, vous disposez d'autres fonctionnalités telles que la variadic modèles, etc., qui aident les utilisateurs plus avancés.

Mais il n'y a rien de nouveau ici, je suis toujours surpris de la quantité de Les développeurs C ++ de tous les jours qui n’ont pas utilisé (ou même entendu parler) la STL.

D'un point de vue personnel, la seule caractéristique qui me préoccupe un peu dans la nouvelle norme est celle des concepts. Comme il s’agit d’un changement très important, les mêmes problèmes que ceux rencontrés avec les modèles (c'est-à-dire des implémentations complètement défectueuses) constituent un réel danger.

Mise à jour après le vote du FDIS pour le vote:

En l'occurrence, les "concepts" ont été supprimés pour C ++ 0x et seront repris pour C ++ 1x. À la fin, il y a des modifications autres que auto qui pourraient briser votre code, mais en pratique, elles seront probablement assez rares. Les principales différences se trouvent à l’annexe C.2 du document FDIS (pdf) .

Pour moi, l'un des plus importants sera:

unique_ptr + std :: move ()!

Imaginez:

  1. Pointeur intelligent sans surcharge:

    • pas de comptage de références
    • pas de stockage supplémentaire pour la variable de compteur de référence
  2. Pointeur intelligent pouvant être déplacé , c'est-à-dire. aucun appel de destructeur / constructeur lorsqu'il est déplacé

Qu'est-ce que cela vous donne? Exceptionnez les conteneurs sûrs et bon marché (pointeurs ..) sans aucun frais . Le conteneur ne pourra mémoriser que memcpy () unique_ptrs, il n’y aura donc aucune perte de performances causée par le retour à la ligne du pointeur normal par le pointeur intelligent! Donc, encore une fois:

  1. Vous pouvez utiliser des pointeurs
  2. Ce sera sûr (pas de fuite de mémoire)
  3. Cela ne vous coûtera rien
  4. Vous pourrez les stocker dans des conteneurs et ils seront en mesure de faire des "massifs". se déplace (comme un membre) avec eux à moindre coût.
  5. Ce sera l'exception sauf

:

Autre point de vue:

  1. En fait, lorsque vous déplacez un groupe d'objets à l'aide de copy (), il existe un appel de constructeur et de destructeur pour chaque instance d'objet. Lorsque vous copiez 1 000 objets de 1 ko, il y aura au moins un appel à la fonction memcpy () et 2 000.
  2. Si vous souhaitez éviter les milliers d'appels, vous devez utiliser des pointeurs.
  3. Mais les indicateurs sont: dangereux, etc. Les indicateurs intelligents ne vous aideront pas, ils résolvent d’autres problèmes.
  4. Il n'y a pas de solution pour l'instant. Vous devez payer de temps en temps pour la conception C ++ RAII / pointeur / valeurvars. Mais avec C ++ 0x, utiliser unique_ptr permettra de faire "massive". mouvements d'objets (oui, pratiquement, parce que le pointeur sera intelligent) sans "massive" Appels constructeur / destructeur, et sans risque d’utilisation de pointeurs! pour moi, c’est vraiment important.

C’est comme assouplir le concept RAII (en raison de l’utilisation de pointeurs) sans perdre les avantages de RAII. Un autre aspect: le pointeur enveloppé dans unique_ptr () se comportera sous de nombreux aspects similaires à la variable d'objet de référence java. La différence est que unique_ptr () ne pourra exister que dans une seule portée à la fois.

Votre ami a partiellement raison mais surtout tort: ??c'est le même langage avec des fonctionnalités supplémentaires.

La bonne chose est que vous n’avez pas à maîtriser toutes les nouvelles fonctionnalités. L'un des principaux mandats d'un organisme de normalisation est de ne pas casser le code existant, vous pourrez donc continuer à coder joyeusement dans votre ancien style (je suis toujours principalement un codeur C même si je le fais en C ++. "Applications: -).

Ce n'est que lorsque vous souhaitez consulter les nouvelles fonctionnalités que vous devez vous appuyer sur les modifications. C’est un processus qui peut s’étirer sur plusieurs années si besoin est.

Mon conseil est de connaître toutes les nouvelles fonctionnalités à un niveau élevé (ne serait-ce que pour avoir l'air d'avoir une bonne connaissance lors d'entretiens d'embauche), mais d'apprendre les détails lentement.

À certains égards, C ++ 0x devrait être plus facile à enseigner / à apprendre que le C ++ actuel:

  • Boucler dans un conteneur - la nouvelle syntaxe pour est beaucoup plus simple que for_each + foncteur ou la boucle manuellement à l'aide d'itérateurs
  • Initialisation des conteneurs: nous pourrons initialiser les séquences avec la même syntaxe que les tableaux
  • Gestion de la mémoire: l'ancien code auto_ptr est obsolète, un code_unique et un code partagés> bien définis.

Les Lambdas, bien qu’ils soient nécessairement plus complexes que les équivalents d’autres langages, seront plus faciles à apprendre que le processus C ++ 98 de définition des objets fonction dans une autre portée.

Prévoyez-vous de passer à la nouvelle norme ou de suivre les " anciennes " norme (s)?

Il y a un an, j’écrivais strictement C89, car le produit en question était extrêmement portable et embarquait sur des plates-formes intégrées. Certains d’entre eux avaient des compilateurs avec des idées radicalement différentes sur les éléments de C99 qu’il valait la peine de supporter. Ainsi, une norme vieille de 20 ans n’a toujours pas été remplacée par son successeur âgé de 10 ans.

Je ne m'attends donc pas à pouvoir quitter C ++ 03 de si tôt.

Je compte utiliser les fonctionnalités C ++ 0x, le cas échéant. Tout comme j'utilise les fonctionnalités C99 dans le code C, et les extensions gcc en C et C ++ (et utiliserais les extensions MSVC, même si je n'ai jamais travaillé sur du code uniquement pour MSVC pendant plus de peu de temps). Mais je pense que ce sera "agréable d’avoir" plutôt que de base, à peu près indéfiniment.

Vous avez raison, mais ça a toujours été le cas. Il y a beaucoup de code C ++ qui ne contient toujours rien du standard '98 juste à cause du conservatisme inné de certains codeurs. Certains d'entre nous se souviennent d'un temps sombre avant l'espace de noms std :: (avant les espaces de noms, en fait), lorsque chacun écrivait sa propre classe de chaînes et que les pointeurs se déplaçaient nus en permanence. Il y a une raison pour laquelle nous parlons de " style C ++ moderne " - distinguer le style précédent, car certaines personnes doivent encore conserver ou mettre à jour le code dans ce style.

Toute langue doit évoluer pour survivre, et toute langue qui évolue aura une base d’utilisateurs divisée, ne serait-ce que parce que les gens diffèrent dans leur attitude à l’égard des coûts d’opportunité liés à l’application de nouvelles fonctionnalités linguistiques à leur propre travail.

Avec l'avènement de C ++ 0x dans les compilateurs d'expédition, cette conversation sera répétée dans les équipes de développement du monde entier:

YOUNGSTER: Je viens de découvrir ces choses appelées lambdas! Et je trouve beaucoup de façons de les utiliser pour rendre notre code plus expressif! Ecoute, j'ai réécrit ton ancien cours de Foo, n'est-ce pas beaucoup plus simple?

OLDSTER: Il n’y avait aucun problème avec mon ancien cours de Foo. Vous cherchez simplement des excuses pour utiliser un "cool" nouvelle fonctionnalité inutilement. Pourquoi continuez-vous à essayer de rendre ma vie si compliquée? Pourquoi dois-je continuer à apprendre de nouvelles choses? Nous avons besoin d'une autre guerre, c'est ce dont nous avons besoin.

YOUNGSTER: Vous êtes trop coincé dans vos habitudes, mon vieux, nous ne devrions même pas utiliser le C ++ ces jours-ci ... si cela ne tenait qu'à moi -

OLDSTER: Si c’était à moi de décider, nous serions restés avec PL / 1, mais non ... ma femme a dû voter pour Carter et maintenant nous sommes coincés avec toute cette merde orientée objet. Vous ne pouvez rien faire avec std :: transform et les lambdas que je ne puisse pas faire avec un goto et quelques étiquettes.

etc.

Votre carrière en programmation impliquera toujours d’apprentissage et de réapprentissage. Vous ne pouvez pas vous attendre à ce que c ++ reste le même jusqu'à votre retraite et utilise les mêmes méthodes et pratiques que celles que vous utilisiez il y a 40 ans. La technologie continue et rapidement. C'est à vous de le suivre. Bien sûr, vous pouvez ignorer cela et continuer à travailler de la même façon que vous le faites actuellement, mais dans 5/10 ans, vous deviendrez tellement désuet que vous serez obligé de tout apprendre alors que vous essayerez de changer de travail. . Et il aura été beaucoup plus facile d'apprendre au travail toutes ces années auparavant:)

Il y a quelques mois, j'ai entendu Bjarne Stroustrup donner une conférence intitulée 50 ans de C ++ . Certes, je ne suis pas un programmeur C ++, mais il m'a semblé qu'il ne pensait certainement pas que 0x était un nouveau langage!

Si nous pouvons ou non considérer cela comme un "nouveau langage", je pense que c'est une sémantique. Cela ne fait aucune différence. Il est rétrocompatible avec notre code C ++ actuel et constitue un meilleur langage. Que nous le considérions ou non comme "la même langue" n'a pas d'importance.

À propos de l’apprentissage de la langue, rappelez-vous que bon nombre des nouvelles fonctionnalités sont là pour rendre la langue plus facile à apprendre et à utiliser. La plupart des fonctionnalités qui ajoutent de la complexité sont destinées uniquement aux développeurs de bibliothèques. Ils peuvent utiliser ces nouvelles fonctionnalités pour créer des bibliothèques meilleures, plus efficaces et plus faciles à utiliser, que vous pouvez utiliser sans connaître les fonctionnalités. Plusieurs modifications simplifient et généralisent les fonctionnalités existantes, ce qui les rend plus faciles à apprendre pour les nouveaux venus.

C’est une grande mise à jour, certes, mais elle repose sur une décennie d’expérience avec le standard C ++ actuel. Chaque changement existe, car l'expérience a montré qu'il était nécessaire. En fait, le comité se montre extrêmement prudent et conservateur et a refusé un grand nombre d’autres améliorations linguistiques. Ce qui est ajouté ici, ce sont uniquement les principes fondamentaux sur lesquels 1) tout le monde pourrait s’accorder et 2) pourraient être spécifiés à temps, sans retarder la nouvelle norme.

Ce ne sont pas simplement quelques concepteurs de langages qui réfléchissent aux nouvelles fonctionnalités qu'ils aimeraient essayer.

Les concepts et les cartes conceptuelles vont considérablement augmenter la faisabilité des référentiels de modèles. Si vous avez déjà versé sur la source Boost, vous comprendrez ce que je veux dire. Vous passez constamment de la source à la documentation, car le langage ne dispose pas des fonctionnalités nécessaires pour exprimer les concepts de modèles. Espérons que Concepts + Duck Typing nous donnera le meilleur des deux mondes: les points d’entrée dans les bibliothèques de modèles peuvent déclarer explicitement les exigences, mais ils ont toujours la liberté offerte par Duck Typing lors de l’écriture de code générique.

Il y a beaucoup de bonnes choses dans C ++ 0x, mais ce sont surtout des changements évolutifs qui affinent ou élargissent les idées existantes. Je ne pense pas que ce soit suffisamment différent pour justifier l'appeler un "nouveau langage".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top