Dlaczego C ++ nie może przyjąć podejścia D do implementacji koncepcji?


19

Jak wielu z was wie, koncepcje , podejście C ++ do ograniczania możliwych typów argumentów szablonu nie zostało uwzględnione w C ++ 11.

Dowiedziałem się, że język programowania D 2.0 ma podobną funkcję do programowania ogólnego. To rozwiązanie wydaje mi się dość eleganckie i proste.

Moje pytanie brzmi więc, dlaczego C ++ nie może zastosować podobnego podejścia .

  • Cel koncepcji C ++ może być większy niż to, co zapewnia implementacja D?
  • Czy dziedzictwo C ++ uniemożliwia przyjęcie takiego podejścia?
  • Czy jakikolwiek inny?

Dziękuję za odpowiedzi.

ps Aby zobaczyć przykłady ogólnej mocy programowania D, zapoznaj się z tym: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534


2
To pytanie powinno zostać przeniesione do programmers.se. (Głosowałem za tym, ale 3 głosy były za „mało konstruktywne”).
iammilind

3
Myślę, że pytanie to może nie zostać napisane w najbardziej konstruktywny sposób, ale ma na to wartość. Chciałbym, żeby ktoś wyjaśnił, w jaki sposób D zarządza koncepcjami, i mógłbym porównać to z dwoma głównymi podejściami przyjętymi przez komitet C ++, zanim zdecydowały się całkowicie odłożyć tę funkcję ... Jeśli ma to zostać zamknięte, to powinno najmniej zostać przeniesionym do programistów
David Rodríguez - dribeas

2
@David: Głosowałem za ponownym otwarciem (a potem być może można go przenieść na stronę programistów)
Nawaz

1
Zgadzam się z Davidem. Nie widzę powodu, by zapobiegawczo mówić „niekonstruktywny”, zanim ktokolwiek będzie mógł spróbować coś skonstruować. przy 0 odpowiedziach „konstruktywność” wynosi 0/0, a zatem jest nieokreślona.
Emilio Garavaglia,

1
@ jj1: Czy możesz krótko wyjaśnić podejście D dla tych z nas, którzy nie znają języka?
David Rodríguez - dribeas

Odpowiedzi:


9

Standard C ++ jest dokumentem normatywnym, który określa zasady, które pozostaną (w większości bez zmian) w przyszłych dokumentach. Dlatego komitet przyjął bardzo ostrożne podejście do swoich aktualizacji.

Dodatki do standardowej biblioteki były dość łatwe. Wiele bibliotek działało już od dłuższego czasu: zostało udowodnione, że działają.

Dodatki do podstawowych pojęć w języku są jednak znacznie trudniejsze do eksperymentowania, ponieważ najpierw wymaga modyfikacji kompilatora. Funkcja C ++ 03 (eksport szablonów) została określona bez obsługi kompilatora ... wynik był okropny. Implementatorzy nakładki kompilatora EDG zgłosili to jako ogromne zadanie (kilka osobolat) przy bardzo niewielkim zysku. Żaden inny kompilator nigdy nie próbował go wdrożyć. To nie jest wygodna sytuacja.

Funkcje takie jak constexprlub static_assertbyły łatwe (i już emulowane przez biblioteki). Jagnięta są dość dobrze rozumiane i wdrażane w wielu innych językach, przeprowadzono już obszerne badania, więc była to głównie kwestia składni.

Z drugiej strony Koncepcje uznano za zbyt nowe i niesprawdzone . Zostały ledwie sprecyzowane na czas, nie było dowodu koncepcji ... i dlatego zostały odrzucone, zamiast czekać na nie (lub popełnić błąd).

Dlaczego nie śledzić D? Nie ma powiedzenia, że ​​tak nie będzie. Komitet zachęca ludzi do ponownego przemyślenia od zera, bez konieczności nalegania na ostateczny termin, oraz do spróbowania włączenia ich do kompilatora, aby zobaczyć, jak wchodzą w interakcje z innymi funkcjami w języku. Pojawia się przede wszystkim kwestia oddzielenia Pojęć i Map Pojęć: czy powinny być one połączone w jedną całość, czy nie?

FYI: Obecnie istnieje oddział Clang poświęcony tym eksperymentom, prowadzony przez Larisse Voufo z uniwersytetu w Indianie.


Drobny komentarz: słowo kluczowe eksportu było w rzeczywistości funkcją c ++ 98 (pierwotna standaryzacja). Sprostowanie z 2003 r. Dotyczyło przede wszystkim funkcji bibliotecznych.
ex0du5

@ ex0du5: Racja, '03 to niewielka zmiana standardu C ++ 98, która głównie dotyczyła poprawek.
Matthieu M.,

3

