LLVM vs Clang w systemie OS X

136

Mam pytanie dotyczące llvm, clang i gcc w systemie OS X.

Jaka jest różnica między llvm-gcc 4.2, llvm 2.0 i clang? Wiem, że wszystkie opierają się na llvm, ale czym się różnią?

Oprócz szybszej kompilacji, jaka jest przewaga llvm nad gcc?

dominik
źródło
9
llvm to tylko backend, nie może być samodzielnego kompilatora llvm ... są dla niego tylko różne nakładki, takie jak gcc i clang.
smerlin
5
@smerlin: „llvm compiler” to nazwa handlowa Apple dla clang + llvm: developer.apple.com/technologies/tools/ ...
Stephen Canon
Więcej szczegółów tutaj: stackoverflow.com/a/26724886/1938163
Marco A.

Odpowiedzi:

206

LLVM pierwotnie oznaczał „maszynę wirtualną niskiego poziomu”, ale teraz jest po prostu sobą, ponieważ urósł do czegoś innego niż tradycyjna maszyna wirtualna. Jest to zestaw bibliotek i narzędzi, a także standaryzowana reprezentacja pośrednia, która może być używana do tworzenia kompilatorów i kompilatorów just in time. Nie może samodzielnie kompilować niczego poza swoją własną reprezentacją pośrednią; aby to zrobić, potrzebuje interfejsu specyficznego dla języka. Jeśli ludzie odnoszą się tylko do LLVM, prawdopodobnie mają na myśli tylko bibliotekę niskiego poziomu i narzędzia. Niektórzy ludzie mogą niepoprawnie nazywać Clang lub llvm-gcc jako „LLVM”, co może powodować pewne zamieszanie.

llvm-gcc to zmodyfikowana wersja GCC, która używa LLVM jako swojego zaplecza zamiast własnego GCC. Jest teraz przestarzały, na korzyść DragonEgg, który wykorzystuje nowy system wtyczek GCC, aby robić to samo bez rozwidlania GCC.

Clang to zupełnie nowy kompilator C / C ++ / Objective-C, który używa własnego interfejsu i LLVM jako zaplecza. Zapewnia to lepsze komunikaty o błędach, krótszy czas kompilacji i łatwiejszy sposób podłączenia innych narzędzi do procesu kompilacji (takich jak debugger LLDB i analizator statyczny Clang ). Jest również dość modularny, więc może być używany jako biblioteka dla innego oprogramowania, które musi analizować kod C, C ++ lub Objective-C.

Każde z tych podejść (zwykłe GCC, GCC + LLVM i Clang) ma swoje zalety i wady. Ostatnie kilka zestawów testów porównawczych, które widziałem, pokazało, że GCC generuje nieco szybszy kod w większości przypadków testowych (chociaż LLVM miał niewielką przewagę w kilku), podczas gdy LLVM i Clang dały znacznie lepsze czasy kompilacji. GCC i kombinacje GCC / LLVM mają tę zaletę, że przetestowano znacznie więcej kodu i działa on w wersji C z GCC; jest kilka rozszerzeń specyficznych dla kompilatora, które ma tylko GCC, oraz miejsca, w których standard pozwala na zmianę implementacji, ale kod zależy od jednej konkretnej implementacji. Jest o wiele bardziej prawdopodobne, że jeśli dostaniesz dużą ilość starszego kodu C, będzie on działał w GCC, niż w Clang, chociaż z czasem jest to coraz lepsze.

Brian Campbell
źródło
13
Aby dodać do tej wspaniałej odpowiedzi: clang to także zestaw bibliotek (zwanych libclang), których możesz używać do takich rzeczy, jak analiza kodu, autouzupełnianie, podświetlanie składni itp. Jest to bardzo przydatne w środowiskach IDE.
5
Tworząc dla MacOS X lub iOS, weź pod uwagę, że Clang to oprogramowanie, którego Apple używa do budowania całego oprogramowania MacOS X i iOS, w tym systemu operacyjnego, i że Clang jest tym, co dostajesz automatycznie, bez wysiłku i wszystkim, czego kiedykolwiek prosić o pomoc. Apple nigdy nie wspierało gcc w wersjach starszych niż gcc 4.2 i nie dostarcza już żadnej wersji gcc.
gnasher729
1
@ gnasher729 Tak, ta odpowiedź została napisana 3 lata temu, kiedy Apple nadal dostarczało zarówno llvm-gcc, jak i Clang, z llvm-gcc jako domyślnym kompilatorem. Od tego czasu czasy się zmieniły.
Brian Campbell
56

Są tutaj 2 różne rzeczy.

LLVM to kompilator zaplecza przeznaczony do tworzenia kompilatorów na jego podstawie. Zajmuje się optymalizacją i produkcją kodu dostosowanego do docelowej architektury.

CLang to interfejs, który analizuje kod C, C ++ i Objective C i tłumaczy go na reprezentację odpowiednią dla LLVM.

llvm gcc było początkową wersją kompilatora C ++ opartego na llvm opartego na gcc 4.2, który jest obecnie przestarzały, ponieważ CLang może analizować wszystko, co mógł przeanalizować, i nie tylko.

Wreszcie główna różnica między CLang i gcc nie polega na produkowanym kodzie, ale na podejściu. Chociaż gcc jest monolitem, CLang został zbudowany jako zestaw bibliotek. Ta modułowa konstrukcja zapewnia duże możliwości ponownego wykorzystania na przykład IDE lub narzędzi uzupełniających.

W tej chwili kod generowany przez gcc 4.6 jest generalnie nieco szybszy, ale CLang wypełnia lukę.

Matthieu M.
źródło
5

llvm-gcc-4.2 używa interfejsu GCC do analizowania kodu, a następnie generuje skompilowane dane wyjściowe przy użyciu LLVM.

Kompilator llvm 2.0 używa front-endu clang do analizowania kodu i generuje skompilowane dane wyjściowe przy użyciu LLVM. „clang” to właściwie tylko nazwa tego interfejsu, ale często jest używany jako nazwa całego kompilatora.

Stephen Canon
źródło