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őtA 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. é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.

Háttér 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-banA szoftverfejlesztő készlet (Software development kit, vagy SDK) szoftverfejlesztő eszközök gyűjteménye egyetlen telepíthető csomagban. é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ébenA 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. 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.

Tervezés A Clang az LLVM-mel együtt működik.Clang team, clang: a C language family frontend for LLVM A Clang és az LLVM kombinációja biztosítja a GCC stackA 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. 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 treeA parse tree, elemző-fa vagy szintaxisfa egy rendezett fa, amely valamilyen környezetfüggetlen nyelvtan szerint egy karakterlánc szintaktikai szerkezetét reprezentálja. 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 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.

Teljesítmény és GCC kompatibilitás

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-etAz 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. 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észAz 'Application binary interface (ABI) két bináris programmodul közötti 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árakatA 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., 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 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. 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). 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.

Interfész 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.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.

Lásd még GNU Compiler Collection

Jegyzetek

Fordítás

Kategória:Számítógép-programozás Kategória:Fejlesztőeszközök