C++, kompilatory

C++, kompilatory
0

Cześć ;)

Jak wiadomo, do kompilowania C++ mamy szeroką gamę kompilatorów, najpopularniejsze to gcc, clang, od Microsoftu. Którego kompilatora ( i dlaczego) używa się programując zawodowo? Wiem, że odpowiedź może być: to zależy ( w takim razie pytanie brzmi od czego to zależy i którego używa się najczęściej?)

kq
Moderator C/C++
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Szczecin
1

gcc, ze względu na zgodność ze standardami i dostępność na różnych systemach. Chętnie bym też używał clanga, ale pod windowsem na razie ciężko.


mlyszczek
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Wrocław
  • Postów:167
1

gcc, bo

  • jest open source,
  • działa na wielu platformach,
  • kompiluje na wiele platform,
  • jest bezpłatny,
  • ma całkiem niezły optymalizator,
  • dzięki fladze -pedantic możemy pisać przenośny kod, który mamy pewność, że skompiluje każdy kompilator zgodny ze standardem,
  • bardzo popularny,

clang za to jest niezły ze względu na jego statyczna analizę kodu, która całkiem nieźle działa, ale jeszcze nie jest tak dojrzały i przetestowany jak gcc.

K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
1

GCC jest chyba najlepiej rozwiniętym kompilatorem, wspiera wiele systemów, głównie uniskowych ale też i Windowsa ale trochę słabiej, nie jest oficjalnym portem. Wspiera multum architektur, ARM, AVR i inne :P Jest GPL - jest free as freedom, nie tylko open source to różnica na duży plus.
https://gcc.gnu.org/install/specific.html

Clang jest wpierany przez Apple i jest używany w systemach tej firmy. Jest lepszy w założeniach od GCC czyli będzie szybszy i zużywający mniej pamięci podczas kompilacji. Clang nie jest jeszcze w pełni gotowy.
Jest na licencji BSD, open source, tylko to według mnie jego wada bo może zostać oprogramowaniem zastrzeżonym.
http://www.phoronix.com/scan.php?page=article&item=gcc-61-clang39&num=2

Kompilator Microsoftu wspiera tylko Windows, to tak jak intel c++ compiler wspiera lepiej procesory Intel niż AMD. Nie polecam niczego od Microsoftu z systemem włącznie.

Jeżeli chcesz stworzyć aplikację którą będziesz mógł przekompilować na inne systemy czy architektury wybierz GCC
Bardzo sobie cenie ten kompilator.


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 7x, ostatnio: kacper546
several
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 minut
0

Będzie trochę offtop, przepraszam, ale what the hell

kacper546 napisał(a):

Clang nie jest jeszcze w pełni gotowy.

Że co?

mlyszczek napisał(a):

clang za to jest niezły ze względu na jego statyczna analizę kodu, która całkiem nieźle działa, ale jeszcze nie jest tak dojrzały i przetestowany jak gcc.

Każdy kolejny kompilator jest i będzie z automatu gorszy bo został wydany po gcc?

Na linuxie nie widzę żadnego powodu by nie używać clang'a. Mniejsze binarki wynikowe (sam porównywałem tylko dwa systemy powyżej 50k wierszy, ale mi to wystarczy), świetne komunikaty błędów, toolset które otrzymujesz "out of the box" bez dodatkowego szperania po sieci, nazewnictwo flag pokrywające się z gcc... Nie ma absolutnie żadnego powodu by nie linuxie nie używać clanga, chyba że skompilowałeś swój system gcc i clangiem i przetestowałeś, że kod wynikowy od gcc dla Twojego systemu jest szybszy.


edytowany 3x, ostatnio: several
Zobacz pozostałe 2 komentarze
several
Fair enough, ale o wydajności wspomniałem w ostatnim zdaniu. Sam mierzyłem tylko jeden projekt, clang w wersji 3.5.0 i gcc w wersji którego numery nie pamiętam, jeden z pierwszych wspierających c++14 i wyszło mi, że dla mojego systemu to nie miało znaczenia.
vpiotr
clang 3.3 jest używany w C++ Builder 10.1 (Windows) - może już wystarczająco stabilny?
several
@vpiotr c++14 w clang od wersji 3.5 jeśli dobrze pamiętam.
vpiotr
@several: możliwe, z tego co widziałem, clang 3.3 to raczej poziom C++11.
mlyszczek
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Wrocław
  • Postów:167
