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?
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?
Odpowiedzi:
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.
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ę.
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.