| Clang | |
| Clang 13.0.1 | |
| Fejlesztő | Chris Lattner, LLVM Developer Group |
| Legfrissebb stabil kiadás | 19.1.6 |
| Programozási nyelv | C++ |
| Operációs rendszer | Unix-like |
| Platform | AArch64, ARMv7, IA-32, x86-64, ppc64le |
| Kategória | fordítóprogram |
| Licenc | Apache 2.0 LLVM kivételekkel |
| Kódtár | https://github.com/llvm |
| A Clang weboldala | |
A Clang egy fordítófelület a C, C++, Objective-C, Objective-C++ programozási nyelvekhez, valamint az OpenMP, OpenCL, RenderScript, CUDA, SYCL és HIP szoftverkeretrendszerekhez. A GNU Compiler Collection (GCC) helyettesítőjeként működik, támogatja a legtöbb fordítási opciót és nem hivatalos nyelvi kiterjesztést. Statikus elemzőt és számos kódelemző eszközt tartalmaz.
A Clang az LLVM fordítói háttérrel együtt működik, és az LLVM 2.6 és későbbi verziók alprojektje volt. Az LLVM-hez hasonlóan ez is ingyenes és nyílt forráskódú szoftver, az Apache 2.0 szoftverlicenc alapján. Közreműködői között van az Apple, a Microsoft, a Google, az ARM, a Sony, az Intel és az AMD.
A Clang 17, a Clang legújabb, 2023. októberi főverziója teljes mértékben támogatja az összes közzétett C++ szabványt a C++17-ig, megvalósítja a C++20 legtöbb funkcióját, és kezdetben támogatja a C++23 szabványt. A v16.0.0 óta a Clang alapértelmezés szerint a GNU++17 dialektust használva fordítja a C++-ot, amely tartalmazza a C++17 szabvány jellemzőit és a megfelelő GNU-bővítményeket.
2005-ben az Apple Inc. széles körben használta az LLVM-et több kereskedelmi termékben, köztük az iOS SDK-ban és az Xcode 3.1-ben. Az OS X-hez készült OpenGL kódfordító, amely az OpenGL hívásokat alapvetőbb hívásokká alakítja át a bizonyos funkciókat nem támogató grafikus feldolgozó egységek (GPU) számára, az LLVM egyik első felhasználása volt. Ez lehetővé tette, hogy az Apple támogassa az OpenGL-t az Intel GMA lapkakészletet használó számítógépeken, ami növelte a teljesítményt ezeken a gépeken.
Az LLVM projekt eredetileg a GCC frontendjét kívánta használni. A GCC forráskódja azonban nagy és kissé nehézkes; ahogy egy régóta a GCC-ben dolgozó fejlesztő fogalmazott az LLVM-re utalva: „A víziló táncoltatása nem igazán szórakoztató”. Emellett az Apple szoftverek Objective-C-t használnak, ami a GCC fejlesztők számára alacsony prioritású. Így a GCC nem integrálódik zökkenőmentesen az Apple integrált fejlesztői környezetébe (IDE). Végül a GCC licencszerződése, a GNU General Public License (GPL) 3. verziója megköveteli, hogy a GCC kiterjesztéseit vagy módosított verzióit terjesztő fejlesztők elérhetővé tegyék forráskódjukat, de az LLVM megengedő szoftverlicencében ez nem követelmény.
Ezen okok miatt az Apple kifejlesztette a Clangot, egy új fordítóprogramot, amely támogatja a C, az Objective-C és a C++ nyelveket. 2007 júliusában a projekt megkapta a nyílt forráskódúvá válás engedélyét.
A Clang az LLVM-mel együtt működik. A Clang és az LLVM kombinációja biztosítja a GCC stack helyettesítéséhez szükséges eszközrendszer nagy részét. A Clang egyik fő célja, hogy könyvtár-alapú architektúrát biztosítson, így a fordító együttműködhet más, a forráskóddal interakcióba lépő eszközökkel, például integrált fejlesztőkörnyezetekkel (IDE). Ezzel szemben a GCC a fordítás-összekapcsolás-hibakeresés munkafolyamatban működik; más eszközökkel való integrálása nem mindig egyszerű. A GCC például egy fold nevű lépést használ, amely kulcsfontosságú a teljes fordítási folyamat szempontjából, és amelynek mellékhatása, hogy a kódfát olyan formába fordítja, amely nem hasonlít az eredeti forráskódhoz. Ha a fold lépés alatt vagy után hibát találunk, nehéz lehet azt visszafordítani az eredeti forráskód egy helyére. Emellett a GCC stacket az IDE-ken belül használó gyártóknak külön eszközöket kell használniuk a kód indexelésére, hogy olyan funkciókat biztosítsanak, mint a szintaxis kiemelés és az intelligens kódkiegészítés.
A Clang több információt őriz meg a fordítási folyamat során, mint a GCC, és megőrzi az eredeti kód általános formáját, ami megkönnyíti a hibák visszatérképezését az eredeti forrásba. A Clang hibajelentései részletesebbek, specifikusabbak és gépileg olvashatóak, így az IDE-k indexelni tudják a fordító kimenetét. A fordító moduláris felépítése forráskód-indexelést, szintaxis-ellenőrzést és más, általában a gyors alkalmazásfejlesztő rendszerekhez kapcsolódó funkciókat kínál. A parse tree alkalmasabb az automatizált kódrefaktorálás támogatására is, mivel közvetlenül az eredeti forráskódot reprezentálja.
A Clang csak C-szerű nyelveket fordít, például C, C++, Objective-C és Objective-C++. Sok esetben a Clang szükség szerint helyettesítheti a GCC-t, anélkül, hogy más hatása lenne az eszközrendszer egészére. Támogatja a legtöbb általánosan használt GCC opciót. Egy Fortran projekt, a Flang 2022-ben volt folyamatban. Más nyelvek, például az Ada esetében azonban az LLVM továbbra is a GCC-től vagy egy másik fordítói frontendtől függ.
Az Nvidia és a The Portland Group Flang projektje Fortran-támogatással bővül. Az Flang az LLVM Fortran frontendje. Gyakran „LLVM Flang”-ként hivatkoznak rá, hogy megkülönböztessék a „Classic Flang”-tól – ez két különálló és független Fortran fordító. Az „LLVM Flang” aktív fejlesztés alatt áll. Az Flang fejlesztési változatai 2023 októberében voltak folyamatban, és letölthetők voltak az LLVM projektből.