1

Chodzi o to, że gcc jest na rynku już blisko 30 latT To jest 30 lat testowania, bugfixingu przez naprawdę wiele osób - w tym duże firmy. etc, a clang jest na rynku raptem 8 lat i nie jest jeszcze tak dobrze przetestowany. Ja nie mówię, że clang jest zły, ale osobiście na dzień dzisiejszy nie zamieniłbym gcc na clanga w moich projektach.

kq
Clang ma czystszy kod, mniej bugfixingu również wynika z mniejszej ilości błędów z powodu mniejszej ilości spagetti.
several
Z tzw "personal preference" nie będę dyskutował, ale spróbuj, choćby z ciekawości albo żeby udowodnić mi, że się mylę. Sprofiluj jakiś swój projekt skompilowany gcc i clangiem, porównaj sobie output w trakcie kompilacji...
mlyszczek
W porządku, niech clang i generuje lepszy kod, ale nie jest ten kod tak przetestowany jak w gcc, nie mam pewności, że clang nie zrobi mi jakiegoś stworka, jasne gcc też może to zrobić ale gcc jest po prostu lepiej przetestowany bo więcej ludzi z niego korzysta. Żeby nie było, że jestem jednostronny, gcc też ma bugi, kiedyś stary gcc źle linkował mi instrukcję armowską do dzielenia długich intów, i mi soft skakał w losowe miejsce. Ile się naszukałem o co chodzi to moje:P Możliwe że będę czasami testować clanga, ale produkcja na razie tylko gcc:)
KA
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 4 lata
  • Postów:192
0

@mlyszczek: OpenSSL jest na rynku przez blisko 20 lat i jest dobrze wytestowany, bugfixowany i... oh wait. :)

Jak potrzebujesz kompilatora, który potrafi wygenerować naprawdę wydajny kod, to chyba tylko ICC od Intela. Do tego masz bajery, których nie ma w clangu/gcc domyślnie (OpenMP, Cilk) + zoptymalizowane biblioteki do numeryki + IPP + niezły profiler (VTune).

several
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 minut
0

@kapojot ICC nie jest jednoznacznie lepszy od darmowych narzędzi, powiedziałbym że istnieje raczej dość wąski przedział zastosowań gdzie można by mniemać, że ICC wygeneruje wydajniejszy kod. Jestem też absolutnie pewien, że dla niektórych systemów binarka od ICC będzie wolniejsza od tej wygenerowanej przez gcc.

A VTune jest zajebisty, serio, najprzyjemniejszy profiler z jakim pracowałem, drogi ale wart każdego grosza. Tylko, że można go sobie kupić osobno i nie trzeba kompilować ICC żeby go używać.


edytowany 2x, ostatnio: several
KA
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 4 lata
  • Postów:192
0

@several: ICC lepiej robi chociażby wektoryzację kodu. Zwykle, żeby dogonić to, co ICC zrobiło ze średnio zoptymalizowanego kodu w C, w gcc musiałem już używać intrinsiców i niemalże ręcznie wszystko optymalizować. Czy wygeneruje szybszy kod do aplikacji "ogólnego przeznaczenia" - nie wiem, nigdy go do tego nie używałem.

