Warum kann C ++ den Ansatz von D nicht für seine Konzeptimplementierung übernehmen?


19

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


2
Diese Frage hätte nach programmers.se migriert werden sollen. (Ich habe dafür gestimmt, aber 3 Stimmen waren für "nicht konstruktiv").
iammilind

3
Ich denke, dass die Frage möglicherweise nicht auf die konstruktivste Art und Weise geschrieben ist, aber dass es einen Wert darauf gibt. Ich würde jemanden lieben, der erklärt, wie D Konzepte verwaltet, und in der Lage ist, es mit den beiden Hauptansätzen zu vergleichen, die das C ++ - Komitee für Konzepte übernommen hat, bevor es beschlossen hat, das Feature insgesamt zu verschieben ... Wenn dies abgeschlossen werden soll, sollte es bei das Mindeste werden bewegt , um Programmierer
David Rodríguez - dribeas

2
@ David: Ich habe für die Wiedereröffnung gestimmt (und dann kann sie vielleicht auf die Programmierseite verschoben werden)
Nawaz

1
Stimme David zu. Ich sehe keinen Grund, präventiv "nicht konstruktiv" zu sagen, bevor jemand überhaupt versuchen kann, etwas zu konstruieren. bei 0 Antworten ist die "Konstruktivität" 0/0 und damit unbestimmt.
Emilio Garavaglia

1
@ jj1: Können Sie denjenigen von uns, die die Sprache nicht kennen, eine kurze Erklärung zum Ansatz von D geben?
David Rodríguez - Dribeas

Antworten:


9

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 constexproder static_assertwaren 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.


Kleiner Kommentar: Das Export-Schlüsselwort war eigentlich eine C ++ 98-Funktion (die ursprüngliche Standardisierung). Die Berichtigung von 2003 bezog sich hauptsächlich auf Funktionen der Bibliothek.
ex0du5

@ ex0du5: Richtig, das '03 ist eine geringfügige Überarbeitung des C ++ 98-Standards, die sich hauptsächlich auf Korrekturen bezog.
Matthieu M.

3

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 constexprsicherlich 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.


2

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_assertund costexpr, was es ermöglicht, die Kompilierzeitauswertungsfunktionen zu verbessern. Könnte in Zukunft ein ähnliches Niveau erreichen.


2

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.


2

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.


Vielleicht haben Sie das nur falsch formuliert, aber das Problem ist kein Legacy-Code. Das Problem ist, dass jedes neue Feature jahrzehntelang in der Sprache vorhanden sein wird und unterstützt werden muss. Das bedeutet, dass jedes neue Feature sehr sorgfältig ausgewählt werden muss.
Let_Me_Be

@Let_Me_Be: Richtig, das Problem liegt im Legacy-Code, den wir zehn Jahre später haben werden, wenn wir jetzt Konzepte einbringen.
David Thornley
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.