Dlaczego Standard C ++ nie przyjął szablonów wyrażeń?
17
Rozumiem, że szablony wyrażeń jako technika zostały znacznie odkryte przed oryginalnym standardem C ++ w 1998 roku. Dlaczego nie użyto ich do poprawy wydajności kilku standardowych klas takich jak std::stringi strumienie?
@ChrisLively: Gdybym miał złożyć propozycję sugerującą taką zmianę, absolutnie byłby problem, że nie wiedziałbym, dlaczego nie zrobiono tego za pierwszym razem, i jest to absolutnie odpowiednie programowanie, a odpowiedź jest bardzo konkretny.
DeadMG,
Co dokładnie zrobiłbyś z szablonami wyrażeń, aby przyspieszyć łańcuchy?
jalf
5
@jalf: Jeśli miałbyś to zastosować operator+, możesz osiągnąć O(n)i zerować zbędne alokacje dla powtarzających się alokacji, co jest wciąż szybsze niż odwołania do wartości. Ponadto można zoptymalizować na przykład implementacje COW, kopiując przy zapisie , a nie tylko „na indeksie do non-const”. Istnieją również inne aplikacje, w których można poprawić zarówno wydajność, jak i semantykę za pomocą szablonów wyrażeń.
DeadMG,
Zdaję sobie sprawę, że to pytanie zostało zadane jakiś czas temu, ale proszę wyjaśnić niektóre z nich, jakie są szablony wyrażeń i / lub link do odpowiednich materiałów.
einpoklum
Odpowiedzi:
17
Szablony wyrażeń zostały po raz pierwszy opublikowane przez Todda Veldhuizena w czerwcu 1995 r. W artykule w magazynie C ++ Report . W tym czasie komitet standardowy był już mocno zaangażowany w dodanie STL do standardu C ++, co samo w sobie opóźniało standard o jeden lub dwa lata. (STL został przedstawiony komitetowi w 1993 r., A oficjalnie zaproponowany w 1994 r. Ukończenie standardu zajęło kolejne cztery lata).
Biorąc pod uwagę, że komitet normalizacyjny C ++ jest grupą ochotników, niektórzy z nich nie są nawet wspierani przez firmy płacące wydatki, nie sądzę, aby ktokolwiek miał jakiekolwiek zasoby do dodania kolejnego pomysłu do standardu C ++.
Również rok 1995 to rok, w którym opublikowano artykuł Veldhuizena. Technika stała się znana i rozpoznawalna , zajęłoby to kilka lat . (Pomysł STL sięga lat 70., wdrożenie Ada zostało wykonane pod koniec lat 80., prace nad wdrożeniem C ++ musiały się rozpocząć około 1990 r. I zajęło to kolejne trzy lata, aby znaleźć drogę do standaryzacji C ++ komitet.)
Minęły jednak tylko trzy lata od artykułu Todda do ostatecznego głosowania nad standardem. To było zdecydowanie za mało czasu, aby wprowadzić pomysł, który był wciąż nowy i zasadniczo nie przetestowany.
Dodaj do tego fakt, że Szablony Wyrażeń , będące rodzajem metaprogramowania szablonów, kompilatory stresu są czymś więcej niż stosunkowo „prostym” STL. I z tego co pamiętam, nawet w 1998 roku, kiedy standard został opublikowany, nie mieliśmy kompilatora, który mógłby nawet skompilować cały STL.
Biorąc pod uwagę, że jednym z głównych celów komitetu normalizacyjnego była standaryzacja ustalonej praktyki (a nie trzymanie się tego rygorystycznie), Szablony Wyrażeń nigdy nie powinny były być w porządku obrad w tamtym czasie .
@ R.MartinhoFernandes: Nie oznacza to jednak, że komitet miał do dyspozycji wszelkie zasoby. (I std::stringzostał zmieniony, aby przekształcić go w kontener STL, BTW.)
Odpowiedź jest prosta: masz oczywiście nie lobbować za to. Nie zrobiłem tego również, ponieważ miałem (i mam) swój własny program, który nie zawiera szablonów wyrażeń. Interfejs, w szczególności dla łańcuchów, już próbuje obsłużyć o wiele za dużo masterów, w wyniku czego powstaje klasa używana do wszystkiego i dobra do niczego.
Biblioteka standardowa ma już std::valarrayrodzinę, która ma obsługiwać styl implementacji szablonu wyrażeń. Z tego co wiem, nie do końca to rozumiem. Jednym z problemów, który to spowodował, jest to, że ludzie, którzy lobbowali, aby włączyć jego częściowo wypieczoną wersję do standardu, przestali w niej działać w momencie, gdy został on włączony. Próbowano go uratować (np. David Vandevoorde, Matt Austern i ja pracowaliśmy nad nim przez około dzień na spotkaniu w Sztokholmie), ale ostatecznie nikt nie był wystarczająco zainteresowany.
Zaczynasz trochę niesprawiedliwie, ponieważ DeadMG nie mógł lobbować za to z powodu prostego faktu, że wtedy ledwo przerósł swoje pieluchy i prawdopodobnie nie osiągnął punktu, w którym mógłby poprawnie wymówić „C ++”. :)
sbi
7
Okropnie przykro mi, że jako małe dziecko nie dostałem lobbingu: P
DeadMG
1
Zdaję sobie sprawę, że nie wszyscy mieli okazję wpływać na standard. Chociaż regularnie uczestniczę w posiedzeniach komisji od około 15 lat, mój wpływ na standard jest ograniczony. Chodzi mi jednak o to: jeśli ktoś chce czegoś w standardzie, musi podjąć wysiłek! Rzeczy, których tam nie ma, są zasadniczo zależne od ludzi o innych priorytetach, zarówno technicznych, jak i innych (np. W pełni koncentrujących się na dorastaniu).
Dietmar Kühl,
Implementacja biblioteki valarray w libgcc opiera się na szablonach wyrażeń.
fresnel
3
Technika znana obecnie jako „szablony ekspresji” została odkryta (niezależnie) już w 1994 r. Zarówno przez Todda Veldhuizena, jak i mnie (artykuł Todda pochodzi z 1995 r., Ale publikacja rzeczy zajmuje trochę czasu; moja własna praca po raz pierwszy pokazano w comp.lang.c ++).
Właściwie zacząłem uczestniczyć w posiedzeniach komisji C ++ właśnie z tego powodu. Na pierwszym spotkaniu w Santa Cruz w marcu 1996 r. Przedstawiłem komitetowi tę technikę i całkowicie przeprojektowałem std :: valarray. Uznano, że to zbyt duża zmiana, ale jak wspomina Dietmar, dostaliśmy kilka słów na kolejnym spotkaniu w Sztokholmie, które umożliwiają stosowanie szablonów wyrażeń do implementacji std :: valarrray. Ku mojemu zdziwieniu, te słowa wciąż istnieją: patrz akapit 3-6 podrozdziału [valarray.syn] 29.7.1 w http://wg21.link/N4727 .
Zastanawiam się, po co używać skracacza linków zamiast prawdziwego adresu URL
skomentuj
3
@gnat: Jeśli znasz numer dokumentu, napisanie dla niego adresu URL wg21.link jest banalne. Właśnie to tutaj zrobiłem. Oszczędza mi to sprawdzania konkretnej korespondencji / roku, w którym dokument został wydany. Mam również nadzieję, że jeśli / kiedy WG21 zdecyduje się przenieść adresy URL hostingu, wg21.link zostanie odpowiednio zaktualizowany, dzięki czemu unikniesz nieaktualnych referencji. (Tj. Chodzi nie o skrócenie, ale o czytelność.)
Daveed V.
0
Domyślam się, że żaden kompilator nie byłby w stanie skompilować szablonów wyrażeń w 1998 roku.
Todd Veldhuizen wykonał swój szablon wyrażeń przed 1996 rokiem, używając kompilatora C ++ KAI. Powód jest o wiele bardziej profanacyjny ...
1
Znaczny procent społeczności C ++ nie był w stanie w pełni wykorzystać STL do 2003 r. (Patrzę na ciebie, Microsoft!), Co nie powstrzymało komitetu przed włączeniem STL do standardu.
sbi
2
Właściwie bth Todd i ja pierwotnie otrzymaliśmy technikę szablonów wyrażeń do pracy na kompilatorze Borland C ++ 4 (wydanym w 1993 r.). Nawiasem mówiąc, uważam, że to także pierwszy kompilator, na którym STL został stworzony do pełnej pracy. Później przeniosłem bibliotekę szablonów wyrażeń do wielu innych kompilatorów (w tym kompilatora firmy Sun w tym czasie!). Kamera kompilatora KAI C ++ nieco później.
Daveed V.
@DaveedV. BCC4 był bardzo dobrym kompilatorem jak na swój czas i znacznie lepszym niż wersja VC tego czasu! Miało jednak kilka dziwactw, takich jak niesławny „uśmiechnięty robak”. :->Ponadto nie udało się go wystarczająco szybko ulepszyć, dlatego szybko stało się coraz trudniejsze korzystanie z szybkich technik szablonów. Kiedy VC7.1 zostało wydane i było znacznie bardziej zgodne, to zabiło Borlanda.
operator+
, możesz osiągnąćO(n)
i zerować zbędne alokacje dla powtarzających się alokacji, co jest wciąż szybsze niż odwołania do wartości. Ponadto można zoptymalizować na przykład implementacje COW, kopiując przy zapisie , a nie tylko „na indeksie do non-const”. Istnieją również inne aplikacje, w których można poprawić zarówno wydajność, jak i semantykę za pomocą szablonów wyrażeń.Odpowiedzi:
Szablony wyrażeń zostały po raz pierwszy opublikowane przez Todda Veldhuizena w czerwcu 1995 r. W artykule w magazynie C ++ Report . W tym czasie komitet standardowy był już mocno zaangażowany w dodanie STL do standardu C ++, co samo w sobie opóźniało standard o jeden lub dwa lata. (STL został przedstawiony komitetowi w 1993 r., A oficjalnie zaproponowany w 1994 r. Ukończenie standardu zajęło kolejne cztery lata).
Biorąc pod uwagę, że komitet normalizacyjny C ++ jest grupą ochotników, niektórzy z nich nie są nawet wspierani przez firmy płacące wydatki, nie sądzę, aby ktokolwiek miał jakiekolwiek zasoby do dodania kolejnego pomysłu do standardu C ++.
Również rok 1995 to rok, w którym opublikowano artykuł Veldhuizena. Technika stała się znana i rozpoznawalna , zajęłoby to kilka lat . (Pomysł STL sięga lat 70., wdrożenie Ada zostało wykonane pod koniec lat 80., prace nad wdrożeniem C ++ musiały się rozpocząć około 1990 r. I zajęło to kolejne trzy lata, aby znaleźć drogę do standaryzacji C ++ komitet.)
Minęły jednak tylko trzy lata od artykułu Todda do ostatecznego głosowania nad standardem. To było zdecydowanie za mało czasu, aby wprowadzić pomysł, który był wciąż nowy i zasadniczo nie przetestowany.
Dodaj do tego fakt, że Szablony Wyrażeń , będące rodzajem metaprogramowania szablonów, kompilatory stresu są czymś więcej niż stosunkowo „prostym” STL. I z tego co pamiętam, nawet w 1998 roku, kiedy standard został opublikowany, nie mieliśmy kompilatora, który mógłby nawet skompilować cały STL.
Biorąc pod uwagę, że jednym z głównych celów komitetu normalizacyjnego była standaryzacja ustalonej praktyki (a nie trzymanie się tego rygorystycznie), Szablony Wyrażeń nigdy nie powinny były być w porządku obrad w tamtym czasie .
źródło
std::string
iostreams nie było w STL.std::string
został zmieniony, aby przekształcić go w kontener STL, BTW.)Odpowiedź jest prosta: masz oczywiście nie lobbować za to. Nie zrobiłem tego również, ponieważ miałem (i mam) swój własny program, który nie zawiera szablonów wyrażeń. Interfejs, w szczególności dla łańcuchów, już próbuje obsłużyć o wiele za dużo masterów, w wyniku czego powstaje klasa używana do wszystkiego i dobra do niczego.
Biblioteka standardowa ma już
std::valarray
rodzinę, która ma obsługiwać styl implementacji szablonu wyrażeń. Z tego co wiem, nie do końca to rozumiem. Jednym z problemów, który to spowodował, jest to, że ludzie, którzy lobbowali, aby włączyć jego częściowo wypieczoną wersję do standardu, przestali w niej działać w momencie, gdy został on włączony. Próbowano go uratować (np. David Vandevoorde, Matt Austern i ja pracowaliśmy nad nim przez około dzień na spotkaniu w Sztokholmie), ale ostatecznie nikt nie był wystarczająco zainteresowany.źródło
:)
Technika znana obecnie jako „szablony ekspresji” została odkryta (niezależnie) już w 1994 r. Zarówno przez Todda Veldhuizena, jak i mnie (artykuł Todda pochodzi z 1995 r., Ale publikacja rzeczy zajmuje trochę czasu; moja własna praca po raz pierwszy pokazano w comp.lang.c ++).
Właściwie zacząłem uczestniczyć w posiedzeniach komisji C ++ właśnie z tego powodu. Na pierwszym spotkaniu w Santa Cruz w marcu 1996 r. Przedstawiłem komitetowi tę technikę i całkowicie przeprojektowałem std :: valarray. Uznano, że to zbyt duża zmiana, ale jak wspomina Dietmar, dostaliśmy kilka słów na kolejnym spotkaniu w Sztokholmie, które umożliwiają stosowanie szablonów wyrażeń do implementacji std :: valarrray. Ku mojemu zdziwieniu, te słowa wciąż istnieją: patrz akapit 3-6 podrozdziału [valarray.syn] 29.7.1 w http://wg21.link/N4727 .
źródło
Domyślam się, że żaden kompilator nie byłby w stanie skompilować szablonów wyrażeń w 1998 roku.
źródło
:->
Ponadto nie udało się go wystarczająco szybko ulepszyć, dlatego szybko stało się coraz trudniejsze korzystanie z szybkich technik szablonów. Kiedy VC7.1 zostało wydane i było znacznie bardziej zgodne, to zabiło Borlanda.