GCC vs clang / LLVM - zalety i wady każdego [zamknięte]

20

Jakie są zalety i wady GCC vs. clang / LLVM?

Jodie
źródło
3
Plusy / minusy dla kogo? LLVM jest wyraźnie lepszy jako backend dla kompilatorów, z wyjątkiem sytuacji, gdy potrzebujesz śmiesznej liczby obsługiwanych architektur. Ale zakładam, że mówisz o użytkownikach końcowych.

Odpowiedzi:

19

gcc jest bardzo dojrzały, łatwy w instalacji (przynajmniej dla większości systemów) i jest domyślnym kompilatorem wielu systemów, więc w wielu przypadkach ludzie go zainstalowali prawie nawet nie zdając sobie z tego sprawy. Został przeniesiony do zillion architektury, więc jest znacznie bardziej prawdopodobne, że będzie działać od razu po wyjęciu z pudełka, jeśli będziesz musiał atakować nieznany sprzęt.

clang jest znacznie nowszy. Często generuje znacznie lepsze komunikaty o błędach, szczególnie w przypadku szablonów C ++. W wielu przypadkach działa znacznie szybciej. Jest zbudowany przede wszystkim jako zestaw bibliotek, więc istnieje wiele innych projektów (np. Analizatory kodu), które używają tego samego interfejsu, rozumieją te same dane wejściowe itp. Korzystanie z llvm jako zaplecza daje mu dodatkową elastyczność w jak generujesz z niego kod.

Jerry Coffin
źródło
17
  1. Clang ma znacznie lepsze raportowanie błędów. Na przykład, jeśli popełnisz literówkę w nazwie funkcji, którą wywołujesz, Clang zgłosi, że jest to literówka (i zasugeruje poprawną nazwę), podczas gdy GCC będzie narzekać na nieznaną nazwę funkcji.

  2. GCC zwykle produkuje szybszy kod, jeśli celujesz na x86 / x86-64. W przypadku ARM sytuacja jest niejednoznaczna, często Clang lepiej optymalizuje. Ponadto AFAIK Clang nie obsługuje optymalizacji rozmiaru kodu.

  3. GCC wykorzystuje wiele heurystyki. Jest to dobre dla wydajności (w typowym przypadku), ale okropne, jeśli chcesz przeprowadzić optymalizację na poziomie źródła (np. Rozwijanie pętli). Nawet niewielkie zmiany kodu źródłowego mogą sprawić, że GCC wygeneruje zupełnie inne wyjście. Clang jest bardziej przewidywalny i zwykle generuje oczekiwany kod.

  4. W przeciwieństwie do Jerry'ego Trumna budowanie GCC ze źródła jest znacznie trudniejsze niż Clang. Procedura ze strony Pierwsze kroki Clanga zawsze działała dla mnie. Podobna instrukcja dla GCC nigdy nie działała za pierwszym razem. GCC jest zależne od konkretnych wersji GMP, MPFR, MPC, Parma Polyhedra Library i CLooG, i potrzebowałem kilku iteracji, aby znaleźć wersje, które działałyby dla określonej wersji GCC (tak, używanie najnowszych wersji tych bibliotek nie działa ).

  5. Mam wrażenie, że Clang jest lepiej przetestowany niż GCC. Mimo że używam tylko oficjalnych wersji GCC, czasami produkuje wadliwy kod. W przypadku Clanga zwykle używam wersji trunk (znowu, ponieważ jest łatwa do zbudowania), ale nigdy nie widziałem, aby generowała złe dane wyjściowe.

  6. GCC jest prawie standardem w świecie Linuksa i dodaje wiele niestandardowych funkcji, które są szeroko stosowane w oprogramowaniu Linux. Clang próbuje być kompatybilny z GCC, ale czasami po prostu cicho je ignoruje. Co najważniejsze, Clang nie obsługuje OpenMP. Ma jednak również rozszerzenia, które nie są obsługiwane przez GCC, ale mogą być przydatne (np. Funkcje wewnętrzne add-with-carry __buildin_addc).

  7. Jeśli chcesz przeprowadzić badania kompilatora lub po prostu ciekawi Cię, jak to działa, znajdziesz kod źródłowy Clang / LLVM bardziej dostępny. Kod Clang / LLVM jest czytelny dla człowieka, a nie tylko kompilatorowy.

  8. (Obowiązuje deklarator AINAL) Licencja Clang / LLVM daje więcej swobody w zakresie tego, co możesz zrobić z kodem, np. Wykorzystanie w produktach komercyjnych lub zamkniętych źródłach. Licencja na biblioteki wykonawcze GCC dodaje kolejną warstwę ograniczeń, podczas gdy środowisko wykonawcze kompilatora Clang (biblioteka kompilatora-rt) jest objęte zezwoleniem MIT.

Podsumowanie: skompiluj z Clangiem podczas opracowywania programu oraz z GCC do ostatecznej kompilacji (ale upewnij się, że jest szybszy i nie psuje się). Trzymaj się Clang / LLVM, jeśli prowadzisz badania kompilatora.

Marat Dukhan
źródło
Ciekawe, nigdy nie wiedziałem, że Clang ma w sobie cechy dodawania i przenoszenia. Ale to powinno być __builtin_add, nie __buildin_addc. W każdym razie Clang jest wystarczająco inteligentny, aby generować, addcgdy napotka szeroki add, używając porównania jako carry
phuclv
To znaczy __builtin_addcnie__buildin_addc
phuclv,
Porównania wydajności tutaj są nieaktualne. Według najnowszych testów, clang jest szybszy niż gcc na x86 / 64 w nieco ponad połowie testów (np. Openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules
3

Jeśli masz nową architekturę procesora lub nowe optymalizacje i chcesz je otworzyć na licencji GPL, możesz je wnieść do gcc. Jednak gcc jest mniej modułowy, więc może to wymagać więcej pracy, aby dodać własne modyfikacje / dodatki. Jeśli chcesz wnieść nowe architektury lub optymalizacje do projektu open source, ale na licencji innej niż GPL, możesz je wnieść do LLVM / clang. Istnieją korporacje, których działy prawne zezwalają tylko na te ostatnie.

hotpaw2
źródło
-3

Dzisiaj (8/11/2011) GCC obsługuje znacznie więcej funkcji C ++ 0x niż Clang. Jeśli chcesz tych funkcji, nie musisz się zastanawiać; GCC jest Twoją opcją.

Sean McMillan
źródło
Ta odpowiedź jest dokładna i zawiera informacje w czasie określonym zgodnie z moimi badaniami.
8
Ale tak naprawdę nie jest to bardzo dobra odpowiedź, ponieważ na dzień dzisiejszy (28/07/2012) jego punkt nie jest już ważny. Clang obsługuje więcej niż GCC, jeśli w ogóle.
DeadMG,