web-dev-qa-db-fra.com

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

J'ai un projet qui utilise actuellement C++ 11/14, mais il nécessite quelque chose comme std::filesystem, qui est uniquement disponible 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 puisse à 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?

Peut-être qu'il y a plus de choses à s'interroger. Pourquoi devrais-je ou ne devrais-je pas les utiliser? Je suis perplexe avec un nouveau projet et je ne sais pas quoi décider.

82
  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++ peut même décider d’abandonner une fonctionnalité ou lors du processus de normalisation, un défaut susceptible de modifier une fonctionnalité peut survenir.

Généralement, ce n'est pas une bonne idée de dépendre de fonctionnalités expérimentales. Les caractéristiques expérimentales correspondent exactement à ce que dit la Parole (c’est-à-dire expérimenter).

79
101010

Un membre de l'auditoire a posé une question lors de la conférence "C++ Standard Library" lors de la conférence CppCon 2016 ( YouTube ) sur le potentiel du nom experimental pour dissuader les utilisateurs d'utiliser quoi que ce soit dans la liste. espace de noms:

Est-ce que vous considérez que le contenu de l'espace de noms std::experimental Est prêt et qu'un argument peut être avancé, qu'il est effectivement prêt pour la production pour les trois prochaines années et que vous devez peut-être modifier votre code 3 ans plus tard peut-être?

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

Je pense qu’il existe un fort consensus au sein du comité selon lequel le produit est pratiquement prêt à la production. Comme je l'ai déjà dit, dans la plupart des cas, 99% de ces déchets sont déversés dans l'air. Nous voulons nous assurer que cela ne vous empêche pas de les utiliser. Vous pouvez comprendre pourquoi nous voulons placer de grandes fonctionnalités, de grands groupes de fonctionnalités, dans un tel contexte, de manière à ne pas perturber le reste du système de bibliothèque, mais cela facilite également son utilisation. Vous pouvez maintenant activer GCC avec un indicateur spécifique pour Concepts, ce qui vous permet en fait de le segmenter plus facilement.

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

Je vais prendre la position contraire ici. Herb [Sutter] a notamment déclaré, en tant que responsable du groupe de travail standard WG21, que lorsque nous nous sommes engagés sur la voie des TS, il ne pensait pas que les TS auraient réussi tant que nous n'aurions pas réussi à faire avancer les choses. signifie que nous ne sommes pas assez expérimentaux, nous ne sommes pas assez ambitieux dans l'utilisation des TS. Nous voulons vraiment que experimental soit un indice que, oui, ces choses sont sujettes à changement, nous ne sommes pas liés à cela et nous pouvons nous tromper. Cela vise à réduire les obstacles que nous considérons comme étant aussi ambitieux que possible [...] Maintenant que la norme semble être sur un cycle de publication de trois ans, nous devrions être beaucoup plus ambitieux en proposant des fonctionnalités réellement expérimentales. TS et peut-être faire avancer les choses plus rapidement dans la norme principale elle-même. Mais là encore, ce sera un sujet amusant pour nous lors des prochaines réunions du [comité de standard C++].

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

Il est important de faire la distinction entre le caractère expérimental de l'interface et le caractère expérimental de la mise en œuvre, car lorsque vous parlez de "production prête", qu'est-ce que cela signifie? Habituellement, "prêt pour la production", on pourrait penser à cela en parlant de la mise en œuvre. Il est tout à fait possible qu'une implémentation [de quelque chose dans std::experimental] Soit absolument [...] à l'épreuve des balles. [...] Quelque chose comme [...] l'en-tête <random> Dans TR1, [c'était] vraiment, vraiment gentil dans TR1, et vous auriez pu avoir une implémentation absolument infaillible de cela, mais s'est avéré que l'interface avait beaucoup tourné [avant la sortie de] C++ 11 et [...] si nous savions à l'époque ce que nous faisons maintenant, mettre un experimental aurait été un meilleur signal pour les gens ça, "Hey, peut-être que vous ne voulez pas utiliser std::experimental::variate_generator parce que, ah, ah, ça va disparaître en C++ 11".

Il semble donc que les concepteurs de bibliothèques standard et les membres du comité souhaitent que le contenu de l'espace de noms std::experimental Soit véritablement de nature "expérimentale" et qu'il ne faut pas le prendre pour acquis que quelque chose dans std::experimental sera dans la norme C++.

Et non, pour autant que je sache, il appartient aux éditeurs de bibliothèques standard de décider s’ils fournissent ou non des implémentations des différentes fonctionnalités dans std::experimental.

50
Joseph Thomson

"Expérimental" est un terme légèrement exagéré. La bibliothèque filesystem est originaire de Boost et y a parcouru quelques itérations avant d'être soumise à l'ISO.

Cependant, les normes ISO sont intentionnellement très prudentes. Le qualifier de expérimental signifie qu'ISO ne garantit pas explicitement que le nom sera stable; Il est parfaitement clair que vous devrez ré-adresser votre code dans le futur. Mais connaissant l'ISO, il y aura probablement 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 critiques (pensez aux chemins relatifs au lecteur Windows par exemple), et c'est exactement pourquoi une future norme pourrait casser votre code existant. Idéalement, le code serait cassé si et seulement si vous dépendiez de ce cas, mais ce n'est pas une garantie.

28
MSalters

Peut-être qu'il y a plus de choses à s'interroger.

Quelques points à considérer:

  • A quel point votre projet est-il multiplateforme? Si un seul compilateur est impliqué, vous pouvez vérifier son implémentation et son historique pour décider. Ou leur demander!

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

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

  • Quelles sont les alternatives?

    • Utilisez la fonctionnalité expérimentale, puis adaptez le code aux modifications lorsque/s'il devient standard. Pourrait être aussi simple que de supprimer experimental::, ou aussi difficile que de contourner le problème.
    • Ajouter une couche d'abstraction (commentaire de Serge Ballesta). Si la fonctionnalité expérimentale change, vos ré-écritures sont isolées. Pour une fonctionnalité standard, il 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 en réseau), il est possible d'utiliser boost :: filesystem (resp. Boost :: asio) ou de se replier au cas où experimental un échouerait ou disparaîtrait.
8
Pablo H