Use C++11

tech • 607 słów • 3 minuty czytania

Jakiś czas temu trafiłem w sieci na 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ś tam stopniu wspierała już nowe możliwości języka. Zatem pewnie większość deweloperów nie tylko zna wiele nowinek, ale stosuje je już w swoich projektach.

Nie chcę tutaj rozdrabniać się nad poszczególnymi nowymi elementami języka i biblioteki standardowej, ani też próbować ewangelizować, edukować, czy choćby prezentować fragmenty kodu. Nie tym razem. Dziś poruszam bardziej filozoficzną i psychologiczną stronę tego tematu.

Na pytanie: czy warto stosować C++11, odpowiedź wydaje mi się oczywista - warto! W końcu C++ to już od sierpnia C++11. Nowe możliwości i usprawnienia jakie wniósł nowy standard znacznie ułatwiają programowanie w tym języku, zwiększają produktywność i wydajność. Wydaje mi się, że nie ma opcji nie korzystać z tych nowych możliwości.

Inna kwestia to 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 tego, że obecnie liczące się kompilatory już od dawna oferują wsparcie większej części C++11, a z wersji na wersję jest coraz lepiej, to biznes rządzi się innymi prawami i snuje się powoli do przodu.

To niestety doprowadza do tego, że 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 programowania, czasami rodem prosto z C, pisanie w “C z klasami”, pomijanie wielu mechanizmów języka, nieużywanie STL-a, itd…

Czasami wystarczy tylko przekompilować stary kod z nowym kompilatorem, aby go usprawnić. Inteligentny kompilator zasygnalizuje wiele błędnych i niebezpiecznych konstrukcji, a także poprawi wydajność. Chociażby używając nowej implementacji STL-a, 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 fajnych materiałów odnośnie nowego standardu i bogate przykłady wykorzystania tych mechanizmów. Dlatego powielanie tego tutaj nie ma większego sensu. Niemniej mam wielką nadzieję, że będę mógł czasem zaprezentować na devblogu coś innego - jakiś przykład z życia wzięty, powiązany z konkretnym problemem. Bo standardowe zastosowania i standardowe przypadki użycia są standardowo jasne i wszystkim zainteresowanym znane.

Niemniej jako “ciasteczko” mogę polecić 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. Jeśli chcesz wiedzieć w jakim stopniu Twój ulubiony kompilator sobie radzi z C++11 to poszukaj informacji na stronach domowych lub blogach zespołów odpowiedzialnych za rozwój tych narzędzi. W sieci pojawiają się również ogólne zestawienia porównawcze przedstawiające postęp wdrażania nowego standardu C++ w najpopularniejszych kompilatorach.

Niedawno zacząłem rozwijać pewien sterownik dla systemu Windows. Projekt ten tworzony jest w “czystym” C, a dla jasności to 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++. Co oczywiście nie znaczy, że powinien teraz przepisać istniejący kod na C++ “bo tak będzie lepiej”. Należy wybierać odpowiednie narzędzia do odpowiednich zastosowań.

[dodano 2012-09-15 16:15]

Polecam wczorajszą notatkę BerrisaC++11 - The Time is Now”.

Komentarze (4)

KrzaQ
20120915-220908-krzaq

12 sierpnia 2001? A to ci nowość…

Malcom
20120916-123622-malcom

Mała literówka ;)

Wee
20121107-210941-wee

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 - clang-cxx, gcc-cxx0x,
  • 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.

Malcom
20121108-112710-malcom

To jest proste! Traktujesz wszystkie komponenty jako czarne skrzynki o ściśle określonym interfejsie i voila - robisz w nich to co chcesz i jak chcesz ;)

Myślę, że zawsze istniała taka możliwość, szczególnie przez początkujących, którzy po zachwyceniu się nowymi “ficzerami” szybko rzucali się w wir ich stosowania, w sytuacjach, gdzie nie zawsze było to uzasadnione.

Z nowych elementów, które wymieniłeś, to są to właśnie jedne z tych, jakie będą najczęściej wykorzystywane w nowych i starych projektach, bo cholernie ułatwiają sprawę i upraszczają kod… oczywiście, gdy się wie jak je używać i jak czytać taki kod ;)

Też się cieszę, że niektórzy tutaj jeszcze zaglądają.

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/