Warum hat der C ++ Standard keine Ausdrucksvorlagen übernommen?

17

Meines Erachtens wurden Ausdrucksvorlagen als eine Technik wesentlich vor dem ursprünglichen C ++ - Standard im Jahr 1998 entdeckt. Warum wurden sie nicht verwendet, um die Leistung mehrerer Standardklassen wie std::stringund Streams zu verbessern ?

DeadMG
quelle
@ChrisLively: Wenn ich einen Vorschlag für eine solche Änderung einreichen würde, wäre es ein absolutes Problem, wenn ich nicht wüsste, warum dies nicht zum ersten Mal geschehen ist, und es ist absolut programmierrelevant und die Antwort ist sehr Spezifisch.
DeadMG
Was genau würden Sie mit Ausdrucksvorlagen tun, um Zeichenfolgen zu beschleunigen?
Jalf
5
@jalf: Wenn Sie es anwenden würden operator+, könnten Sie O(n)redundante Zuordnungen für wiederholte Zuordnungen erzielen und auf Null setzen, was immer noch schneller ist als rWert-Referenzen. Darüber hinaus können Sie beispielsweise COW-Implementierungen optimieren, indem Sie beim Schreiben kopieren und nicht nur "beim Indexieren in Nicht-Konstante". Es gibt auch andere Anwendungen, bei denen sowohl die Leistung als auch die Semantik mit Ausdrucksvorlagen verbessert werden können.
DeadMG
Mir ist klar, dass diese Frage vor einiger Zeit gestellt wurde, aber bitte erläutern Sie, welche Ausdrucksvorlagen und / oder Links zu relevantem Material vorhanden sind.
einpoklum - wieder Monica

Antworten:

17

Ausdrucksvorlagen wurden zum ersten Mal von Todd Veldhuizen im Juni 1995 in einem Artikel in der Zeitschrift C ++ Report veröffentlicht. Zu diesem Zeitpunkt war das Standardkomitee bereits stark mit der Erweiterung des C ++ - Standards um die STL befasst , eine Aufgabe, die den Standard von sich aus um ein oder zwei Jahre verzögerte. (Die STL wurde dem Komitee 1993 vorgelegt und 1994 offiziell vorgeschlagen. Die Fertigstellung des Standards dauerte weitere vier Jahre.)
Da es sich beim C ++ - Standardisierungskomitee um eine Gruppe von Freiwilligen handelt, von denen einige nicht einmal von Unternehmen unterstützt werden, die ihre Arbeit bezahlen Ich glaube, niemand hatte Ressourcen, um dem C ++ - Standard eine weitere Idee hinzuzufügen.

1995 ist auch nur das Jahr, in dem Veldhuizens Artikel veröffentlicht wurde. Es hätte noch einige Jahre gedauert, bis die Technik bekannt und anerkannt wurde . (Die Idee der STL stammt aus den 70er Jahren, eine Ada-Implementierung wurde Ende der 80er Jahre durchgeführt, die Arbeit an einer C ++ - Implementierung muss um 1990 begonnen haben, und es dauerte weitere drei Jahre, bis die Idee den Weg zur C ++ - Standardisierung fand Ausschuss.) Es waren jedoch nur drei Jahre von Todd Artikel bis zur endgültigen Abstimmung über den Standard. Das war viel zu wenig Zeit, um eine Idee umzusetzen, die noch brandneu und im Grunde ungetestet war.

Hinzu kommt, dass Expression Templates als eine Art Template- Metaprogrammierung den Compiler weit mehr belasten als die vergleichsweise "einfache" STL. Und soweit ich mich erinnere, hatten wir selbst 1998, als der Standard veröffentlicht wurde, keinen Compiler, der sogar die gesamte STL kompilieren konnte.
Angesichts dessen, dass eines der Hauptziele des Standardisierungskomitees darin bestand, die etablierte Praxis zu standardisieren (nicht, dass sie sich strikt daran hielt), hätten Ausdrucksvorlagen damals nie auf der Tagesordnung stehen dürfen.

sbi
quelle
1
Aber std::stringund iostreams waren nicht in der STL.
R. Martinho Fernandes
@ R.MartinhoFernandes: Das heißt jedoch nicht, dass das Komitee Ressourcen zur Verfügung hatte. (Und std::string wurde geändert, um es in einen STL-Container zu verwandeln, Übrigens.)
sbi
2
Ich denke, ich muss nur Folgendes verknüpfen: Ist std :: string Teil der STL?
Xeo
@sbi ah, das macht Sinn.
R. Martinho Fernandes
10

Die einfache Antwort lautet: Sie haben sich offensichtlich nicht dafür eingesetzt. Ich auch nicht, weil ich meine eigene Agenda hatte (und habe), die keine Ausdrucksvorlagen enthält. Auch die Schnittstelle, insbesondere für Strings, versucht bereits, viel zu viele Master zu bedienen, was zu einer Klasse führt, die für alles verwendet wird und gut zum Motten ist.