W przypadku standardu z 2011 r. Opracowywano koncepcje C ++, które ostatecznie zostały usunięte z tego standardu, ponieważ nie były „wystarczająco upieczone”. Kontynuowane są prace nad koncepcjami C ++, które mogą doprowadzić do przejścia do następnego standardu. Może się jednak zdarzyć, że niektórzy ludzie będą pracować nad propozycją następnego standardu, który jest podobny do ograniczeń szablonu D. Czy tak się stanie, czy nie, okaże się. O ile mi wiadomo, nie było takiej propozycji dotyczącej standardu z 2011 r., Więc nie było szansy na przejście do tego standardu bez względu na jego zalety, ale to, co zrobi lub nie zmieni w następny standard, jest całkowicie nieznane w tym momencie.

Nie znam żadnego ważnego powodu, dla którego coś podobnego do ograniczeń szablonu D nie mogło zostać zaimplementowane dla C ++, chociaż biorąc pod uwagę, że C ++ jest ogólnie bardziej ograniczony w tym, co może zrobić w czasie kompilacji, może być trudniej sprawić, aby działały tak samo jak tak jak robią to w D (choć wprowadzenie takich rzeczy na constexprpewno pomaga).

Tak naprawdę myślę, że krótką odpowiedzią jest to, że nie ma technicznego powodu, aby coś podobnego do ograniczeń szablonu D nie mogło być w C ++.

Pytanie brzmi, czy taka propozycja zostanie złożona dla następnego standardu i jak będzie się porównywać z podobnymi propozycjami (np. Propozycjami dotyczącymi koncepcji). Zakładając, że można złożyć akceptowalną propozycję, w pełni oczekiwałbym, że coś podobnego do pojęć lub ograniczeń szablonów D przejdzie do następnego standardu po prostu dlatego, że istnieje duże zapotrzebowanie. Pytanie brzmi, czy ktokolwiek może zaproponować propozycję, która jest wystarczająco solidna i „wystarczająco upieczona”, aby mogła zostać zaakceptowana.


2

Masz na myśli ograniczenia szablonu D?

O ile wiem, koncepcje C ++ zostały zaproponowane w imieniu boost :: concept. Problem polega na tym, że boost jest biblioteką napisaną dla C ++ 03. C ++ 11 ma inne funkcje składniowe, które pozwolą wdrożyć pewne rzeczy w inny sposób umożliwiający C ++ 03 (a więc zwiększenie sama może być przepisany biorąc zalety nowej składni).

Standardowy komitet porzucił koncepcje, ponieważ ich określenie zajęło zbyt dużo czasu (tym samym ponownie opóźniając zatwierdzenie c ++ 11). Prawdopodobnie będą dostępne w następnej wersji C ++.

Tymczasem składnia D jest inna niż C ++, a sama D zachowuje pewne możliwości oceny wyrażeń w czasie kompilacji C ++ nie zawsze może mieć bez zerwania jakiegoś starszego kodu (coś, czego D nie miałby, mając krótszą historię). C ++ ma teraz sama static_asserti costexpr, które pozwala na poprawę możliwości oceny w czasie kompilacji. Może w przyszłości osiągnie podobny poziom.


2

Oto QA z Herbem Sutterem, który opowiada o koncepcjach po 15 minutach.

http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers

Jeśli Ci się spodoba, oto kolejny: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11

Co do twojego pytania. Dlaczego nie wersja D? Po co z tego korzystać? C ++ jest bardzo złożonym i stabilnym językiem. Każda funkcja musi być wybierana bardzo ostrożnie, ponieważ zwykle musi być obsługiwana przez dziesięciolecia. Jeśli spojrzysz na pierwszy standard C ++ i postępujesz zgodnie z wersjami, niektóre funkcje są przestarzałe, ale nawet te muszą być nadal obsługiwane. Więc to ma sens projektowanie koncepcji do 100% dopasowanie C ++.

Jak, dlaczego nie została ona uwzględniona w C ++ 0x. Cóż, ponieważ był ogromny. Propozycja była 100 stron długi i bardzo trudny do zrealizowania. Zdecydowano, że ta funkcja potrzebuje więcej czasu na dojrzewanie, dopóki nie zostanie włączona do standardu.


2

Po prostu, C ++ ma cholernie dużo bardziej historycznym bagażem niż D. Byłoby znacznie łatwiejsze do wdrożenia bardzo dużo rzeczy, gdyby nie fakt, że C ++ ma ogromne ilości kodu historycznego, który musi nadal działać poprawnie i zgodnie z oczekiwaniami. D nie ma tego problemu.


Być może po prostu źle to sformułowałeś, ale problem nie jest starszym kodem, problem polega na tym, że każda nowa funkcja będzie obecna w języku przez dziesięciolecia i musi być obsługiwana. Oznacza to, że każdą nową funkcję należy wybierać bardzo ostrożnie.
Let_Me_Be

@Let_Me_Be: Zgadza się, problem tkwi w starszym kodzie, który będziemy mieli dziesięć lat później, jeśli wprowadzimy teraz koncepcje.
David Thornley,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.