Nie wiem dużo o D, ale wielu, wielu programistów C ++ bardzo go nie lubię i osobiście muszę się zgodzić - nie podoba mi się wygląd D i nie będę się zbliżał.
Aby zrozumieć, dlaczego D nie zyskuje większej przyczepności, musisz zacząć od zrozumienia, co przyciąga ludzi do C ++. Jednym słowem powodem numer jeden jest kontrola. Kiedy programujesz w C ++, masz pełną kontrolę nad swoim programem. Chcesz zastąpić bibliotekę Standard? Możesz. Chcesz robić niebezpieczne rzuty wskaźnikowe? Możesz. Chcesz naruszyć stałą poprawność? Możesz. Chcesz wymienić alokator pamięci? Możesz. Chcesz kopiować surową pamięć bez względu na jej typ? Jeśli naprawdę chcesz. Chcesz dziedziczyć po wielu implementacjach? To twój pogrzeb. Do diabła, możesz nawet uzyskać biblioteki śmieci, takie jak kolektor Boehm. Potem masz problemy, takie jak wydajność, która ściśle towarzyszy kontroli - im więcej kontroli ma programista, tym bardziej zoptymalizowany może stworzyć swój program.
Oto kilka rzeczy, które widziałem, przeprowadzając małe badania i rozmawiając z kilkoma osobami, które próbowały:
Ujednolicona hierarchia typów. Użytkownicy C ++ bardzo rzadko korzystają z dziedziczenia, większość programistów C ++ woli kompozycję, a typy powinny być łączone poprzez dziedziczenie tylko wtedy, gdy istnieje ku temu dobry powód. Pojęcie obiektu silnie narusza tę zasadę, łącząc każdy typ. Ponadto narusza jedną z podstawowych zasad C ++ - używasz tylko tego, co chcesz. Brak możliwości wyboru dziedziczenia po Object i związane z tym koszty są bardzo sprzeczne z tym, co C ++ oznacza jako język, jeśli chodzi o zapewnienie programiście kontroli nad jego programem.
Słyszałem o problemach z funkcjami i delegatami. Najwyraźniej D ma zarówno funkcje, jak i delegatów jako typy funkcji wywoływalnych w czasie wykonywania, i nie są one takie same, ale są one wymienne lub ... coś? Mój przyjaciel miał z nimi sporo problemów. Jest to zdecydowanie obniżenie wersji C ++, która właśnie ma std::function
i gotowe.
Masz kompatybilność. D nie jest szczególnie kompatybilny z C ++. Mam na myśli, że żaden język nie jest kompatybilny z C ++, spójrzmy prawdzie w oczy, z wyjątkiem C ++ / CLI, który jest rodzajem oszustwa, ale jako bariera wejścia, należy o tym wspomnieć.
Są jeszcze inne rzeczy. Na przykład po prostu przeczytaj wpis w Wikipedii.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
jest jedną z najbardziej niebezpiecznych funkcji, jakie kiedykolwiek wymyślono, w tej samej rodzinie, co duże problemy, jak gets
ze starej biblioteki C Standard. Jeśli szukasz tego w Stack Overflow, znajdziesz wiele, wiele pytań związanych z jego niewłaściwym użyciem. Zasadniczo printf
jest to naruszenie SUSZENIA- podajesz typ w ciągu formatu, a następnie podajesz go ponownie, gdy podasz argument. Naruszenie DRY, gdy źle się pomylisz, zdarzają się bardzo złe rzeczy - powiedzmy, jeśli zmieniłeś typedef z 16-bitowej liczby całkowitej na 32-bitową. Nie można go w ogóle rozszerzyć - wyobraź sobie, co by się stało, gdyby wszyscy wymyślili własne specyfikatory formatu. Iostreamy w C ++ mogą być powolne, a ich wybór operatora może nie być najlepszy, a ich interfejs może korzystać z pracy, ale są zasadniczo zagwarantowane, że są bezpieczne, a DRY nie jest naruszone i można je łatwo rozszerzyć. Tego nie można powiedzieć printf
.
Bez wielokrotnego dziedziczenia. To nie jest sposób w C ++. Programiści C ++ oczekują, że będą mieć pełną kontrolę nad swoim programem, a język wymuszający to, czego nie można odziedziczyć, stanowi naruszenie tej zasady. Ponadto powoduje, że dziedziczenie (jeszcze bardziej) jest kruche, ponieważ jeśli zmienisz typ interfejsu na klasę, ponieważ chcesz zapewnić domyślną implementację lub coś takiego, nagle cały kod użytkownika zostanie uszkodzony. To nie jest dobra rzecz.
Innym przykładem jest string
i wstring
. W C ++ jest już dość bolesna konieczność konwersji między nimi, i czy ta biblioteka obsługuje Unicode, a ta stara biblioteka C używa tylko const char*
i trzeba pisać różne wersje tej samej funkcji w zależności od żądanego typu argumentu ciągu. Na przykład nagłówki Windows mają na przykład bardzo irytujące makra, aby poradzić sobie z problemem, który często może zakłócać twój własny kod. Dodanie dstring
do miksu tylko pogorszy sytuację, ponieważ teraz zamiast dwóch typów strun musisz zarządzać trzema. Posiadanie więcej niż jednego typu łańcucha zwiększy bóle konserwacyjne i wprowadzi powtarzalny kod dotyczący łańcuchów.
Scott Meyers pisze:
D jest językiem programowania stworzonym, aby pomóc programistom sprostać wyzwaniom współczesnego oprogramowania. Czyni to poprzez wspieranie modułów połączonych ze sobą za pomocą precyzyjnych interfejsów, federacji ściśle zintegrowanych paradygmatów programowania, wymuszonej izolacji językowej wątków, bezpieczeństwa typu modułowego, wydajnego modelu pamięci i innych.
Wymuszona przez język izolacja wątków nie jest plusem. Programiści C ++ oczekują pełnej kontroli nad swoimi programami, a język wymuszający coś zdecydowanie nie jest tym, co zalecił lekarz.
Wspomnę również o manipulacji ciągami w czasie kompilacji. D ma zdolność interpretowania kodu D w czasie kompilacji. To nie jest plus. Rozważ ogromne bóle głowy spowodowane stosunkowo ograniczonym preprocesorem C, dobrze znanym przez wszystkich doświadczonych programistów C ++, a następnie wyobraź sobie, jak bardzo ta funkcja będzie nadużywana. Możliwość tworzenia kodu D w czasie kompilacji jest świetna, ale powinna być semantyczna , a nie składniowa.
Ponadto możesz spodziewać się pewnego odruchu. D ma wyrzucanie elementów bezużytecznych, które programiści C ++ będą kojarzyli z takimi językami, jak Java i C #, które są w filozofii wprost przeciwstawne, a podobieństwa syntaktyczne przywołają ich również na myśl. Niekoniecznie jest to obiektywnie uzasadnione, ale z pewnością należy to odnotować.
Zasadniczo nie oferuje tak wiele, że programiści C ++ nie mogą tego zrobić. Może łatwiej napisać silni metaprogram D, ale może już pisać czynnikowymi metaprograms w C ++. Może D ty może napisać kompilacji ray-tracer, ale nikt tak naprawdę nie chce zrobić, że tak. W porównaniu z podstawowymi naruszeniami filozofii C ++, to, co możesz zrobić w D, nie jest szczególnie godne uwagi.
Nawet jeśli te rzeczy są tylko problemami na powierzchni, to jestem prawie pewien, że fakt, że na powierzchni D wcale nie wygląda jak C ++, jest prawdopodobnie dobrym powodem, dla którego wielu programistów C ++ nie migruje do D. Być może D sam musi wykonać lepszą pracę, reklamując się.