LLVM vs clang na OS X

Mam pytanie dotyczące llvm, clang i gcc na 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ą?

Poza szybszym kompilowaniem, jaka jest przewaga llvm nad gcc?

Author: piperchester, 2011-04-18

3 answers

LLVM pierwotnie oznaczało "niskopoziomową maszynę wirtualną" , ale teraz jest po prostu dla siebie, ponieważ stała się czymś innym niż tradycyjna maszyna wirtualna. Jest to zestaw bibliotek i narzędzi, a także ustandaryzowana reprezentacja pośrednicząca, która może być używana do budowania kompilatorów i kompilatorów just-in-time. Nie może skompilować niczego innego niż własną reprezentację pośrednią; potrzebuje do tego nakładki specyficznej dla języka. Jeśli ludzie tylko odnoszą dla LLVM oznacza to prawdopodobnie tylko bibliotekę i narzędzia niskiego poziomu. Niektórzy ludzie mogą niepoprawnie określać Clang lub llvm-gcc jako "LLVM", co może powodować pewne zamieszanie.

Llvm-gcc jest zmodyfikowaną wersją GCC, która używa LLVM jako swojego backendu zamiast własnego GCC. Jest teraz przestarzały, na rzecz DragonEgg, który używa nowego systemu wtyczek GCC, aby zrobić to samo bez rozwidlania GCC.

Clang to zupełnie nowy kompilator C / C++ / Objective - C, który wykorzystuje własny frontend, a LLVM jako backend. Jego zaletami są lepsze komunikaty o błędach, szybszy czas kompilacji i łatwiejszy sposób na podłączenie innych narzędzi do procesu kompilacji (jak debugger LLDB i clang static analyzer). Jest również w miarę modularny, a więc może być używany jako biblioteka dla innego oprogramowania, które musi analizować kod C, C++ lub Objective - C.

Każdy z tych podejść (zwykły GCC, GCC + LLVM i Clang) ma swoje zalety i wady. Kilka ostatnich zestawów benchmarki, które widziałem, wykazały, ż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 dawały znacznie lepsze czasy kompilacji. GCC i kombinacje GCC/LLVM mają tę zaletę, że dużo więcej kodu zostało przetestowanych i działa na GCC smaku C; istnieją pewne rozszerzenia specyficzne dla kompilatora, które tylko GCC ma, i w niektórych miejscach, gdzie standard pozwala na zmianę implementacji, ale kod zależy od jednej konkretnej implementacji. Jest to dużo bardziej prawdopodobne, jeśli otrzymasz dużą ilość starszego kodu C, że będzie on działał w GCC niż że będzie działał w Clang, choć to poprawia się z czasem.

 211
Author: Brian Campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-26 08:37:15

Są tu dwie różne rzeczy.

LLVM jest kompilatorem zaplecza przeznaczonym do budowania kompilatorów na jego podstawie. Zajmuje się optymalizacją i produkcją kodu dostosowanego do docelowej architektury.

CLang jest interfejsem, który parsuje kod C, C++ i Objective C i tłumaczy go na reprezentację odpowiednią dla LLVM.

Llvm GCC był początkową wersją kompilatora C++ opartego na llvm opartym na gcc 4.2, który jest obecnie przestarzały, ponieważ CLang może parsować wszystko, co może parse i więcej.

Wreszcie, główna różnica między CLang i gcc nie leży w wytwarzanym kodzie, ale w podejściu. Podczas gdy gcc jest monolityczny, CLang został zbudowany jako pakiet bibliotek. Ta modułowa konstrukcja zapewnia duże możliwości ponownego użycia narzędzi IDE lub narzędzi kompletacyjnych.

W tej chwili kod produkowany przez gcc 4.6 jest generalnie nieco szybszy, ale clang zamyka lukę.

 59
Author: Matthieu M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-06 19:08:08

Llvm-gcc-4.2 wykorzystuje interfejs GCC do analizy kodu, a następnie generuje skompilowane wyjście za pomocą LLVM.

Kompilator llvm 2.0 wykorzystuje interfejs clang do analizy kodu i generuje skompilowane wyjście za pomocą LLVM. "clang" jest właściwie tylko nazwą tego front-endu, ale jest często używany jako nazwa kompilatora jako całości.

 6
Author: Stephen Canon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 20:48:17