Les fonctionnalités expérimentales du C ++ moderne sont-elles fiables pour les projets à long terme?

87

J'ai un projet qui utilise actuellement C ++ 11/14, mais il nécessite quelque chose comme std::filesystem, qui n'est disponible qu'en C ++ 17, et par conséquent je n'ai pas la chance de l'utiliser actuellement. Je vois, cependant, qu'il est disponible dans mon compilateur actuel en tant que std::experimental::filesystem. Est-ce une bonne idée d'utiliser des fonctionnalités expérimentales, en supposant que je pourrais à l'avenir ajouter quelque chose comme:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Mes préoccupations sont:

1. Est-il garanti que tous les compilateurs conformes ont les mêmes fonctionnalités expérimentales?

2. Les fonctionnalités expérimentales sont-elles sujettes à de grands changements qui les rendent peu fiables?

Il y a peut-être plus de choses à se demander. Pourquoi devrais-je ou ne devrais-je pas les utiliser? Je suis perplexe face à un nouveau projet et je ne sais pas quoi décider.

Le physicien quantique
la source
25
le mot expérimental ne répond-il pas à vos questions?
101010
6
Principalement une question de goût, mais j'éviterais d'encombrer le code #idef CXX17. À mon humble avis, le moyen portable est de mettre tout le code lié au système de fichiers dans une seule unité de compilation (peut être une classe), de l'utiliser dans les parties restantes du code, de le coder avec la norme actuelle C ++ 11/14. Documentez comment et pourquoi vous l'écrivez comme ça, et portez-le finalement en C ++ 17 plus tard pendant une phase de maintenance, si cela a du sens. (commentant la question d'origine)
Serge Ballesta
4
C'était seulement "expérimental" comme candidat pour entrer dans la norme. Ce n'est pas le reflet de la qualité du code.
Galik
5
Il y a eu pas mal de changements entre la version "expérimentale" et la version finale de C ++ 17, voir le document P0492R1
Bo Persson
7
Dans le cas où filesystemvous encourez beaucoup moins de risques en l'utilisant que d'autres choses, car vous savez déjà qu'il est normalisé en C ++ 17 et que la spécification exacte en C ++ 17 est disponible publiquement. Donc, tout ce que vous avez à faire est de vous assurer que vous n'utilisez que les experimental::filesystemfonctionnalités qui sont dans la spécification C ++ 17. Et bien sûr, vous devez savoir que toutes vos plates-formes ciblées prennent en charge l'un des experimental::filesystemou le C ++ 17 std::filesystem.
Howard Hinnant

Réponses:

79
  1. Est-il garanti que tous les compilateurs conformes ont les mêmes fonctionnalités expérimentales?

Non, les fonctionnalités expérimentales sont facultatives.

  1. Les fonctionnalités expérimentales sont-elles sujettes à de grands changements qui les rendent peu fiables?

Oui, le comité C ++ pourrait même décider d'abandonner une fonctionnalité ou dans le processus de standardisation, un défaut pourrait survenir qui forcerait une fonctionnalité à changer.

En général, ce n'est pas une bonne idée de dépendre des fonctionnalités expérimentales. Les caractéristiques expérimentales sont exactement ce que le mot dit (c'est-à-dire expérimenter).

