C++11 est arrivé!

2011-08-20 1:38

O ile tylko ktoś nie spędził zeszłego tygodnia na Antarktydzie, w amazońskiej dżungli czy w innym podobnie odciętym od cywilizacji miejscu, z pewnością słyszał najważniejszą nowinę ostatnich lat. A już na pewno wspomnianego tygodnia – bo przecież jak tu ją nawet porównywać z takimi błahostkami jak choćby zakup Motoroli przez Google. Przecież mówimy tutaj o pomyślnym końcu procesu rozpoczętego w czasach, gdy Google nawet nie istniał! To musi robić wrażenie… I nawet jeśli owym wrażeniem jest głównie: “No wreszcie; co tak długo?!”, to przecież w niczym nie umniejsza to rangi wydarzenia.

Tak, mamy w końcu nowy standard C++! I to w sumie mogłoby wystarczyć za całą notkę, bo chyba wszystko, co można by powiedzieć na temat kolejnej wersji jednego z najważniejszych języków programowania, zostało już pewnie dawno powiedziane w dziesiątkach serwisów informacyjnych, tysiącach blogów i milionach tweetów. Znaczącą ich część zajmują omówienia nowych możliwości języka, dostępnych zresztą od jakiegoś czasu (acz w niepełnej formie) w kilku wiodących kompilatorach. Możliwości tych jest całkiem sporo i dlatego nie mam zamiaru nawet wyliczać ich wszystkich. Zdecydowałem, że w zamian przyjrzę się bliżej tylko trzem z nich – tym, które uważam za najbardziej znaczące i warte uwagi.

Pierwszą z nich jest wbudowane, standardowe wsparcie dla wielowątkowości. Dodanie tak złożonego i “systemowego” aspektu do samego języka (a dokładniej jego standardowej biblioteki) jest w pewnym stopniu zaskakujące. Wydawać by się wręcz mogło, że jest to niespójne z dotychczasowymi założeniami języka, w którym nawet pozornie proste, ale zależne mocno od platformy operacje – jak choćby przeglądanie listy plików – nie są natywnie wspierane. Lecz współbieżność staje się zbyt ważnym narzędziem programistycznym, żeby oddawać je całkowicie pod kontrolę systemów operacyjnych.
Dlatego w C++11 mamy nie tylko podstawowe wsparcie dla wielowątkowości (std::thread, modyfikator thread_local dla zmiennych wątkowych, std::mutex, operacje atomowe), ale również bardziej wyrafinowane narzędzia takie jak wywołania asynchroniczne z obsługą przyszłych rezultatów (futures) i ich “obietnic” (promises). Tego typu rozwiązania są od dość dawna obecne zarówno w innych tradycyjnych językach, takich jak Java, oraz w nieco nowszych wynalazkach w rodzaju Go. Uzupełnienie C++ o tę funkcjonalność jest więc bardzo rozsądne – na pewno bardziej niż zatrzymywanie się w pół drogi i poprzestanie tylko na podstawowej obsłudze wątków i najprostszej synchronizacji.

Drugim istotnym zbiorem nowych możliwości jest znacznie rozszerzone wsparcie dla programowania funkcyjnego. Nie chodzi tu tylko o wyrażenia lambda i ich składnię, która oczywiście natychmiast stała się przedmiotem wielu żartów – na czele ze sławetnym wywołaniem [](){}();. Definiowanie anonimowych funkcji “w locie” było przecież możliwe już wcześniej.
Nową jakością są choćby domknięcia (closures). C++11 jest przy tym jedynym znanym mi językiem, w którym są one jawne; oznacza to, że możliwe jest dokładne określenie, które zmienne z zewnętrznego kontekstu wchodzą w jego skład. Nie mniej ważne są: typ std::function, pozwalający sensownie operować na funkcjach jako wartościach, i operacja bind do wiązania argumentów funkcji z wartościami. Paradoksalnie feature‘y najbardziej reprezentatywne dla programowania funkcyjnego – funkcje wyższego rzędu – były w C++ dostępne od dawna np. w postaci algorytmów std::transform czy std::remove_if. Żeby jednak mogły być one używane w sensowny sposób trochę częściej niż raz na dwa lata, konieczne były odpowiednie dodatki do samego języka. Przypadkiem są to właśnie te, które się w nim niedawno pojawiły :)

