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
Réponses:
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
constexpr
oustatic_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.
la source
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
constexpr
aide 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.
la source
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_assert
etcostexpr
, ce qui permet d'améliorer les capacités d'évaluation du temps de compilation. Peut-être à l'avenir atteindra un niveau similaire.la source
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.
la source
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.
la source