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] |
| 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,[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 | forrásszöveg szerkesztése]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 | forrásszöveg szerkesztése]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 | forrásszöveg szerkesztése]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 | forrásszöveg szerkesztése]
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 | forrásszöveg szerkesztése]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 | forrásszöveg szerkesztése]Jegyzetek
[szerkesztés | forrásszöveg szerkesztése]- ↑ "LLVM 2.1 Release Notes". llvm.org. LLVM Developer Group. 2007. szeptember 27. 2016. november 17. 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. dátummal az eredetiből archiválva. Hozzáférés: 2021. szeptember 12. – via GitHub.com.
- 1 2 3 "LICENSE.TXT", llvm.org, LLVM Developer Group, 2020. november 11. dátummal az eredetiből archiválva, hozzáférés: 2019. szeptember 24.
- 1 2 3 "LLVM Developer Policy", llvm.org, LLVM Developer Group, § Copyright, License, and Patents, 2012. november 13. dátummal az eredetiből archiválva, hozzáférés: 2021. szeptember 12.
- ↑ "OpenMP Support". LLVM Project Blog. 2015. május 22. 2016. március 26. 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. dátummal az eredetiből archiválva. Hozzáférés: 2020. február 18..
- ↑ "Clang Language Extensions". 2014. február 24. 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.
- 1 2 Clang - Features and Goals: GCC Compatibility, 2013. április 15., 2018. április 27. dátummal az eredetiből archiválva, hozzáférés: 2018. április 30.
- ↑ 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. dátummal az eredetiből archiválva. Hozzáférés: 2009. szeptember 3..
- ↑ "Getting Involved with the Clang Project", clang.llvm.org, LLVM Developer Group, 2018. április 27. dátummal az eredetiből archiválva, hozzáférés: 2012. szeptember 18.,
Clang is a subproject of the LLVM Project, but has its own mailing lists because the communities have people with different interests.
- ↑ "C++ and C++'0x Support in Clang". LLVM. 2013. július 4. 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 (2005. február 19.). "mkspecs and patches for LLVM compile of Qt4". Qt4-preview-feedback (Mailing list). 2011. október 4. dátummal az eredeti címről archiválva. Hozzáférés: 2025. január 6..
{{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ó) - ↑ 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. 2016. május 8. dátummal az eredetiből archiválva (PDF). Hozzáférés: 2018. április 30..
- ↑ Zadeck, Kenneth (2005. november 19.). "Re: LLVM/GCC Integration Proposal". GCC development (Mailing list). 2016. március 10. dátummal az eredetiből archiválva. Hozzáférés: 2016. július 25..
- 1 2 Naroff, Steve (2007. május 25.). New LLVM C Front-end (Slides). LLVM Developers' Meeting. 2019. április 3. dátummal az eredetiből archiválva (PDF). Hozzáférés: 2018. április 30..
- ↑ 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 (2007. július 11.). "New LLVM C front-end: "clang"". cfe-dev (Mailing list). 2020. március 26. dátummal az eredetiből archiválva. Hozzáférés: 2020. március 26..
- ↑ 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. 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. 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. A belső függvényeket megvalósító fordítók csak akkor engedélyezhetik ezeket, ha egy program optimalizálást kér, ellenkező esetben a nyelvi futási rendszer (környezet) által biztosított alapértelmezett megvalósításra tér vissza.
- ↑ 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, 2020. május, 2020. május 8. dátummal az eredetiből archiválva, hozzáférés: 2020. május 9.
- ↑ 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, 2007. október, 2018. április 27. dátummal az eredetiből archiválva, hozzáférés: 2018. április 30.
- 1 2 Simonis, Volker (2011. február 10.). "Compiling the HotSpot VM with Clang". 2011. február 18. dátummal az eredeti címrő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. 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
- 1 2 "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks". OpenBenchmarking.org. 2014. április 14. 2017. október 23. dátummal az eredetiből archiválva. Hozzáférés: 2014. június 25..
- 1 2 Michael Larabel (2019. december 23.). "LLVM Clang Achieves ~96% The Performance Of GCC On Intel Ice Lake". 2021. január 15. 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. dátummal az eredetiből archiválva. Hozzáférés: 2018. október 1..
- ↑ Michael Larabel (2023. május 11.). "LLVM Clang 16 vs. GCC 13 Compiler Performance On Intel Raptor Lake". 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 | forrásszöveg szerkesztése]- 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.