Wie viele von euch wissen, Konzepte , C ++ 's Ansatz für mögliche Typen für ein Template - Argument beschränke ausgefallen ist in C ++ 11 aufgenommen werden.
Ich habe erfahren, dass die Programmiersprache D 2.0 eine ähnliche Funktion für die generische Programmierung hat. Die Lösung erscheint mir recht elegant und einfach.
Meine Frage ist also, warum C ++ keinen ähnlichen Ansatz verwenden kann .
- Das Ziel des C ++ - Konzepts könnte größer sein als das, was die Implementierung von D bietet?
- Oder verhindert das Erbe von C ++ einen solchen Ansatz?
- Oder irgend ein anderer?
Danke für deine Antworten.
ps Unter /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534 finden Sie einige Beispiele für die generische Programmierleistung von D
Antworten:
Der Standard von C ++ ist ein normatives Dokument, das Regeln festlegt, die in zukünftigen Dokumenten (größtenteils unberührt) bleiben. Daher ist der Ausschuss bei seinen Aktualisierungen sehr vorsichtig vorgegangen.
Die Ergänzungen zur Standardbibliothek waren etwas einfach. Eine Reihe von Bibliotheken war schon lange in Boost: Es wurde bewiesen, dass sie funktionierten.
Ergänzungen zu Kernkonzepten in der Sprache sind jedoch viel schwieriger zu testen, da zunächst ein Compiler geändert werden muss. Eine C ++ 03-Funktion (der Export von Vorlagen) wurde ohne Compiler-Unterstützung angegeben ... das Ergebnis war grauenhaft. Die Implementierer des EDG-Compiler-Frontends gaben an, dass dies eine gewaltige Aufgabe (mehrere Mannjahre) für sehr wenig Gewinn sei. Kein anderer Compiler hat jemals versucht, es zu implementieren. Es ist keine angenehme Situation.
Funktionen wie
constexpr
oderstatic_assert
waren einfach (und bereits von Bibliotheken emuliert). Lambdas sind in einer Vielzahl anderer Sprachen recht gut verstanden und implementiert. Es wurden bereits umfangreiche Untersuchungen durchgeführt, sodass es hauptsächlich um die Syntax ging.Andererseits wurden Konzepte als zu neu und unerprobt bewertet . Sie wurden kaum rechtzeitig spezifiziert, es gab keinen Proof of Concept ... und so wurden sie abgelehnt, anstatt auf sie zu warten (oder einen Fehler zu machen).
Warum nicht D folgen? Es gibt kein Sprichwort, das es nicht wird. Das Komitee hat die Leute ermutigt, von Grund auf neu zu überdenken, ohne eine dringende Frist einzuhalten, und zu versuchen, sie in einen Compiler einzubeziehen, um zu sehen, wie sie mit anderen Funktionen in der Sprache interagieren. Es stellt sich vor allem die Frage, wie man Konzepte und Konzeptlandkarten trennt: Sollten sie als eine gebündelt werden oder nicht?
Zu Ihrer Information: Derzeit gibt es eine Zweigstelle von Clang, die sich diesem Experiment widmet und von Larisse Voufo von der Universität von Indiana geleitet wird.
quelle
Für den Standard von 2011 wurde an C ++ - Konzepten gearbeitet, und sie wurden letztendlich von diesem Standard gestrichen, weil sie nicht "gebacken" wurden. Die Arbeit an C ++ - Konzepten wird fortgesetzt, was dazu führen kann, dass sie in den nächsten Standard aufgenommen werden. Es könnte jedoch sein, dass einige Leute an einem Vorschlag für den nächsten Standard arbeiten, der den Vorlagenbeschränkungen von D ähnelt. Ob das passiert oder nicht, bleibt abzuwarten. Soweit ich weiß, gab es keinen derartigen Vorschlag für die Norm 2011, so dass es keine Chance gab, sie unabhängig von ihren Vorzügen in diese Norm aufzunehmen, aber welcher Wille oder welche Absicht es in die nächste Norm schafft, ist völlig unbekannt An diesem Punkt.
Mir ist kein wichtiger Grund bekannt, warum etwas Ähnliches wie die Template-Einschränkungen von D für C ++ nicht implementiert werden konnte, obwohl es angesichts der Tatsache, dass C ++ im Allgemeinen in seinen Fähigkeiten zur Kompilierungszeit eingeschränkt ist, möglicherweise schwieriger ist, sie so zu implementieren, wie sie funktionieren gut wie in D (obwohl die Einführung von Sachen wie
constexpr
sicherlich hilft).Ich denke also, dass die kurze Antwort lautet, dass es keinen technischen Grund gibt, warum etwas, das Ds Vorlagenbeschränkungen ähnelt, nicht in C ++ sein kann.
Die Frage ist, ob ein solcher Vorschlag für die nächste Norm gemacht wird und wie er mit ähnlichen Vorschlägen (z. B. Vorschlägen zu Konzepten) verglichen werden kann. Unter der Annahme, dass ein akzeptabler Vorschlag gemacht werden kann, würde ich voll und ganz erwarten, dass etwas, das Konzepten oder Ds Vorlagenbeschränkungen ähnelt, es in den nächsten Standard schafft, einfach weil es viel Verlangen danach gibt. Die Frage ist, ob jemand einen Vorschlag machen kann, der solide genug und "gebacken genug" ist, um akzeptabel zu sein.
quelle
Du meinst D's Template Einschränkungen?
Soweit ich weiß, wurden C ++ - Konzepte im Auftrag von boost :: concept vorgeschlagen. Das Problem hierbei ist, dass boost eine für C ++ 03 geschriebene Bibliothek ist. C ++ 11 verfügt über andere Syntaxfunktionen, die es ermöglichen, bestimmte Dinge auf eine andere Weise zu implementieren, als es C ++ 03 zulässt (daher kann boost selbst unter Ausnutzung der neuen Syntax umgeschrieben werden).
Das Standardkomitee hat Konzepte verworfen, weil es zu lange gedauert hat, sie zu spezifizieren (was wiederum die c ++ 11-Genehmigung verzögert). Sie werden wahrscheinlich in der nächsten C ++ - Version veröffentlicht.
In der Zwischenzeit unterscheidet sich die D-Syntax von der C ++ - und die D-Syntax selbst behalten einige Ausdrucksauswertungsfunktionen zur Kompilierungszeit bei, die C ++ nicht immer haben kann, ohne einen Legacy-Code zu brechen (etwas, das D nicht hat, weil es einen kürzeren Verlauf hat). C ++ selbst verfügt nun über
static_assert
undcostexpr
, was es ermöglicht, die Kompilierzeitauswertungsfunktionen zu verbessern. Könnte in Zukunft ein ähnliches Niveau erreichen.quelle
Hier ist eine QS mit Herb Sutter, er spricht über Konzepte an der 15-Minuten-Marke.
http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers
Wenn Sie das mögen, ist hier eine andere: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11
Nun zu Ihrer Frage. Warum nicht die D-Version? Nun, warum es verwenden? C ++ ist eine sehr komplexe und stabile Sprache. Jedes Feature muss äußerst sorgfältig ausgewählt werden, da es normalerweise jahrzehntelang unterstützt werden muss. Wenn Sie sich den ersten C ++ - Standard ansehen und die Überarbeitungen verfolgen, gibt es einige veraltete Funktionen, aber selbst diese müssen noch unterstützt werden. Daher ist es sinnvoll, Konzepte so zu gestalten, dass sie zu 100% zu C ++ passen.
Was den Grund angeht, warum es nicht in C ++ 0x enthalten war. Na weil es riesig war. Der Vorschlag war 100 Seiten lang und sehr schwer umzusetzen. Es wurde entschieden, dass dieses Feature mehr Zeit benötigt, um zu reifen, bis es in den Standard aufgenommen wird.
quelle
Ganz einfach, C ++ hat verdammt viel mehr historisches Gepäck als D. Es wäre viel einfacher, eine Menge Dinge zu implementieren, wenn es nicht die Tatsache gäbe, dass C ++ riesige Mengen an historischem Code enthält, der weiterhin korrekt funktionieren muss und wie erwartet. D hat dieses Problem nicht.
quelle