Trzecią zmianę mógłbym opisać jako cały zestaw drobnych modyfikacji, polegających na “wypolerowaniu ostrych krawędzi”, którymi można było się chwilami pociąć – i to niekoniecznie przypadkowo ;) Wydaje mi się aczkolwiek, że wśród nich wyróżniają się usprawnienia związane z automatyczną inferencją typów, reprezentowane przez nowe słowo kluczowe decltype i nowe-stare słowo kluczowe auto. Eliminują one konieczność jawnego wpisywania różnych std::vector::const_reverse_iteratorów i innych podobnie pasjonujących nazw typów w praktycznie każdym miejscu, gdzie normalnie byłoby to konieczne. Korzyści są oczywiste dla każdego, kto widział prelekcję Public Static Void lub naoglądał się wystarczająco dużych ilości kodu, w którym znacząca treść pojawiała się dopiero po mentalnym odfiltrowaniu niepotrzebnych szczegółów.

Zarówno powyższe trzy, jak i większość pozostałych zmian wprowadzonych w C++11 wydają mi się częścią ogólnego trendu, by uczynić język bardziej “realnym”. Nie przeczę oczywiście, że metaprogramowanie oparte na szablonach nie jest interesujące i nie ma swoich zastosowań, ale jakoś nie wydaje się, by z praktycznego punktu widzenia było ono czymś więcej niż intrygującą ciekawostką. Nowy standard wyraźnie koncentruje się więc na rzeczywistych rozwiązaniach dla rzeczywistych programów, co swoją drogą nie oznacza wrzucenia weń wszystkiego, co tylko zostało kiedykolwiek formalne zaproponowane. Rezygnacja z odśmiecacza pamięci (garbage collector) czy nawet (już widzę, jak zostanę za to zrugany…) konceptów (concepts) jest krokiem w tym właśnie kierunku.

Jeśli chcemy uzyskać więcej informacji na temat zmian i nowych możliwości wprowadzanych w standardzie C++11, polecam zapoznanie się z poniższymi stronami:

Tags: , , , , , , ,
Author: Xion, posted under Programming »


9 comments for post “C++11 est arrivé!”.
  1. SebaS86:
    August 20th, 2011 o 7:52

    Dobrze, że coś się dzieje. Auto można było symulować operatorem typeof, można powiedzieć więc, że auto jest cukierkiem składniowym. ;)

    [OT]Czemu na blogu cisza o Aspirynie?[/OT]

  2. kapec94:
    August 20th, 2011 o 16:51

    Może i dobrze, że nie zdecydowali się na GC? C oraz C++ zawsze wydawały mi się być językami, w którym priorytetami jest wydajność, a tego typu rzeczy niepotrzebnie by tylko mogły spowalniać. Jak ktoś chce, to sobie sam coś takiego zaimplementuje :)

  3. olo16:
    August 21st, 2011 o 23:29

    @SebaS86: chybe operatorem decltype a nie typeof. Możnaby, ale ile by to zajmowało miejsca… A ten keyword powstał po to, by miejsce oszczędzać.

  4. MDW:
    August 22nd, 2011 o 8:39

    kapec94:
    Gdyby w C++ pojawił się obowiązkowy Garbage Collector to myślę, że popełniłbym samobójstwo. To byłoby dla mnie coś jakby śmierć kogoś bliskiego. :) Nienawidzę GC i z trudem go toleruję w innych językach.

  5. olo16:
    August 22nd, 2011 o 19:17

    @MDW: pragnę zauważyć, że “obowiązkowy” GC w C++ byłby niemal niemożliwy z racji prostoty wskaźników.

  6. n:
    August 23rd, 2011 o 8:39

    @olo, prostota wskaźników to jeszcze nie problem, prawdziwym wyzwaniem byłoby zrobienie go tak, by nie zniszczył sensu stosowania wskaźników. ja uwielbiam bezpośrednie zarządzanie pamięcią i nie wyobrażam sobie programowania z systemem “który wie lepiej”

  7. Kos:
    August 23rd, 2011 o 18:06

    Ja sobie wyobrażam. Ale za konceptami będę tęsknił!
    Następny plugin do eclipsa, jaki chciałbym napisać: graficzny oglądacz komunikatów błędów. :D Fani TMP w C++ przysyłaliby mi kwiaty po ostatnie dni.

  8. Sebas86:
    August 26th, 2011 o 22:20

    @olo16: teraz dojrzałem, że typeof jest rozszerzeniem, niemniej działa z GCC, a przez to na wszystkich platformach, z których chcę lub muszę korzystać. Cholera, jeśli chcieli dołączać to do standardu nie mogli nazwać tego normalnie tylko decltype? No nic zrobi się makro…

  9. Xion:
    August 26th, 2011 o 22:46

    @Sebas86: decltype mówi dokładnie, że jest to typ deklarowany wyrażenia, który nie musi być zgodny z typem w runtime. typeof jest więc trochę wieloznaczne, bo nie wiadomo do którego się odnosi. (Podobnie zresztą jak typeid).

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.