101010
la source
2
En ce qui concerne le deuxième point, veuillez noter que je parle de fonctionnalités qui sont déjà acceptées, mais qui peuvent être différentes.
The Quantum Physicist
14
@TheQuantumPhysicist: "déjà accepté" est un concept délicat. Tout peut être supprimé à tout moment par l'acceptation ultérieure d'un changement pour le supprimer, et cela est arrivé à chaque norme. Vous voudrez probablement attendre au moins le projet de norme internationale avant que l'ensemble de fonctionnalités soit raisonnablement fiable.
Kerrek SB
1
@KerrekSB: Ne parlez-vous pas du Final Draft International Standard aka FDIS. ? La rédaction est un processus assez permanent.
MSalters
1
@MSalters: Non, le DIS est probablement assez bon si vous êtes pressé. Et nous n'avons peut-être pas de FDIS cette fois de toute façon.
Kerrek SB
4
@KerrekSB: J'étais à peu près l'organisme national des Pays-Bas autour de C ++ 03;). Nous avions un secrétaire national pour le SC22 qui connaissait les procédures ISO et comment répondre à un FDIS, mais pas quoi. A part notre délégué du WG14 Randy Marques) aucun de nos délégués SC22 ne savait quoi que ce soit sur C ++. Et Randy se moquait juste du fait que C ++ aurait besoin de plus de pages pour définir tout son UB que C nécessaire pour le comportement défini - ne voudrait pas qu'il réponde à ce FDIS;)
MSalters
50

Une personne du public a posé une question lors de la conférence «C ++ Standard Library Panel» à la CppCon 2016 ( YouTube ) sur le potentiel du nom experimentalà dissuader les utilisateurs d'utiliser quoi que ce soit dans l'espace de noms:

