Clang - Clang

Zvonit
LLVM New Logo.png
Informace o verzi Clang 12.0.1 screenshot.png
Clang 12.0.1
Původní autoři Chris Lattner
Vývojáři LLVM Developer Group
První vydání 26. září 2007 ; Před 14 lety ( 2007-09-26 )
Stabilní uvolnění
13.0.0 / 4. října 2021 ; Před 12 dny ( 2021-10-04 )
Náhled vydání
13.0.0-rc2 / 27. srpna 2021 ; Před 50 dny ( 2021-08-27 )
Úložiště
Napsáno C ++
Operační systém Unixové
Plošina AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Typ Přední konec kompilátoru
Licence Licence Apache 2.0 s výjimkami LLVM
webová stránka řinčení .llvm .org

Clang / k l æ ŋ / je přední konec překladač pro C , C ++ , Objective-C , a Objective-C ++ programovací jazyky , stejně jako OpenMP , OpenCL , RenderScript , CUDA a HIP rámců. Funguje jako náhrada za GNU Compiler Collection (GCC), podporuje většinu jeho kompilačních příznaků a neoficiálních jazykových rozšíření. Obsahuje statický analyzátor a několik nástrojů pro analýzu kódu.

Clang pracuje v tandemu se zadním koncem kompilátoru LLVM a byl dílčím projektem LLVM 2.6 a novějších. Stejně jako u LLVM je to bezplatný a open-source software pod licencí softwaru Apache License 2.0 . Mezi jeho přispěvatele patří Apple , Microsoft , Google , ARM , Sony , Intel a AMD .

Clang 12, nejnovější hlavní verze Clang z dubna 2021, má plnou podporu pro všechny publikované standardy C ++ až do C ++ 17 , implementuje většinu funkcí C ++ 20 a přidává počáteční podporu pro nadcházející standard C ++ 23 . Od verze 6.0.0 kompiluje Clang C ++ standardně pomocí dialektu GNU ++ 14, který obsahuje funkce ze standardu C ++ 14 a odpovídající rozšíření GNU.

Pozadí

Od roku 2005 začala společnost Apple Inc. rozsáhle používat LLVM v několika komerčních produktech, včetně iOS SDK a Xcode 3.1. Jedním z prvních použití LLVM byl kompilátor kódu OpenGL pro OS X, který převádí volání OpenGL na zásadnější volání jednotek pro zpracování grafiky (GPU), které nepodporují určité funkce. To umožnilo společnosti Apple podporovat OpenGL na počítačích využívajících čipové sady Intel GMA , což na těchto strojích zvýšilo výkon.

Projekt LLVM původně zamýšlel použít front -end GCC . Zdrojový kód GCC je však velký a poněkud těžkopádný; jak řekl jeden dlouholetý vývojář GCC s odkazem na LLVM: „Pokoušet se tancovat hrocha není opravdu žádná zábava“. Kromě toho software Apple používá Objective-C , což je pro vývojáře GCC nízká priorita. GCC jako takový se neintegruje hladce do integrovaného vývojového prostředí Apple (IDE). A konečně, licenční smlouva GCC, GNU General Public License (GPL) verze 3 , vyžaduje, aby vývojáři, kteří distribuují rozšíření nebo upravené verze GCC, zpřístupnili svůj zdrojový kód , ale povolná softwarová licence LLVM tuto překážku postrádá.

Nakonec se Apple rozhodl vyvinout Clang, nový front-end kompilátoru, který podporuje C, Objective-C a C ++. V červenci 2007 získal projekt souhlas s tím, že se stane open-source.

Design

Clang pracuje společně s LLVM. Kombinace Clang a LLVM poskytuje většinu řetězců nástrojů pro výměnu GCC stacku . Jedním z hlavních cílů Clangu je poskytnout architekturu založenou na knihovnách, aby kompilátor mohl spolupracovat s dalšími nástroji, které interagují se zdrojovým kódem, jako je například integrované vývojové prostředí (IDE). Naproti tomu GCC funguje v pracovním postupu kompilace - propojení - ladění ; integrace s jinými nástroji není vždy snadná. GCC například používá krok zvaný fold, který je klíčem k celému procesu kompilace, což má vedlejší účinek překladu stromu kódu do podoby, která vypadá na rozdíl od původního zdrojového kódu. Pokud je během kroku skládání nebo po něm nalezena chyba, může být obtížné jej přeložit zpět na jedno místo v původním zdroji. Kromě toho musí prodejci používající zásobník GCC v IDE používat k indexování kódu samostatné nástroje, aby poskytovali funkce jako zvýrazňování syntaxe a inteligentní doplňování kódu .

