LLVM (Low Level Virtual Machine) je projekt, který implementuje (low level) virtuální stroj. Jedná se o sadu instrukcí (v SSA formě), sadu optimalizací a sadu překladačů z LLVM byte kódu do nativních instrukcí reálných procesorů. SSA je forma zápisu instrukcí, kde je do každé proměnné zapsáno pouze jednou. Toto omezení umožňuje jednoduše využít některé optimalizace. Tento framework lze použít pro mnoho věcí, počínajíc implementací JustInTime optimalizátoru po konstrukci statického nativního překladače například jazyka C. LLVM v podstatě poskytuje celý „backend“ překladače.
Clang je „frontend“ překladače z jazyků C rodiny (C resp. C99, Objective C a C++) do LLVM byte kódu. Spojením těchto dvou nám tedy vzniká plnohodnotný překladač. Clang umí kromě statické kompilace kódu i další věci: statickou analýzu, code completion, refactoring, indexing atp. Statická analýza je způsob jak zkontrolovat některé časté problémy, kterých se programátoři dopouští jako například zápis za konec pole, referencování NULLu atp staticky během kompilace místo runtime. Code completion je pomůcka pro IDE nástroje, viz. například IntelliSense atp. Refactoring je metoda která nám umožňuje třeba masově přejmenovat metodu nebo proměnou s ohledem na kontext, tj. inteligentněji a přesněji než sed. Indexace je způsob který umožňuje skočit na místo definice struktury, proměnné atp. bez lineárního vyhledávání (cscope, ctags atp.). Hlavním cílem je ovšem statická kompilace. Jedním z hlavních cílů Clangu je prakticky 100% kompatibilita s gcc. Prakticky to znamená, že člověk může nahradit gcc Clangem při kompilaci programů v jazycích C/C++/ObjC.
LLVM i Clang jsou psány v podmnožině C++ se silným využitím templatů a bez použití výjimek. Jsou psány jako všeobecně znovu použitelné knihovny.
LLVM nabízí podporu pro tyto architektury: ARM, Alpha, Blackfin, Cell, MSP430, Mips, PIC16, PowerPC, Sparc, SystemZ a X86. K dispozici je velké množství různých optimalizací včetně možnosti Link Time Optimizace. Celkově je kvalita výsledného kódu podobná jakou má gcc. LLVM je obecně rychlejší při optimalizacích než gcc a používá méně paměti.
Clang parsuje kód rychleji než gcc a používá méně paměti. Clang uchovává víc informací z původního zdrojového kódu než gcc a tudíž má daleko expresivnější chybové hlášky a varování. Srovnejte:
$ gcc-4.2 -fsyntax-only t.c t.c:7: error: invalid operands to binary + (have 'int' and 'struct A') $ clang -fsyntax-only t.c t.c:7:39: error: invalid operands to binary expression ('int' and 'struct A') return y + func(y ? ((SomeA.X + 40) + SomeA) / 42 + SomeA.X : SomeA.X); ~~~~~~~~~~~~~~ ^ ~~~~~
LLVM i Clang se distribuují pod BSDL-like licencí a když chce někdo poslat patch, tak nemusí posílat žádné prohlášení do FSF. Stačí vytvořit bug v projektové bugzille a patch připojit. Dle mých zkušeností je odezva většinou velmi rychlá a opravy/vylepšení jsou rychle integrovány.
LLVM je aktuálně ve verzi 2.6 a je produkčně využíváno např. v Mac OS X pro akceleraci softwarové implementace OpenGL. Clang je zatím ve verzi 1.0, kde je C a ObjC považováno za produkčně kvalitní (zkompiluje v podstatě veškerý C a ObjC kód který existuje) a C++ je v pokročilé fázi vývoje (aktuální SVN trunk dokáže přeparsovat kompletní libstdc++ z gcc 4.2 a celkově zkompilovat některé jednodušší programy, např. gperf).
LLVM vzniklo na univerzitě v Illinois jako diplomová práce Chrise Lattnera, který je stále vůdčím vývojářem a leaderem projektu. Firma Apple najala Chrise a několik dalších vývojářů pro práci na LLVM a především Clangu. Apple je hlavním sponzorem vývoje, ale vývojáře LLVM zaměstnává mnoho firem od Craye, přes Intel a AMD po Google. LLVM i Clang jsou přesto plně open source projekty, do kterých může přispívat každý. Komunita vývojářu je velmi přátelská a vstřícná.
LLVM používá jako svůj optimalizační backend v podstatě každý „open source jazyk“, který existuje: perl (experimentální patche), python, ruby, haskell a další. Používá se velmi intenzivně v Mac OS X (Apple chce za svoje peníze výsledky).
Clang je mladší projekt a není zatím tolik používaný (první oficiální release byl před dvěma měsíci), ale stejně. Sun má svůj statický analyzer parfait založený na Clangu. Apple dodává Clang v rámci svého vývojářského balíku Xcode. FreeBSD se snaží nahradit systémový překladač gcc právě kombinací LLVM/Clang.
FreeBSD experimentuje s Clangem jako systémovým překladačem. Zatím je tato snaha omezena na architektury i386 and amd64. Existuje experimentální větev pro integraci s celým FreeBSD. Aktuální status je takový, že Clang dokáže skompilovat v podstatě veškerý C kód ve FreeBSD, všechen ObjC kód (kterého je velmi málo) a 2 z 5ti C++ aplikací (devd a gperf). Situace kolem C++ se velmi rychle vyvýjí (před měsícem a pul nedokázal Clang skompilovat ani iostream Hello World v C++) a lze očekávat, že Clang bude schopen skompilovat všechen C++ kód ve FreeBSD do konce tohoto roku. Bootstrap (tj. kompilaci Clangu Clangem) bude doufejme dostupný na jaře 2010.
Při pokusné kompilaci stromu portů ve FreeBSD byl Clang schopen skompilovat více jak 90 % C aplikací. Většina problémů vzniká z důvodu, že Clang kompiluje defaultně C99 zatímco gcc preferuje C89 a hodně aplikací očekává C89 sémantiku (hlavně gnu89 inline).
Závěrem lze říct, že Clang je moderní překladač, který nabízí mnoho vylepšení oproti tradičnímu gcc ovšem je zatím ještě méně vyspělý a otestovaný oproti gcc. Zkuste otestovat jestli se vaše C aplikace dá skompilovat pomocí Clangu. Možná oceníte rychlost kompilace a expresivní varování a chyby. Možná začnete Clang používat místo gcc…
Zdroje:
www.llvm.org
clang.llvm.org