blog.michalt.pl

C++ 20 – czas na małe podsumowanie

22.12.2020 23:39 Tech

Kończy się rok 2020, a wraz z nim omawianie nowości dwudziestego standardu na łamach mojego bloga. Czas na kilka małych podsumowań i uzupełnień, a także refleksji na przyszłość. We mnie najnowszy C++ budzi mieszane uczucia, bo tak naprawdę niektóre nowości są dosyć fajne, niektóre niezbyt, a sposób wykonania jeszcze innych budzi we mnie dosyć spore odrzucenie. Zastanawiam się nad tym, w jakim kierunku próbuje podążać ten język. Mimo mojej wieloletniej sympatii, odnoszę wrażenie, że jego twórcy sami chyba tego nie wiedzą.


Zbierzmy najpierw wszystkie wpisy na temat C++ 20 z bloga:

Oczywiście nowości jest więcej, wśród nich elementy znane programistom języka Go z biblioteki fmt zawarte w postaci std::format, szablonowy (generyczny) wariant funkcji lambda, designated initlializers, które pozwalają w uproszczony sposób przypisać wartości do publicznych atrybutów obiektu, nowy typ dla znaków utf-8: char_8t i jeszcze kilka innych. Tworząc artykuły, starałem się przytoczyć jednak przykłady najbardziej przełomowych i najważniejszych zmian, które wnosi ten standard.


Czy aby na pewno gotowy i po co tyle pośpiechu?

Odniosłem wrażenie, że część nowości, które się tu pojawiły zostały wprowadzone w pośpiechu i w niezbyt przemyślany sposób. Przykładem jest brzydka implementacja spaceship operatora i korutyn. W korutynach mamy do czynienia z brakiem struktur danych i paskudnymi przedrostkami co_ - przypuszczam, że chodzi o zapewnienie jakiejś kompatybilności. Tylko po co? Po co ciągnąć w nieskończoność kompatybilność? Język powinien ewoluować i w pewnym momencie zrywać z kompatybilnością wsteczną. No i niedługo standard 23 – po co tak szybko? Nie jestem nawet pewien czy większość kompilatorów ogarnie do tego czasu standard 20. Może lepiej dać sobie 5 lat i wprowadzić bardziej dopracowane rozwiązania?


Ile C++ w C++ i ile C?

Myślę, że coraz mniej niestety i to już od standardu 14. Czym według mnie powinien być C++? Tym czym był w założeniach, czyli obiektowym i generycznym rozszerzeniem prostego języka C pozwalającego na pisanie szybkich aplikacji. Jednak C++ próbuje być trochę Go, trochę Javą, trochę JavaScriptem przez co staje się rozrośniętym śmietnikiem ciężkim do okiełznania i nauczenia. Pojawiają się w nim potworki syntaktyczne w stylu podpowiedzi ujętych w kwadratowe klamry i operatory z dziwnymi przedrostkami. Czy to nadal tylko C++ czy już C++++++++++? Co smutne, C++ zrywa również szybkością, która była jego dużym atrybutem: https://developercommunity.visualstudio.com/content/problem/19630/generators-using-co-yield-are-18x-slower-than-a-fo.html.

Wychodzę z założenia, że języki programowania powinny być wyspecjalizowane w danym obszarze i dostarczać pod dany obszar rozwiązania. Ciężko nie odnieść wrażenia, że C++ coraz bardziej stara się być językiem do wszystkiego – a jeśli coś jest do wszystkiego, jest do…
W przyszłych standardach planowane jest m.in. wprowadzenie refleksji – nie rozumiem po co… Wydaje mi się, że ten język został stworzony do zadań, które może ona spowolnić.


Dużo, grubo, wiele…

Niesamowicie podoba mi się prostota języka Go, który i owszem, pretenduje do miana języka uniwersalnego, ale przy tym jest niesamowicie prosty w konstrukcji. Uważam, że twórcy C++ powinni pomyśleć o odchudzeniu i uproszczeniu języka tak, aby wrócił on do korzeni znanych z C.

Podsumowując

Mój wpis jest dosyć krytyczny, ale mimo to, nie zamierzam rozstawać się z C++. Mimo wielkiej sympatii, nie zamierzam jednak tracić obiektywnego spojrzenia. Mój ulubiony język programowania podąża w nie najlepszym kierunku. Z pewnością będę się przyglądał nowościom, które mają się pojawić w C++ 23 i zapewne skrobnę coś na ich temat na łamach bloga.
To na tyle w tym wpisie, do przeczytania! :)