Zobacz pozostały 1 komentarz
KA
Akurat OpenSSL w środku ma masę asemblera i wszystkie prymitywy kryptograficzne (typu redukcja Montgomery'ego, mnożenie algorytmem Karacuby) są tak robione, że przy starcie OpenSSL z cpuid odczytuje ficzery wspierane przez procka, a następnie za pomocą masy skoków warunkowych wybiera sobie optymalne przejście. Zmiana kompilatora wiele by tu nie pomogła.
several
W moim przypadku binarka chodziła na wirtualce, bez fizycznego dostępu do procesora, także z góry wiedziałem że nie za wiele zyskam ale ktoś decyzyjny chciał sprawdzić. Hmm, ja niestety nie operuje na tak nisko poziowym prymitywach, dla mnie prymitywem jest jedna runda AESa.
KA
Od kiedy to wirtualka zakłada brak fizycznego dostępu do procesora? Przecież wirtualizacja dotyka tylko instrukcji uprzywilejowanych, które są wyłapywane i wirtualizowane przez zarządcę. Wszystko, co działa w user space działa bez najmniejszej różnicy.
several
Oczywiście, że nie zakłada i oczywiście że działa tak samo pod kątem funkcjonalnym. Ale z mojego empirycznego doświadczenia wynika, że wydajność apki na fizycznej maszynie nie zawsze przekłada się na wydajność tejże apki uruchomionej na instancji w aws. Eeeh, gdybym tyko mógł zagłębić się w ten temat...
several
edit: Ale fakt, OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc prawie dwa razy wolniej na instancji w terremarku. Muszę trochę zweryfikować swoje założenia.
mlyszczek
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Wrocław
  • Postów:167
0

Ehmmm @kapojot ale jak ja skompiluję za pomocą ICC kod na jakiegoś cortex'a, albo avr'a:) ICC wspiera chyba tylko swoje procki.

KA
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 4 lata
  • Postów:192
2

O ile pamiętam, to język miał być przenośny nie kompilator i dla danej platformy powinieneś użyć najlepszego kompilatora.
AVR jest zbyt prymitywny, żeby mówić o jakichś większych optymalizacjach.
Co do ARM - Intel miał swego czasu coś dla XScale, ale poza tym, to wszystkie ARM-y to bezpośrednie zagrożenie dla Intela, więc nawet patrząc od strony biznesowej nie liczyłbym na jakieś rewolucje :). Ale patrząc po tym, jak ARM wyparł Atomy, a teraz atakuje serwery - za chwilę wszystko może się zmienić. Do tego - rozszerzenia wektorowe ARM-a (NEON) wyglądają ciut lepiej niż ich Intelowe odpowiedniki.

Edit:
Popatrzcie na to trochę szerzej - kiedyś (90's) była idea odchodzenia od CISCów i robienia prostych procesorów RISC-owych o możliwie jak najogólnieszym zestawie prostych i szybkich instrukcji. W tamtym świecie kompilatory radziły sobie nawet nieźle. Od jakiegoś czasu (początek 2000) idziemy w drugą stronę - pojawiają się coraz potężniejsze jednostki wektorowe, dedykowane instrukcje do przeróżnych rzeczy, żeby wymienić tylko te od Intela: PCLMULQDQ, AESNI, SHA2, AVX2. Tego kompilatory najnormalniej w świecie nie ogarniają, a już zoptymalizowanie czegoś takiego jak najprostsze mnożenie macierzy przez macierz jest całkowicie poza ich zasięgiem. Cóż, pomału pozostaje nam wracać do czasów, gdzie zdecydowana większość optymalizacji będzie musiała być znowu klepana ręcznie.

edytowany 2x, ostatnio: kapojot
mlyszczek
Ty wyobrażasz sobie zupełnie inny toolchain dla każdego różnego procesora? Niby masz rację, jak coś jest naprawdę performance critical to tak można robić. Ale często nie potrzebujesz takiej hiper-duper optymalizacji. Wtedy taniej jest mieć jeden uniwersalny, mimo wszystko naprawdę dobry kompilator, który generuje dobry kod na wiele możliwych platform. Czasami po prostu koszty są nie współmierne do efektów i celu.
several
+1 za ostatnie zdanie o ręcznych optymalizacjach aleee....z tym "kompilatory nie ogarniają" to bym akurat był ostrożny
KA
@mlyszczek: Popatrz na to inaczej: w rozwiązaniach sieciowych w tym momencie jeden cache miss (200 cykli zegara) oznacza, że właśnie się spóźniłeś i przytkałeś ruch.
several
  • Rejestracja:ponad 15 lat
  • Ostatnio:5 minut
0

Offtop

Chciałem napisać komenta ale..

kapojot napisał(a):

Ale patrząc po tym, jak ARM wyparł Atomy, a teraz atakuje serwery - za chwilę wszystko może się zmienić.

To intel z atomem chciał wejść na terytorium ARMa, nie odwrotnie, dlatego nie można mówić/pisać że ARM wyparł atoma. Na serwerach ARM chce wejść na terytorium intela i z XEONem nie będzie mu tak łatwo jak z atomem. W chwilę to się raczej nic nie zmieni ;)