A Clang kompatibilis a GCC-vel. A parancssori felületén a GCC számos kapcsolója és opciója közös. A Clang számos GNU nyelvi kiterjesztést és fordítói intrinsic-et valósít meg, amelyek közül néhány pusztán a kompatibilitás miatt van. Például annak ellenére, hogy a Clang olyan atomi intrinsic-eket valósít meg, amelyek pontosan megfelelnek a C11-es elemeinek, a GCC __sync_* intrinsic-eit is megvalósítja a GCC-vel és a C++ szabványos könyvtárral (libstdc++) való kompatibilitás érdekében. A Clang fenntartja az alkalmazás bináris interfész (ABI) kompatibilitást a GCC által generált tárgykóddal. A gyakorlatban a Clang a GCC helyettesítésére szolgál.
A Clang fejlesztőinek célja a memóriaigény csökkentése és a fordítási sebesség növelése más fordítóprogramokhoz, például a GCC-hez képest. 2007 októberében arról számoltak be, hogy a Clang több mint kétszer olyan gyorsan fordította le a Carbon könyvtárakat, mint a GCC, miközben a GCC memória- és lemezterületének körülbelül egyhatodát használta. 2011-re úgy tűnt, hogy a Clang megtartotta ezt az előnyét a fordító teljesítménye terén. 2014 közepén a Clang még mindig következetesen gyorsabban fordít, mint a GCC egy vegyes, fordítási idő és programteljesítmény összehasonlító tesztben. 2019-re azonban a Clang jelentősen lassabb a Linux kernel fordításában, mint a GCC, míg az LLVM fordításában valamivel gyorsabb.
Míg a Clang történelmileg gyorsabb volt a fordításban, mint a GCC, a kimenet minősége elmaradt. 2014-től kezdve a Clanggal fordított programok teljesítménye elmaradt a GCC-vel fordított programok teljesítményétől, néha nagymértékben (akár 5,5x), megismételve a lassabb teljesítményről szóló korábbi jelentéseket. Mindkét fordítóprogram azóta továbbfejlesztette teljesítményét, és a különbség egyre csökkent:
A libclang C interfészt ad, viszonylag kis API-t biztosítva. A hozzáférhető funkciók közé tartozik: forráskód elemzése egy AST-be, AST-k betöltése, bejárás az AST-n, forráshelyek társítása az AST-n belüli elemekkel.
In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions.
Clang is a subproject of the LLVM Project, but has its own mailing lists because the communities have people with different interests.
{{cite mailing list}}: More than one of |archivedate= és |archive-date= specified (súgó); More than one of |archiveurl= és |archive-url= specified (súgó)While the overall GCC compatibility is excellent and the compile times are impressive, the performance of the generated code is still lacking behind a recent GCC version.
Binaries from LLVM-GCC and Clang both struggled to compete with GCC 4.5.0 in the timed HMMer benchmark of a Pfam database search. LLVM-GCC and Clang were about 23% slower(...)Though LLVM / Clang isn't the performance champion at this point, both components continue to be under very active development and there will hopefully be more news to report in the coming months