Clang
Clang | |
Clang 13.0.1 | |
Fejlesztő | Chris Lattner , LLVM Developer Group |
Legfrissebb stabil kiadás | 19.1.6 [1] |
Programozási nyelv | C++ |
Operációs rendszer | Unix-like |
Platform | AArch64, ARMv7, IA-32, x86-64, ppc64le[2] |
Kategória | fordítóprogram |
Licenc | Apache 2.0 LLVM kivételekkel[3][4] |
A Clang weboldala |
A Clang egy fordítófelület a C, C++, Objective-C, Objective-C++ programozási nyelvekhez, valamint az OpenMP ,[5] OpenCL , RenderScript , CUDA , SYCL és HIP szoftverkeretrendszerekhez.[6] 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.[7][8] Statikus elemzőt[9] és számos kódelemző eszközt tartalmaz.[10]
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.[11] Az LLVM-hez hasonlóan ez is ingyenes és nyílt forráskódú szoftver, az Apache 2.0 szoftverlicenc alapján.[3][4] 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.[12] 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.[13]
Háttér
[szerkesztés]2005-ben az Apple Inc. széles körben használta az LLVM-et több kereskedelmi termékben,[14] köztük az iOS SDK-ban[15] é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.[16]
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ó”.[17] 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).[18] 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[19] ez nem követelmény.[3][4]
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.[18] 2007 júliusában a projekt megkapta a nyílt forráskódúvá válás engedélyét.[20]
Tervezés
[szerkesztés]A Clang az LLVM-mel együtt működik.[21] A Clang és az LLVM kombinációja biztosítja a GCC stack[22] 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,[23] í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[24] 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.
Flang – Fortran
[szerkesztés]Az Nvidia és a The Portland Group Flang projektje Fortran-támogatással bővül.[25] 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.[26]
Teljesítmény és GCC kompatibilitás
[szerkesztés]A Clang kompatibilis a GCC-vel.[8] 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[27] 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[28] (ABI) kompatibilitást a GCC által generált tárgykóddal. A gyakorlatban a Clang a GCC helyettesítésére szolgál.[29]
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[30], mint a GCC, miközben a GCC memória- és lemezterületének körülbelül egyhatodát használta.[31] 2011-re úgy tűnt, hogy a Clang megtartotta ezt az előnyét a fordító teljesítménye terén.[32][33] 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.[34] 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.[35]
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),[34] megismételve a lassabb teljesítményről szóló korábbi jelentéseket.[32] Mindkét fordítóprogram azóta továbbfejlesztette teljesítményét, és a különbség egyre csökkent:
- A 2016 novemberében a GCC 4.8.2 és a clang 3.4 közötti összehasonlítások egy nagyszámú tesztfájlkészleten azt mutatják, hogy a GCC körülbelül 17%-kal jobb teljesítményt nyújt a clangnál a jól optimalizált forráskódon. A teszteredmények kódspecifikusak, és az optimalizálatlan C forráskód megfordíthatja ezeket a különbségeket. A két fordító tehát nagyjából összehasonlíthatónak tűnik.[36]
- A 2019-es összehasonlítások az Intel Ice Lake-en azt mutatták, hogy a Clang 10 által generált programok a GCC 10 teljesítményének 96%-át érték el 41 különböző benchmarkon (miközben 22-ben nyertek, 19-ben pedig vesztettek).[35]
- 2023-ban egy négy évvel később végzett újabb összehasonlítás kimutatta, hogy a Clanggal fordított programok teljesítménye ma már megegyezik a GCC-vel fordítottakéval. A Clang 16 átlagosan 6%-kal múlja felül a GCC 13-at.[37]
Interfész
[szerkesztés]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.[38]
Lásd még
[szerkesztés]Jegyzetek
[szerkesztés]- ↑ LLVM 2.1 Release Notes. llvm.org . LLVM Developer Group, 2007. szeptember 27. [2016. november 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. április 30.)
- ↑ Releases. llvm – llvm-project repo. LLVM Developer Group, 2021. augusztus 27. [2021. szeptember 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2021. szeptember 12.)
- ↑ a b c LICENSE.TXT, LLVM Developer Group, <https://releases.llvm.org/9.0.0/LICENSE.TXT>. Hozzáférés ideje: 2019-09-24
- ↑ a b c LLVM Developer Policy, LLVM Developer Group, § Copyright, License, and Patents, <https://llvm.org/docs/DeveloperPolicy.html#copyright-license-and-patents>. Hozzáférés ideje: September 12, 2021
- ↑ OpenMP Support. LLVM Project Blog , 2015. május 22. [2016. március 26-i dátummal az eredetiből archiválva]. (Hozzáférés: 2016. március 28.)
- ↑ C++ Heterogeneous-Compute Interface for Portability. GitHub . [2020. június 27-i dátummal az eredetiből archiválva]. (Hozzáférés: 2020. február 18.)
- ↑ Clang Language Extensions. [2014. február 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. november 8.) „In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions.”
- ↑ a b Clang - Features and Goals: GCC Compatibility, 15 April 2013, <https://clang.llvm.org/features.html#gcccompat>. Hozzáférés ideje: April 30, 2018
- ↑ A számítástechnikában a statikus programelemzés (más néven statikus analízis vagy statikus szimuláció) a számítógépes programok végrehajtása nélkül végzett elemzése, ellentétben a dinamikus programelemzéssel , amelyet a programokon azok integrált környezetben történő végrehajtása során végeznek.
- ↑ Clang Static Analyzer. LLVM. [2018. április 30-i dátummal az eredetiből archiválva]. (Hozzáférés: 2009. szeptember 3.)
- ↑ Getting Involved with the Clang Project, LLVM Developer Group, <https://clang.llvm.org/get_involved.html>. Hozzáférés ideje: 2012-09-18
- ↑ C++ and C++'0x Support in Clang. LLVM. [2013. július 4-i dátummal az eredetiből archiválva]. (Hozzáférés: 2023. március 12.)
- ↑ Clang 17.0.1 Release Notes. LLVM. (Hozzáférés: 2023. október 25.)
- ↑ Treat, Adam (19 February 2005), "mkspecs and patches for LLVM compile of Qt4"
- ↑ A szoftverfejlesztő készlet (Software development kit, vagy SDK) szoftverfejlesztő eszközök gyűjteménye egyetlen telepíthető csomagban.
- ↑ Lattner, Chris (2007. május 25.). „LLVM for OpenGL and other stuff” (Slides). LLVM Developers' Meeting.
- ↑ Zadeck, Kenneth (19 November 2005), "Re: LLVM/GCC Integration Proposal"
- ↑ a b Naroff, Steve (2007. május 25.). „New LLVM C Front-end” (Slides). LLVM Developers' Meeting.
- ↑ A megengedő szoftverlicenc (Permissive software license), amelyet néha BSD-szerű vagy BSD-stílusú licencnek is neveznek, egy ingyenes szoftverlicenc, amely a copyleft-védelem helyett csak minimális korlátozásokat tartalmaz a szoftver használatára.
- ↑ Lattner, Chris (11 July 2007), "New LLVM C front-end: "clang""
- ↑ Clang team, clang: a C language family frontend for LLVM Archiválva 2017. november 12-i dátummal a Wayback Machine-ben.
- ↑ A számítástechnikában a solution stack vagy szoftver verem a szoftver alrendszerek vagy komponensek összessége, amelyek egy teljes platform létrehozásához szükségesek, úgy, hogy az alkalmazások támogatásához nincs szükség további szoftverekre.
- ↑ Clang: Utility and Applications: Library Based Architecture. [2018. április 27-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. április 30.)
- ↑ A parse tree, elemző-fa vagy szintaxisfa egy rendezett fa, amely valamilyen környezetfüggetlen nyelvtan szerint egy karakterlánc szintaktikai szerkezetét reprezentálja.
- ↑ FLANG: NVIDIA Brings Fortran To LLVM. [2017. május 20-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. május 18.)
- ↑ Welcome to Flang's documentation — the Flang Compiler
- ↑ Az intrinsic function, vagy beépített függvény, egy adott programozási nyelvben használható szubrutin, amelynek megvalósítását a fordító speciálisan kezeli.
- ↑ Az 'Application binary interface (ABI) két bináris programmodul közötti interfész.
- ↑ Clang can often be used as a drop-in replacement for GCC, May 2020, <https://clang.llvm.org/get_started.html#driver>. Hozzáférés ideje: May 9, 2020
- ↑ A Carbon egyike volt annak a két elsődleges C-alapú alkalmazásprogramozási felületnek (API), amelyeket az Apple fejlesztett ki a macOS operációs rendszerhez.
- ↑ Clang - Features and Goals: Fast compiles and Low Memory Use, October 2007, <https://clang.llvm.org/features.html>. Hozzáférés ideje: April 30, 2018
- ↑ a b Simonis, Volker: Compiling the HotSpot VM with Clang, 2011. február 10. [2011. február 18-i dátummal az eredetiből archiválva]. (Hozzáférés: 2011. február 13.) „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. ”
- ↑ Benchmarking LLVM & Clang Against GCC 4.5. Phoronix, 2010. április 21. [2016. november 2-i dátummal az eredetiből archiválva]. (Hozzáférés: 2011. február 13.) „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”
- ↑ a b GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks. OpenBenchmarking.org, 2014. április 14. [2017. október 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. június 25.)
- ↑ a b Michael Larabel: LLVM Clang Achieves ~96% The Performance Of GCC On Intel Ice Lake, 2019. december 23. [2021. január 15-i dátummal az eredetiből archiválva]. (Hozzáférés: 2021. január 14.)
- ↑ Clang vs GCC - which produces better binaries?. stackoverflow.com . [2017. június 1-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. október 1.)
- ↑ Michael Larabel: LLVM Clang 16 vs. GCC 13 Compiler Performance On Intel Raptor Lake, 2023. május 11. (Hozzáférés: 2024. április 24.)
- ↑ Az absztrakt szintaxisfa (AST) a számítástechnikában használt adatszerkezet, amely egy program vagy kódrészlet szerkezetének ábrázolására szolgál. Ez egy formális nyelven írt szöveg (gyakran forráskód) absztrakt szintaktikai szerkezetének fa reprezentációja. A fa minden egyes csomópontja egy, a szövegben előforduló konstrukciót jelöl. Néha egyszerűen csak szintaxisfának nevezik.
Fordítás
[szerkesztés]- Ez a szócikk részben vagy egészben a Clang című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.