Use C++11

Jakiś czas temu trafiłem w sieci na jakiś artykuł opisujący powody, dla których warto używać nowej odsłony języka C++. Nowy standard oficjalnie został zatwierdzony przez komitet 12 sierpnia 2011 roku, ale na długo przed tym wydarzeniem większość liczących się kompilatorów w jakimś stopniu wspierała nowe możliwości języka. Zatem pewnie większość deweloperów nie tylko zna większość nowinek, ale już stosuje je w swoich projektach.

Nie chcę tutaj rozdrabniać się na poszczególne "nowe zabawki" języka i biblioteki standardowej, ani też próbować ewangelizować, edukować, czy prezentować fragmenty kodu. Nie tym razem. Dziś poruszamy bardziej filozoficzną i psychologiczną stronę tematu.

Czy warto stosować C++11?

Odpowiedź wydaje mi się oczywista – oczywiście, że warto. W końcu C++ to już C++11. Nowe możliwości i usprawnienia jakie wniósł nowy standard ułatwią programowanie w tym języku, zwiększą produktywność i wydajność. Wydaje mi się , że warto korzystać z nowych technologii i nowych możliwości.

A czy biznes jest na to gotowy?

Tutaj już nie jest tak kolorowo. Wydaje mi się, że minie jeszcze sporo czasu, zanim nowe możliwości języka C++ zaczną być używane produkcyjnie przez biznes. Istnieje duża baza kodu napisanego na przestrzeni lat., które go nie opłaca się dotykać. Podobnie sprawa wygląda z narzędziami, mimo to, ze obecnie liczące się kompilatory już od dawna oferują wsparcie większej części nowości C++11, a z wersji na wersję jest coraz lepiej, to biznes nie podąża zbyt szybko za nowościami, snuje się powoli. Co niestety doprowadza do tego, ze wciąż w wielu miejscach używa się starych narzędzi (kilkunastoletnich), a tworzony w takich warunkach kod daleki jest od ideału – większość to stare nawyki i style, pisanie w C z klasami, pomijanie wielu mechanizmów języka, nieużywanie STLa, itd.

Czasami wystarczy przekompilować tylko stary kod z nowym kompilatorem wspierającym nowe (aktualne) mechanizmy języka, aby go usprawnić. Inteligentny kompilator zasygnalizuje wiele błędnych i niebezpiecznych konstrukcji w takim starym kodzie, a także poprawi wydajność. Chociażby używając nowej implementacji STLa, wsparcia dla rvalue references, move semantics... a to tylko wierzchołek góry lodowej :)

Jednym z dobrych przykładów zastosowania C++11 w biznesie jest Facebook, który tworzone przez siebie oprogramowanie podtrzymujące całą jego infrastrukturę wydaje jako open source. W tym biblioteka folly (github), napisana w C++11, będąca szybkim i wydajnym odpowiednikiem większości elementów biblioteki standardowej i boosta.

W internecie można znaleźć wiele materiałów odnośnie nowego standardu i bogate przykłady wykorzystania tych mechanizmów, dlatego myślę, że powielanie tego nie ma większego sensu. Niemniej mam wielka nadzieje, że będę mógł czasem zaprezentować na devblogu coś innego, jakiś przykład z życia wzięty, powiązany z konkretnym problemem lub ciekawym zastosowaniem. Bo standardowe zastosowania i standardowe przepadki użycia są standardowo jasne i wszystkim zainteresowanym znane.

Jako "ciasteczko" można podać artykuł H. Suttera o elementach nowoczesnego stylu C++ lub krótki przegląd C++11 D. Kaleva: The Biggest Changes in C++11 (and Why You Should Care).

Wspomniałem, że kompilatory wspierają nowe mechanizmy i rozszerzenia języka, chcesz wiedzieć w jakim stopniu Twój ulubiony kompilator sobie radzi z C++11? Poszukaj na stronach domowych lub blogach zespołów odpowiedzialnych za rozwój tych narzędzi. W sieci pojawiają się również co jakiś czas ogólne zestawienia porównawcze przedstawiające postęp wdrażania nowe standardu C++ w najpopularniejszych kompilatorach.

Niedawno zacząłem rozwijać pewien sterownik dla systemu Windows. Projekt ten tworzony jest w "czystym" C. Dla jasności tylko kod używany w kernel-space jest w C, reszta to C++. Dlaczego akurat wybrałem C? Poniekąd naturalny wybór, język ten wydaje mi się bardziej odpowiedni w takim zastosowaniu. Aczkolwiek po czasie dostrzegam brak pewnych elementów C++, kolokwialnym przykładem jest deklarowanie zmiennych w miejscu ich użycia. Co oczywiście nie znaczy, że powinien przepisać istniejący kod na C++ "bo tak będzie lepiej". Należy wybierać odpowiednie narzędzia do odpowiednich zastosowań.

Update @ 16:15

Polecam wczorajszą notatkę Berrisa "C++11 - The Time is Now".

4 przemyślenia nt. „Use C++11”

  1. Czy używać c++11? Dość trudne pytanie przy dużych projektach, które podzielone są na mniejsze kompenty. Trzeba zachowywać zgodność, co nie jest takie łatwe jeśli musimy to zrobić równocześnie w różnych częściach świata. Dostrzegam jeszcze kilka istotnych problemów pozornie mniejszej wagi:
    – wszyscy programiści nagle zaczną implementować super move-semantic, auto, lambda in lambda in lambda, constexpr. Co po czasie łatwo doprowadzi do ogólnej sieczki i trudności w utrzymaniu „prostego” kodu. Kod w dużych projektach powinnien być łatwy w „maintenance” aka „large scalable systems”, a nie nazbyt przeładowany super rozwiązaniami, gdzie zyskiem jest jedno odwołanie do funkcji,
    – C++11 jeszcze nie jest w pełni zaimplementowany http://clang.llvm.org/cxx_status.html , http://gcc.gnu.org/projects/cxx0x.html,
    – najnowsze wersje GCC oraz CLANG nie są jeszcze dobrze „przetestowane”,
    – narzędzia typu cppcheck, klockwork (niezwykle pomocne) nie posiadają jeszcze dobrze rozwiniętego wsparcia dla C++11.

    Moim zdaniem trzeba zacząć używać C++11, ale uważnie i z rozsądkiem. Z pełnym wymaganym przejściem w produkcyjnym kodzie poczekałbym do zaimplementowania w pełni nowego standardu (co mam nadzieję nastąpi przed C++14).

    It’s good to see you back mr Malcom.

  2. To jest proste, traktujesz wszystkie komponenty jako czarne skrzynki, o scisle okreslonym interfejsie i voilaa – robisz w nich co chesz i jak chcesz ;)

    Mysle, ze zawsze istniala taka mozliwosc, ze szczegolnie poczatkujacy po zachwyceniu nowymi ‚ficzerami’ szybko rzucali sie w wir ich stosowania, w sytuacjach, gdzie nie zawsze bylo to uzasadnione.

    Z nowych elementow, ktore wymieniles, to jedne z tych wlasnie elementow, jakie beda najczesciej wykorzystywane w nowych i starych projektach, bo cholernie ulatwiaja sprawe i upraszczaja kod… (gdy juz sie wie jak je uzywac i jak czytac taki kod ;)

    Tez sie ciesze, ze niektorzy tutaj jeszcze zagladaja.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *