blog.michalt.pl

Jaki kompilator do C++ w 2021 roku?

12.01.2021 23:58 Tech

Moim zdaniem taki, który najlepiej wspiera standard C++ 20, ale i nie tylko. Dziś podzielę się z Wami moimi przemyśleniami na ten temat i dokonam drobnego przeglądu dostępnych na rynku kompilatorów i ich bibliotek standardowych. W swojej analizie będę się opierał na wiadomościach zawartych tutaj: en.cppreference.com/w/cp...support/20. W przedstawionych tam tabelach znajdziemy zestawienie wielu wersji kompilatorów, ja skupię się na najświeższych.


Mając na uwadze zarówno kompilator jak i standardową bibliotekę, w stawce liczą się rozwiązania z czterech stajni (a właściwie z trzech, bo mamy do czynienia z dwoma wariantami Clanga): GCC, MSVC, Clang i Apple Clang. Postanowiłem wykluczyć rozwiązanie Nvidii, ponieważ zostało ono wyspecjalizowane do celów graficznych. Najlepiej wspierającym C++20 kompilatorem jest GCC: 69/69 nowości – w tym 2 punty to wsparcie częściowe. Na drugim miejscu plasuje się Microsoft z MSVC: 61/69 – w tym 5 nowości posiada częściowe wsparcie. Na trzecim znajdziemy Clang z wynikiem 55/69 - z czego 5 to wsparcie częściowe i na samym końcu Applowy wariant Clanga z wynikiem 38/69 - z czego 6 to wsparcie częściowe.


Podobnie sytuacja ma się z bibliotekami standardowymi, tu GCC wypada z wynikiem 66/78, MSVC z wynikiem 65/78 – w tym 2 to wsparcie częściowe, na trzecim miejscu Clang 44/78 i na końcu Apple Clang 33/78 – w tym 6 to wsparcie częściowe.


Kierując się zestawieniem, powinniśmy sięgać po ostatnie wersje kompilatorów. W przypadku GCC jest to wersja 11, a CLang 12 – rzecz w tym, że obie w chwili obecnej są w stadium rozwojowym. Istnieje jednam możliwość pobrania ich ze stron twórców i dokonania samodzielnej kompilacji – oba kompilatory powinny zostać wydane w okolicach drugiego kwartału tego roku. W przypadku Microsoft Visual C++ powinniśmy sięgnąć po wersję 19.28.


Czy tylko wsparcie nowych standardów jest istotne?

Może się okazać, że wręcz przeciwnie. Kluczowa powinna być również jakość kodu generowanego przez kompilator, a także jego dostępność. Co nam na przykład po MSVC na systemach uniksowych? Jak zapewne zauważyliście, żaden z powyższych nie wspiera dwudziestki w 100%. Mimo iż na przykład GCC 11 posiada wsparcie dla wszystkich nowości, dla części jest ono niepełne. Istotne może być wsparcie lub jego brak dla pożądanego przez nas elementu. Na przykład dla mnie ważna jest obsługa modułów, która nie jest w pełni wspierana w rozwojowej wersji GCC - z mojego indywidualnego punktu widzenia mógłby być to problem i jako linuksowiec nie mam w tym obszarze alternatyw. Na szczęście ostatni skompilowany przeze mnie snapshot z 10 stycznia po dodaniu flagi -fmodules-ts obok -std=c++20 rozwiązuje problem i moduły śmigają. Zamierzam do nich wrócić na łamach bloga. Z pewnością każdy mój projekt (nawet te wcześniejsze) będzie pisany z ich użyciem.


Jaki kompilator?

Ja wybrałem GCC 11 - dla mnie jest kompletny, najlepiej wspiera C++ 20, posiada wsparcie dla modułów, które jest dla mnie bardzo ważne i działa na Linuksie.


To na tyle w pierwszym wpisie w 2021 roku. :)
Do przeczytania. :)