Pourquoi C ++ ne peut pas adopter l'approche de D pour l'implémentation de son concept?


19

Comme beaucoup d'entre vous le savent, les concepts , l'approche de C ++ pour contraindre les types possibles pour un argument de modèle n'ont pas été inclus dans C ++ 11.

J'ai appris que le langage de programmation D 2.0 a une fonctionnalité similaire pour sa programmation générique. Sa solution me semble assez élégante et simple.

Ma question est donc pourquoi C ++ ne peut pas utiliser une approche similaire .

  • L'objectif du concept C ++ pourrait être plus grand que ce que l'implémentation de D fournit?
  • Ou l'héritage de C ++ l'empêche-t-il d'adopter une telle approche?
  • Ou tout autre?

Merci pour vos réponses.

ps Pour voir quelques exemples de la puissance de programmation générique de D, veuillez vous référer à ceci: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534


2
Cette question aurait dû être migrée vers programmers.se. (J'ai voté pour cela, mais 3 votes étaient pour "pas constructif").
iammilind

3
Je pense que la question n'est peut-être pas rédigée de la manière la plus constructive, mais qu'elle a de la valeur. J'aimerais que quelqu'un explique comment D gère les concepts et puisse le comparer avec les deux principales approches que le comité C ++ a adoptées sur les concepts avant de décider de reporter complètement la fonctionnalité ... Si cela doit être fermé, alors il devrait être le moins du monde soit déplacé vers les programmeurs
David Rodríguez - dribeas

2
@David: J'ai voté pour la réouverture (et puis peut-être, elle peut être déplacée vers le site des programmeurs)
Nawaz

1
D'accord avec David. Je ne vois aucune raison de dire préventivement "non constructif" avant que quiconque puisse même essayer de construire quelque chose. avec 0 réponses, la "constructivité" est 0/0 donc indéterminée.
Emilio Garavaglia

1
@ jj1: Pouvez-vous fournir une brève explication sur l'approche de D pour ceux d'entre nous qui ne connaissent pas la langue?
David Rodríguez - dribeas

Réponses:


9

Le Standard de C ++ est un document normatif, qui définit des règles qui resteront (pour la plupart non affectées) dans les futurs documents. Par conséquent, le comité a adopté une approche très prudente concernant ses mises à jour.

Les ajouts à la bibliothèque standard ont été quelque peu faciles. Un certain nombre de bibliothèques étaient à Boost depuis longtemps: il avait été prouvé qu'elles fonctionnaient.

Les ajouts aux concepts de base dans le langage sont cependant beaucoup plus difficiles à expérimenter, car cela nécessite d'abord de modifier un compilateur. Une fonctionnalité C ++ 03 (l'exportation de modèles) avait été spécifiée sans le support du compilateur ... le résultat était horrible. Les implémenteurs du frontend du compilateur EDG l'ont signalé comme une tâche énorme (plusieurs années-homme) pour un gain très faible. Aucun autre compilateur n'a jamais essayé de l'implémenter. Ce n'est pas une situation confortable.

Des fonctionnalités comme constexprou static_assertétaient faciles (et déjà émulées par les bibliothèques). Les lambdas sont assez bien compris et mis en œuvre dans une variété d'autres langues, il y a déjà eu des recherches approfondies, donc c'était principalement une question de syntaxe.

D'un autre côté, les concepts ont été jugés trop nouveaux et non testés . Ils étaient à peine précisés dans le temps, il n'y avait pas eu de preuve de concept ... et donc ils ont été rejetés, plutôt que de les attendre (ou de se tromper).

Pourquoi ne pas suivre D? Rien ne dit que ce ne sera pas le cas. Le comité a encouragé les gens à repenser à zéro, sans délai urgent, et à essayer de les inclure dans un compilateur pour voir comment ils interagissent avec d'autres fonctionnalités du langage. Il y a notamment la question de la séparation des concepts et des cartes conceptuelles: doivent-ils être regroupés en un ou non?

FYI: Il existe actuellement une branche de Clang dédiée à cette expérimentation, dirigée par Larisse Voufo de l'université de l'Indiana.


Commentaire mineur: le mot-clé d'exportation était en fait une fonctionnalité c ++ 98 (la standardisation d'origine). Le rectificatif de 2003 portait principalement sur les fonctionnalités des bibliothèques.
ex0du5

@ ex0du5: Oui, le '03 est une révision mineure de la norme C ++ 98, qui concernait principalement les corrections.
Matthieu M.

3

