Clang és un compilador front-end per als llenguatges de programació C, C++, Objective-C i Objective-C++ i els frameworks de programari OpenMP, OpenCL, RenderScript, CUDA, SYCL i HIP. Actua com a substitut directe de la GNU Compiler Collection (GCC), i dóna suport a la majoria dels seus indicadors de compilació i extensions d'idiomes no oficials. Inclou un analitzador estàtic i diverses eines d'anàlisi de codi. Clang funciona conjuntament amb el backend del compilador LLVM i ha estat un subprojecte de LLVM 2.6 i posteriors. Igual que amb LLVM, és programari lliure i de codi obert sota la llicència de programari Apache 2.0. Entre els seus col·laboradors hi ha Apple, IBM, Microsoft, Google, ARM, Sony, Intel i AMD.
Clang 22 té suport complet per a tots els estàndards de C++ publicats fins a C++17, implementa la majoria de les característiques de C++20 i C++23, i té suport inicial per a l'estàndard C++26. Des de la versió 16.0.0, Clang compila C++ utilitzant el dialecte GNU++17 per defecte, que inclou característiques de l'estàndard C++17 i extensions GNU conformes.
Rerefons El 2005, Apple Inc. va fer un ús extensiu de LLVM en diversos productes comercials, incloent-hi l'SDK d'iOS i Xcode 3.1. Un dels primers usos de LLVM va ser un compilador de codi OpenGL per a OS X que converteix les crides OpenGL en crides més fonamentals per a unitats de processament gràfic (GPU) que no admeten certes funcions. Això va permetre a Apple donar suport a OpenGL en ordinadors que utilitzaven xips Intel GMA, augmentant el rendiment d'aquestes màquines.
El projecte LLVM originalment pretenia utilitzar el front-end de GCC. El codi font de GCC, però, és llarg i una mica feixuc; com va dir un desenvolupador de GCC amb molta experiència, referint-se a LLVM, "Intentar fer ballar l'hipopòtam no és gaire divertit". A més, el programari d'Apple utilitza Objective-C, que és una prioritat baixa per als desenvolupadors de GCC. Per tant, GCC no s'integra fàcilment a l'entorn de desenvolupament integrat d'Apple. Finalment, l'acord de llicència de GCC, la Llicència Pública General de GNU (GPL) versió 3, exigeix que els desenvolupadors que distribueixen extensions o versions modificades de GCC posin a disposició el seu codi font, però la llicència de programari permissiva de LLVM no ho exigeix.
Per aquestes raons, Apple va desenvolupar Clang, un nou front-end de compilació que admet C, Objective-C i C++. El juliol de 2007, el projecte va rebre l'aprovació per convertir-se en codi obert.
Disseny Clang treballa conjuntament amb LLVM.Clang team, clang: a C language family frontend for LLVM La combinació de Clang i LLVM proporciona la major part de la cadena d'eines per substituir la pila GCC. Un dels principals objectius de Clang és proporcionar una arquitectura basada en biblioteques, de manera que el compilador pugui interoperar amb altres eines que interactuen amb el codi font, com ara els entorns de desenvolupament integrats (IDE). En canvi, GCC funciona en un flux de treball de compilació-enllaç-depuració; integrar-lo amb altres eines no sempre és fàcil. Per exemple, GCC utilitza un pas anomenat "fold" que és clau per al procés de compilació general, que té l'efecte secundari de traduir l'arbre de codi en una forma que no s'assembla gens al codi font original. Si es troba un error durant o després del pas de plegat, pot ser difícil traduir-lo de nou a una ubicació de la font original. A més, els proveïdors que utilitzen la pila GCC dins dels IDE han d'utilitzar eines separades per indexar el codi, per proporcionar funcions com el ressaltat de sintaxi i la finalització intel·ligent de codi.
Clang reté més informació durant el procés de compilació que GCC i conserva la forma general del codi original, cosa que facilita el mapatge d'errors a la font original. Els informes d'errors de Clang són més detallats, específics i llegibles per màquina, de manera que els IDE poden indexar la sortida del compilador. El disseny modular del compilador pot oferir indexació del codi font, comprovació de sintaxi i altres funcions normalment associades amb sistemes de desenvolupament ràpid d'aplicacions. L'arbre d'anàlisi sintàctica també és més adequat per a la refactorització automatitzada de codi, ja que representa directament el codi font original.
Clang només compila llenguatges semblants a C, com ara C, C++, Objective-C i Objective-C++. En molts casos, Clang pot substituir GCC segons calgui, sense altres efectes sobre la cadena d'eines en conjunt. Admet la majoria de les opcions de GCC més utilitzades. Un projecte Fortran, Flang estava en curs el 2022. Tanmateix, per a altres llenguatges, com ara Ada, LLVM continua depenent de GCC o d'un altre front-end del compilador.
Flang El projecte Flang, de Nvidia i The Portland Group, afegeix suport per a Fortran. Flang és el frontend Fortran de LLVM, sovint anomenat LLVM Flang per diferenciar-lo del Flang clàssic. Aquests són dos compiladors de Fortran separats i independents. LLVM Flang està en desenvolupament actiu. , hi havia versions de desenvolupament de Flang en curs i es podien descarregar del projecte LLVM.
Rendiment i compatibilitat amb GCC miniatura|Compilació de Clang a htop Clang és compatible amb GCC. La seva interfície de línia d'ordres comparteix molts dels indicadors i opcions de GCC. Clang implementa moltes extensions del llenguatge GNU i intrínseques del compilador, algunes de les quals són purament per compatibilitat. Per exemple, tot i que Clang implementa intrínseques atòmiques que corresponen exactament amb els atòmics C11, també implementa les intrínseques __sync_* de GCC per a la compatibilitat amb GCC i la biblioteca estàndard de C++ (libstdc++). Clang també manté la compatibilitat de la interfície binària d'aplicació (ABI) amb el codi objecte generat per GCC. A la pràctica, Clang és un substitut imprès de GCC.
Els desenvolupadors de Clang tenen com a objectiu reduir la petjada de memòria i augmentar la velocitat de compilació en comparació amb altres compiladors, com ara GCC. A l'octubre de 2007, van informar que Clang va compilar les biblioteques de Carbon més del doble de ràpid que GCC, mentre utilitzava aproximadament una sisena part de la memòria i l'espai en disc de GCC. El 2011, Clang semblava conservar aquest avantatge en el rendiment del compilador. A mitjans de 2014, Clang encara compilava més ràpid que GCC en un temps de compilació mixt i en un punt de referència de rendiment del programa. No obstant això, el 2019, Clang és significativament més lent a l'hora de compilar el nucli de Linux que GCC, mentre que continua sent lleugerament més ràpid a l'hora de compilar LLVM.
Tot i que Clang ha estat històricament més ràpid que GCC en la compilació, la qualitat de sortida s'ha quedat enrere. A partir del 2014, el rendiment dels programes compilats per Clang era inferior al del programa compilat per GCC, de vegades per factors importants (fins a 5,5x), replicant informes anteriors de rendiment més lent. Ambdós compiladors han evolucionat per augmentar el seu rendiment des de llavors, i la diferència s'ha reduït:
Insereix un paràgraf
Les comparacions del novembre de 2016 entre GCC 4.8.2 i clang 3.4, en un gran conjunt de fitxers de prova, mostren que GCC supera clang aproximadament un 17% en codi font ben optimitzat. Els resultats de les proves són específics del codi i el codi font C no optimitzat pot revertir aquestes diferències. Per tant, els dos compiladors semblen àmpliament comparables. Les comparacions del 2019 a Intel Ice Lake han demostrat que els programes generats per Clang 10 han aconseguit el 96% del rendiment de GCC 10 en 41 proves de rendiment diferents (tot i que en van guanyar 22 i en van perdre 19). Una altra comparació realitzada el 2023 va revelar que els programes compilats amb Clang ara coincideixen amb el rendiment dels compilats amb GCC. De mitjana, Clang 16 supera GCC 13 en un 6%.
Interfície libclang proporciona una interfície C, proporcionant una API relativament petita. La funcionalitat exposada inclou: analitzar el codi font en un AST, carregar AST, recórrer l'AST i associar ubicacions font amb elements dins de l'AST.
Referències
Categoria:Programari Categoria:Compiladors