Die Standardbibliothek verfügt bereits über eine std::valarrayFamilie, die einen Ausdrucksvorlagen-Implementierungsstil unterstützen soll. Soweit ich das beurteilen kann, ist das allerdings nicht ganz klar. Ein Problem, das dies verursachte, war, dass die Leute, die sich für die Aufnahme der halbgebackenen Version in den Standard einsetzten, sofort aufhörten, daran zu arbeiten. Es gab Versuche, es zu retten (z. B. David Vandevoorde, Matt Austern und ich haben an dem Treffen in Stockholm etwa einen Tag lang gearbeitet), aber am Ende war niemand interessiert genug.

Dietmar Kühl
quelle
8
Sie fangen ein bisschen unfair an, weil DeadMG sich nicht dafür einsetzen konnte, weil er seiner Windel damals kaum entwachsen war und wahrscheinlich nicht den Punkt erreicht hatte, an dem er "C ++" richtig aussprechen konnte. :)
sbi
7
Es tut mir schrecklich leid, dass ich als Kleinkind kein Lobbying bekommen habe: P
DeadMG 25.01.12
1
Mir ist klar, dass nicht jeder die Möglichkeit hatte, den Standard zu beeinflussen. Obwohl ich seit ungefähr 15 Jahren regelmäßig an Ausschusssitzungen teilnehme, ist mein Einfluss auf den Standard begrenzt. Mein Punkt ist jedoch: Wenn jemand etwas im Standard haben möchte, muss er sich anstrengen! Dinge, die nicht da sind, hängen im Wesentlichen von Menschen ab, die andere Prioritäten haben, egal ob sie technisch oder anderweitig sind (z. B. sich ganz auf das Erwachsenwerden konzentrieren).
Dietmar Kühl
Die libgcc-Implementierung von valarray basiert auf Ausdrucksvorlagen.
Phresnel
3

Die als "Ausdrucksvorlagen" bekannte Technik wurde (unabhängig) von Todd Veldhuizen und mir bereits 1994 entdeckt (Todd's Artikel ist aus dem Jahr 1995, aber es dauert ein wenig, bis etwas veröffentlicht wird, meine eigene Arbeit) wurde erstmals in comp.lang.c ++) gezeigt.

Genau aus diesem Grund habe ich angefangen, an C ++ - Ausschusssitzungen teilzunehmen. Ich habe dem Komitee beim ersten Treffen in Santa Cruz im März 1996 die Technik und eine komplette Neugestaltung von std :: valarray vorgestellt. Diese Änderung wurde als zu umfangreich angesehen, aber wie Dietmar anspielt, haben wir uns auf dem anschließenden Treffen ein wenig geäußert in Stockholm, die die Verwendung von Ausdrucksvorlagen für die Implementierung von std :: valarrray ermöglichen. Zu meiner Überraschung sind diese Wörter immer noch vorhanden: Siehe Absatz 3-6 von Unterabschnitt [valarray.syn] 29.7.1 in http://wg21.link/N4727 .

Daveed V.
quelle
1
frage mich, was der Sinn der Verwendung von Link Shortener anstelle der realen URL ist
Mücke
3
@gnat: Wenn Sie eine Dokumentennummer kennen, ist es trivial, die URL wg21.link dafür zu schreiben. Das habe ich hier gemacht. Es erspart mir das Nachschlagen des jeweiligen Mailings / Jahres, in dem ein Dokument veröffentlicht wurde. Außerdem hoffe ich, dass wg21.link entsprechend aktualisiert wird, wenn WG21 beschließt, die Hosting-URLs zu verschieben, wodurch veraltete Verweise vermieden werden. (Dh, der Punkt verkürzt nicht, aber die Lesbarkeit.)
Daveed V.
0

Ich vermute, dass kein Compiler im Jahr 1998 in der Lage gewesen wäre, Ausdrucksvorlagen zu kompilieren.

fredoverflow
quelle
1
Todd Veldhuizen hat seine Ausdrucksvorlagen vor 1996 mit dem C ++ - Compiler von KAI erstellt. Der Grund ist viel profaner ...
1
Ein großer Prozentsatz der C ++ - Community konnte die STL auch bis 2003 nicht in vollem Umfang nutzen (ich sehe Sie, Microsoft!), Und das hatte das Komitee nicht davon abgehalten, die STL in den Standard zu integrieren.
sbi
2
Tatsächlich haben Todd und ich ursprünglich die Expression-Template-Technik für den Borland C ++ 4-Compiler (der 1993 veröffentlicht wurde) entwickelt. Ich glaube übrigens, dass dies auch der erste Compiler ist, auf dem die STL voll funktionsfähig ist. Ich habe später eine Bibliothek mit Ausdrucksvorlagen auf eine Vielzahl anderer Compiler portiert (einschließlich des Cfront-basierten Compilers von Sun zu dieser Zeit!). Die KAI C ++ Compiler Cam etwas später.
Daveed V.
@ DaveedV. BCC4 war zu seiner Zeit ein sehr guter Compiler und viel besser als die damalige VC-Version! Es hatte jedoch einige Macken, wie der berüchtigte "Smiley Bug". :->Außerdem konnten sie es nicht schnell genug verbessern, sodass es immer schwieriger wurde, die sich schnell verbessernden Vorlagentechniken damit zu verwenden. Als VC7.1 veröffentlicht wurde und viel mehr den Anforderungen entsprach, tötete das Borland.
sbi