Clang uchovává během kompilace více informací než GCC a zachovává celkovou podobu původního kódu, což usnadňuje mapování chyb zpět do původního zdroje. Chybové zprávy Clang jsou podrobnější, konkrétnější a strojově čitelné, takže IDE mohou indexovat výstup kompilátoru. Modulární design kompilátoru může nabízet indexování zdrojového kódu, kontrolu syntaxe a další funkce běžně spojené s rychlými systémy vývoje aplikací . Derivační strom je také vhodný pro podporu automatizované Refaktorování , neboť přímo představuje původní zdrojový kód.

Clang kompiluje pouze jazyky podobné C, jako je C, C ++, Objective-C a Objective-C ++. V mnoha případech může Clang podle potřeby nahradit GCC, bez dalších účinků na celý řetězec nástrojů. Podporuje většinu běžně používaných možností GCC. Projekt Flang společností Nvidia a The Portland Group přidává podporu Fortran . U jiných jazyků, jako je Ada , však LLVM zůstává závislý na GCC nebo jiném front -endu kompilátoru.

Výkon a kompatibilita s GCC

Clang je kompatibilní s GCC. Jeho rozhraní příkazového řádku sdílí mnoho příznaků a možností GCC . Clang implementuje mnoho jazykových rozšíření GNU a vnitřní vlastnosti kompilátoru, z nichž některé jsou čistě z důvodu kompatibility. Například i když Clang implementuje atomické vnitřní vlastnosti, které přesně odpovídají atomovým C11 , implementuje také __sync_*vnitřní GCC pro kompatibilitu s GCC a libstdc ++ . Clang také udržuje kompatibilitu ABI s objektovým kódem generovaným GCC . V praxi je Clang náhradou za GCC.

Vývojáři společnosti Clang mají za cíl snížit paměťovou stopu a zvýšit rychlost kompilace ve srovnání s konkurenčními kompilátory, jako je GCC. V říjnu 2007 uvádějí, že Clang zkompiloval knihovny Carbon více než dvakrát rychleji než GCC, přičemž využíval asi šestinu paměti a místa na disku GCC. Zdá se, že do roku 2011 si Clang tuto výhodu ve výkonu kompilátoru zachová. V polovině roku 2014 Clang stále konzistentně kompiluje rychleji než GCC v benchmarku výkonu smíšeného kompilace času a programu. Do roku 2019 je však Clang při kompilaci linuxového jádra výrazně pomalejší než GCC a při kompilaci LLVM zůstává o něco rychlejší.

Zatímco Clang byl historicky rychlejší než GCC při kompilaci, kvalita výstupu zaostávala. Od roku 2014 výkon programů kompilovaných Clang zaostával za výkonem programu kompilovaného GCC, někdy o velké faktory (až 5,5x), což replikovalo dřívější zprávy o pomalejším výkonu. Oba překladače se od té doby vyvinuly tak, aby zvýšily svůj výkon, přičemž mezera se zmenšuje:

  • Srovnání v listopadu 2016 mezi GCC 4.8.2 versus clang 3.4 na velkém svazku testovacích souborů ukazuje, že GCC překonává clang přibližně 17% na dobře optimalizovaném zdrojovém kódu. Výsledky testů jsou specifické pro kód a neoptimalizovaný zdrojový kód C může tyto rozdíly zvrátit. Oba kompilátory se tedy zdají široce srovnatelné.
  • Srovnání v roce 2019 na Intel Ice Lake ukázalo, že programy generované Clang 10 dosáhly 96% výkonu GCC 10 na 41 různých benchmarcích (přičemž 22 z nich vyhrál a 19 z nich ztratil).

