Ugrás a tartalomhoz

Clang

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából
Clang
Clang 13.0.1
Clang 13.0.1

FejlesztőChris Lattner(wd), LLVM Developer Group
Legfrissebb stabil kiadás19.1.6 [1]
Programozási nyelvC++
Operációs rendszerUnix-like
PlatformAArch64, ARMv7, IA-32, x86-64, ppc64le(wd)[2]
Kategóriafordítóprogram
LicencApache 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(wd),[5] OpenCL(wd), RenderScript(wd), CUDA(wd), SYCL(wd) és HIP(wd) 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(wd)[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(wd), 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(wd), megvalósítja a C++20(wd) legtöbb funkcióját, és kezdetben támogatja a C++23(wd) 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(wd)[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(wd)[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(wd) 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(wd) 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(wd) és az intelligens kódkiegészítés(wd).

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(wd)[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(wd) 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]
Clang compiling htop(wd)

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(wd) intrinsic-eket(wd) valósít meg, amelyek pontosan megfelelnek a C11-es(wd) elemeinek, a GCC __sync_* intrinsic-eit is megvalósítja a GCC-vel és a C++ szabványos könyvtárral(wd) (libstdc++) való kompatibilitás érdekében. A Clang fenntartja az alkalmazás bináris interfész(wd)[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(wd) 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(wd) 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(wd) 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(wd) 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(wd), 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]
  1. 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.)
  2. 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.)
  3. 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
  4. 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
  5. 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.)
  6. 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.)
  7. 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.”
  8. 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
  9. 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(wd), amelyet a programokon azok integrált környezetben történő végrehajtása során végeznek.
  10. Clang Static Analyzer. LLVM. [2018. április 30-i dátummal az eredetiből archiválva]. (Hozzáférés: 2009. szeptember 3.)
  11. Getting Involved with the Clang Project, LLVM Developer Group, <https://clang.llvm.org/get_involved.html>. Hozzáférés ideje: 2012-09-18
  12. 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.)
  13. Clang 17.0.1 Release Notes. LLVM. (Hozzáférés: 2023. október 25.)
  14. Treat, Adam (19 February 2005), "mkspecs and patches for LLVM compile of Qt4"
  15. A szoftverfejlesztő készlet (Software development kit, vagy SDK) szoftverfejlesztő eszközök gyűjteménye egyetlen telepíthető csomagban.
  16. Lattner, Chris (2007. május 25.). „LLVM for OpenGL and other stuff” (Slides). LLVM Developers' Meeting. 
  17. Zadeck, Kenneth (19 November 2005), "Re: LLVM/GCC Integration Proposal"
  18. a b Naroff, Steve (2007. május 25.). „New LLVM C Front-end” (Slides). LLVM Developers' Meeting. 
  19. 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.
  20. Lattner, Chris (11 July 2007), "New LLVM C front-end: "clang""
  21. Clang team, clang: a C language family frontend for LLVM Archiválva 2017. november 12-i dátummal a Wayback Machine-ben.
  22. A számítástechnikában a solution stack vagy szoftver verem(wd) 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.
  23. 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.)
  24. 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.
  25. 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.)
  26. Welcome to Flang's documentation — the Flang Compiler
  27. 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.
  28. Az 'Application binary interface (ABI) két bináris programmodul(wd) közötti interfész.
  29. 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
  30. 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.
  31. 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
  32. 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.
  33. 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
  34. 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.)
  35. 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.)
  36. 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.)
  37. 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.)
  38. 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(wd) szerkezetének fa reprezentációja. A fa minden egyes csomópontja(wd) 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.