Pour la norme de 2011, les concepts C ++ étaient ce sur quoi on travaillait, et ils ont finalement été supprimés de cette norme, car ils n'étaient pas "suffisamment cuits". Les travaux se poursuivent sur les concepts C ++, ce qui pourrait les amener à devenir le prochain standard. Il se pourrait, cependant, que certaines personnes travaillent sur une proposition pour la prochaine norme qui est similaire aux contraintes du modèle de D. Que cela se produise ou non reste à voir. Pour autant que je sache, il n'y avait pas une telle proposition pour la norme de 2011, donc il n'y avait aucune chance pour qu'elle en fasse cette norme indépendamment de ses mérites, mais ce qui en fera ou non dans la prochaine norme est complètement inconnu À ce point.

Je ne connais aucune raison majeure pour laquelle quelque chose de similaire aux contraintes de modèle de D ne pourrait pas être implémenté pour C ++, bien que étant donné que C ++ est généralement plus limité dans ce qu'il peut faire au moment de la compilation, il pourrait être plus difficile de les faire fonctionner tout comme comme ils le font en ré (bien que l'introduction de trucs comme ça constexpraide certainement).

Donc, vraiment, je pense que la réponse courte est qu'il n'y a aucune raison technique pour laquelle quelque chose de similaire aux contraintes de modèle de D ne pourrait pas être en C ++.

La question est de savoir si une telle proposition sera faite pour la prochaine norme et comment elle se comparera aux propositions similaires (par exemple, les propositions relatives aux concepts). En supposant qu'une proposition acceptable puisse être faite, je m'attends à ce que quelque chose de similaire aux concepts ou aux contraintes de modèle de D en fasse la prochaine norme simplement parce qu'il y a beaucoup de désir. La question est de savoir si quelqu'un peut proposer une proposition suffisamment solide et "suffisamment cuite" pour être acceptable.


2

Vous voulez dire que le modèle de D est contraint?

Pour autant que je sache, des concepts C ++ ont été proposés au nom de boost :: concept. Le problème, ici, est que boost est une bibliothèque écrite pour C ++ 03. C ++ 11 possède d'autres capacités de syntaxe qui permettent d'implémenter certaines choses d'une manière différente que C ++ 03 permet (par conséquent, le boost lui-même peut être réécrit en profitant de la nouvelle syntaxe).

Le comité standard a abandonné les concepts car il aurait fallu trop de temps pour les spécifier (retardant ainsi à nouveau l'approbation c ++ 11). Ils iront probablement dans la prochaine version C ++.

Pendant ce temps, la syntaxe D est différente de celle de C ++ et D lui-même conserve certaines capacités d'évaluation d'expression au moment de la compilation que C ++ ne peut pas toujours avoir sans casser du code hérité (quelque chose que D n'a pas, ayant un historique plus court). Le C ++ lui-même a maintenant static_assertet costexpr, ce qui permet d'améliorer les capacités d'évaluation du temps de compilation. Peut-être à l'avenir atteindra un niveau similaire.


2

Voici un QA avec Herb Sutter, il parle de concepts à 15 minutes.

http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers

Si vous aimez ça, en voici un autre: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11

Maintenant, pour votre question. Pourquoi pas la version D? Eh bien pourquoi l'utiliser? C ++ est un langage très complexe et stable. Chaque fonctionnalité doit être sélectionnée avec beaucoup de soin, car elle doit généralement être prise en charge pendant des décennies. Si vous regardez la première norme C ++ et suivez les révisions, il existe des fonctionnalités obsolètes, mais même celles-ci doivent toujours être prises en charge. Il est donc logique de concevoir des concepts à 100% adaptés au C ++.

Quant à savoir pourquoi il n'a pas été inclus dans C ++ 0x. Et bien parce que c'était énorme. La proposition comptait 100 pages et était très difficile à mettre en œuvre. Il a été décidé que cette fonctionnalité a besoin de plus de temps pour mûrir jusqu'à ce qu'elle soit incluse dans la norme.


2

Tout simplement, C ++ a beaucoup plus de bagages historiques que D. Il serait beaucoup plus facile d'implémenter énormément de choses sans le fait que C ++ possède d'énormes quantités de code historique qui doivent continuer à fonctionner correctement et comme prévu. D n'a pas ce problème.


Vous avez peut-être mal formulé cela, mais le problème n'est pas le code hérité, le problème est que toute nouvelle fonctionnalité sera présente dans la langue pendant des décennies et doit être prise en charge. Cela signifie que chaque nouvelle fonctionnalité doit être choisie très soigneusement.
Let_Me_Be

@Let_Me_Be: Oui, le problème est dans le code hérité, nous aurons dix ans plus tard si nous ajoutons des concepts maintenant.
David Thornley,
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.