V roce 2021 byl proveden srovnávací test pro srovnání výkonu LLVM 2,7 a LLVM 11 a doby kompilace. Závěr byl, že LLVM 11 má tendenci trvat 2x déle při kompilaci kódu s optimalizací, a v důsledku toho produkuje kód, který běží o 10-20% rychleji (s občasnými odlehlými hodnotami v obou směrech), ve srovnání s LLVM 2.7, který je více než 10 let starý.

Historie stavu

Tato tabulka představuje pouze významné kroky a vydání v historii Clang.

datum Přednosti
11. července 2007 Clang frontend vydán pod licencí open-source
25. února 2009 Clang/LLVM může kompilovat fungující jádro FreeBSD .
16. března 2009 Clang/LLVM může sestavit fungující jádro DragonFly BSD .
23. října 2009 Vydán Clang 1.0, s LLVM 2.6 poprvé.
Prosinec 2009 Generování kódu pro C a Objective-C dosahuje kvality produkce. Podpora pro C ++ a Objective-C ++ je stále neúplná. Clang C ++ dokáže analyzovat GCC 4.2 libstdc ++ a generovat pracovní kód pro netriviální programy a může se sám kompilovat.
2. února 2010 Clang self-hosting .
20. května 2010 Clang nejnovější verze úspěšně vybudovala knihovny Boost C ++ a prošla téměř všemi testy.
10. června 2010 Clang/LLVM se stává nedílnou součástí FreeBSD , ale výchozí kompilátor je stále GCC.
25. října 2010 Clang/LLVM může kompilovat fungující upravené jádro Linuxu .
Leden 2011 Dokončena přípravná práce na podporu návrhu standardu C ++ 0x , přičemž ve vývojové verzi Clang je podporováno několik nových funkcí konceptu.
10. února 2011 Clang může sestavit fungující virtuální stroj HotSpot Java .
19. ledna 2012 Clang se stává volitelnou součástí systému NetBSD pro více platforem, ale GCC je stále výchozí.
29. února 2012 Clang 3.0 dokáže obnovit 91,2% archivu Debianu .
29. února 2012 Clang se stane výchozím kompilátorem v MINIX 3
12. května 2012 Clang/LLVM oznámil nahrazení GCC ve FreeBSD .
5. listopadu 2012 Clang se stane výchozím kompilátorem ve FreeBSD 10.x na amd64/i386.
18. února 2013 Clang/LLVM může sestavit fungující upravené jádro Android Linux pro Nexus 7 .
19. dubna 2013 Clang je funkce C ++ 11 kompletní.
06.11.2013 Clang je funkce C ++ 14 kompletní.
11. září 2014 Clang 3.5 dokáže obnovit 94,3% archivu Debianu. Procento selhání od ledna 2013 kleslo o 1,2% na vydání, zejména kvůli zvýšené kompatibilitě s příznaky GCC.
Říjen 2016 Clang se stane výchozím kompilátorem pro Android (a později pouze kompilátor podporovaný Android NDK ).
13. března 2017 Vydáno Clang 4.0.0
26. července 2017 Clang se stane výchozím kompilátorem v OpenBSD 6.2 na amd64/i386.
7. září 2017 Vydáno Clang 5.0.0
19. ledna 2018 Clang se stane výchozím kompilátorem v OpenBSD 6.3 na paži.
5. března 2018 Clang se nyní používá k vytváření prohlížeče Google Chrome pro Windows.
8. března 2018 Vydáno Clang 6.0.0
5. září 2018 Clang se nyní používá k vytváření Firefoxu pro Windows.
19. září 2018 Vydáno Clang 7.0.0
20. března 2019 Vydáno Clang 8.0.0
1. července 2019 Clang se stane výchozím kompilátorem v OpenBSD 6.6 na mips64.
19. září 2019 Clang 9.0.0 povolený s oficiálním RISC-V cílovém podporu.
29. února 2020 Clang se stává jediným kompilátorem C v základním systému FreeBSD s odstraněním GCC .
24. března 2020 Vydáno Clang 10.0.0
2. dubna 2020 Clang se stane výchozím kompilátorem v OpenBSD 6.7 na powerpc.
12. října 2020 Clang 11.0.0 propuštěn
21. prosince 2020 Clang se stane výchozím kompilátorem v OpenBSD 6.9 na mips64el.
14. dubna 2021 Clang 12.0.0 propuštěn

Viz také

Reference

externí odkazy