Zobacz pozostały 1 komentarz
several
Nie dał rady z czym? Nie dał rady zagarnąć większości rynku, ale na rynku jest obecny i z tego co wiem, atomy są i będą w sprzedaży przez najbliższy czas. ARM w tej chwili i w bliskiej przyszłości na serwerach może sobie wypracować pozycję podobną jaką intel ma wśród urządzeń mobilnych. Wtedy też uznasz że ARM nie dał rady czy uznasz za sukces że ARM bywa obecny na serwerach?
KA
Nie dał rady konkurować na rynku mobilnym i zamyka imprezę: http://www.chinatopix.com/articles/85333/20160502/intel-closes-atom-division-relinquishes-plan-mobile-market.htm A co do ARM-ów - obecnie Cortexy A53 potrafią mieć po 64 rdzenie i nie są to jakieś skrawki, jak w przypadku Xeon Phi. W tym momencie mocno portuje się na to soft systemowy i nie wiadomo, czy giganci, mający dzisiaj problemy z zasilaniem (Google) nie powitają takiej alternatywy z otwartymi rękami.
several
Ah, czyli rzucam nieaktualnymi argumentami, mea culpa. ARM "by design" ma być bardziej przyjazny dla systemów zasilania jak i emitować mniej ciepła. Intelowe procki mają być performentne. Każdy gra tym co ma i faktycznie może to wyjść ciekawie, ale tak czy siak nie sądzę żeby jakoś w najbliższej przyszłości miało się coś zmienić na niekorzyść intela na serwerach. Po prostu nie wierzę by intel powtórzył historię nokii.
mlyszczek
performentne - no prostytutka naprawdę?! Rozumiem spolszczanie niektórych słów, których za bardzo nie ma w naszym języku, albo się je trudniej używa, ale "performentne"?
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
2

Chodzi o to, że gcc jest na rynku już blisko 30 latT To jest 30 lat testowania, bugfixingu przez naprawdę wiele osób - w tym duże firmy. etc, a clang jest na rynku raptem 8 lat i nie jest jeszcze tak dobrze przetestowany.

Clang to nie tylko kompilator. To także libclang, biblioteka udostępniająca clangowy parser C++, do wykorzystania np. w mechanizmach podpowiadania składni, wykazach klas i metod itp.
GCC czegoś takiego nie ma, Stallman ponoć twierdził że celowo z powodów ideologicznych.

several
Dzięki czemu mamy np YouCompleteMe dla vima.
mlyszczek
Zgadzam się. Dlatego napisałem w 1 poście, że clang jest świetny ze względu na swój statyczny analizator kodu, który używam i jest naprawdę cacy:)
pylaochos
  • Rejestracja:ponad 13 lat
  • Ostatnio:29 dni
  • Lokalizacja:Warszawa
  • Postów:85
0

Z mojego doświadczenia: tam gdzie trzeba używasz kompilatora który bardziej pasuje. Najwięcej projektów robiłem pod Win32/64 i tam szło tylko msvc. Może nie wspiera całkowicie 11/14 etc. ale generuje dość szybki kod release i fantastcznie działa pod Visual Studio, którego najczęściej się używa w pracy pod windą. Gdy trzeba budować pod army/linuhy to clang/gcc. Tyle.

kq
Moderator C/C++
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Szczecin
2

Zupełnie przypadkiem i niepowiązanie wczoraj na ircu ##c++ była dyskusja o błędach gcc.

Kopiuj
namespace foo{}
decltype(foo) bar; // wtf?!

A to ICE siedzi w kompilatorze od 4.9 lub wcześniejszej wersji. Dobrze przetestowane spagetti jest tragiczne jeśli chcesz coś do niego dodać.

Kopiuj
struct foo
{
	void bar();
	void baz(void*){}
};

void foo::bar()
{
	auto l = [&](auto a){
		baz(a);
	};
	l(nullptr);
}

several
To ICE, shieeeet..
kq
To, ten, ta? Nie wiem w sumie :P
several
Ja też....nie wiem.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)