Est-ce que vous considérez [le contenu de l' std::experimentalespace de noms] comme une production prête et est-ce un argument qui peut être avancé, [que] c'est effectivement prêt pour la production pour les 3 prochaines années, et peut-être devrez-vous changer votre code 3 ans plus tard, peut-être?

Michael Wong (président de SG5 et SG14 et rédacteur en chef du Concurrency TS) a répondu en premier à la question:

Je pense qu'il y a un fort consensus au sein du comité sur le fait que la production est pratiquement prête. Comme je l'ai déjà dit, dans la plupart des cas, 99% de celui-ci est largué par avion. Nous voulons nous assurer que ce n'est pas un obstacle pour que vous puissiez l'utiliser. Vous pouvez comprendre pourquoi nous voulons mettre de grandes fonctionnalités, de grands groupes de fonctionnalités, dans un tel contexte, afin que cela ne perturbe pas le reste de l'ensemble du système de bibliothèque, mais cela vous facilite également son utilisation. Vous pouvez maintenant activer GCC avec un indicateur spécifique pour les concepts, vous savez, cela vous permet en fait de le segmenter plus facilement.

Alisdair Meredith (ancien président du LWG) a ensuite suivi:

Je vais prendre la position contraire ici. Une des choses que Herb [Sutter] a dit en tant qu'organisateur du WG21, le groupe standard, lorsque nous nous sommes lancés sur la voie des TS, c'est qu'il ne pensait pas que les TS auraient réussi tant que nous n'aurions pas réussi à faire avancer quelque chose, car cela Cela signifie que nous ne sommes pas assez expérimentaux, que nous ne sommes pas assez ambitieux dans l'utilisation des TS. Nous voulons vraiment çaexperimentalpour indiquer que, oui, ces choses sont sujettes à changement, nous ne sommes pas contraignants à cela, et nous pouvons nous tromper. C'est pour abaisser notre barrière pour les choses que nous considérons comme aussi ambitieuses et atteindre que nous pouvons [...] Maintenant que la norme semble être sur un cycle de publication de trois ans, nous devrions être beaucoup plus ambitieux en mettant des fonctionnalités vraiment expérimentales dans le TS, et peut-être faire avancer les choses plus rapidement dans la norme principale elle-même. Mais encore une fois, ce sera un sujet amusant pour nous de discuter lors des prochaines réunions [du comité de normalisation C ++].

Stephan T.Lavavej (responsable de l'implémentation STL de Microsoft) a été le dernier à répondre:

Il est important de faire une distinction entre le caractère expérimental de l'interface et le caractère expérimental de l'implémentation, car quand vous dites «production prête», qu'est-ce que cela signifie? Habituellement, «prêt pour la production», vous penseriez à cela en parlant de la mise en œuvre. Il est tout à fait possible qu'une implémentation [de quelque chose en std::experimental] soit absolument [...] à l'épreuve des balles. [...] Quelque chose comme [...] l'en- <random>tête de TR1, [c'était] vraiment, vraiment sympa dans TR1, et vous auriez pu avoir une implémentation absolument à toute épreuve de cela, mais il s'est avéré que l'interface a tourné substantiellement [avant la sortie de] C ++ 11 et [...] si nous savions à l'époque ce que nous faisons maintenant, mettre un experimentalmessage aurait été un meilleur signal pour les gens: utilisationstd::experimental::variate_generator parce que, ha-ha, il va disparaître en C ++ 11 ".

Il semble donc que les développeurs de bibliothèques standard et les membres du comité souhaitent que, à l’avenir du moins, le contenu de l’ std::experimentalespace de nom soit de nature véritablement «expérimentale», et il ne devrait pas être tenu pour acquis que quelque chose dans std::experimentalsera en faire le standard C ++.

Et non, pour autant que je sache, c'est aux fournisseurs de bibliothèques standard de décider s'ils fournissent des implémentations pour les différentes fonctionnalités à l'intérieur std::experimental.

Joseph Thomson
la source
47
10 ans après avoir lu le nom pour la première fois, le fait que le mainteneur de Microsoft STL s'appelle STL me fait encore rire.
Jörg W Mittag
19
@ JörgWMittag vous devriez rencontrer leur responsable du compilateur, Michael Sam Victor Collins
MM
28

«Expérimental» est un terme légèrement exagéré. La filesystembibliothèque est issue de Boost et y a subi quelques itérations, avant d'être soumise à l'ISO.

Cependant, les normes ISO sont intentionnellement très conservatrices. L'appeler expérimental signifie que l'ISO ne promet pas explicitement que la dénomination sera stable; il est tout à fait clair que vous devrez réadresser votre code dans le futur. Mais connaissant l'ISO, il est probable qu'il y aura des indications sur la manière de procéder.

Quant à la compatibilité entre les compilateurs, attendez-vous à ce qu'elle soit raisonnable. Mais il y aura des cas secondaires (pensez aux chemins relatifs aux lecteurs Windows, par exemple), et c'est exactement pourquoi une future norme pourrait casser votre code existant. Idéalement, cela casserait votre code si et seulement si vous dépendiez de ce cas d'angle, mais ce n'est pas une garantie.

MSalters
la source
8

Il y a peut-être plus de choses à se demander.

Quelques points à considérer:

  • À quel point votre projet est-il multiplateforme? S'il n'y a qu'un seul compilateur impliqué, vous pouvez inspecter son implémentation et ses antécédents pour décider. Ou demandez-leur!

  • Quelle est la taille de votre base de code? Quelle serait l’impact des changements?

  • Dans quelle mesure les fonctionnalités fournies par l'API / la bibliothèque / la fonctionnalité sont-elles fondamentales pour votre projet?

  • Quelles sont les alternatives?

    • Utilisez la fonction expérimentale, puis adaptez le code aux modifications quand / s'il devient standardisé. Cela peut être aussi simple que la suppression experimental::ou aussi difficile que de forcer des solutions de contournement.
    • Ajoutez un calque d'abstraction (commentaire de Serge Ballesta). Si la fonctionnalité expérimentale change, vos réécritures sont isolées. Pour une fonctionnalité standard, cela peut être excessif (std :: filesystem est déjà une couche d'abstraction ...).
    • Utilisez une autre API / bibliothèque. Mêmes questions: maturité? robustesse? la stabilité? portabilité? facilité d'utilisation? fonctionnalités?
  • Dans le cas de std :: filesystem (ou du TS réseau), il existe boost :: filesystem (resp. Boost :: asio) comme alternative ou fallback, au cas où celui- experimentalci échouerait ou disparaîtrait.
Pablo H
la source