close
Vés al contingut

Clang

De la Viquipèdia, l'enciclopèdia lliure
ImageClang
Image Modifica el valor a Wikidata
Tipuscompilador Modifica el valor a Wikidata
Versió estable
23.1.0 (25 agost 2026) Modifica el valor a Wikidata
LlicènciaLlicència Open Source NCSA/Universitat d'Illinois
Apache License v2.0 with LLVM Exceptions (en) Tradueix Modifica el valor a Wikidata
Part deLLVM Modifica el valor a Wikidata
Característiques tècniques
Sistema operatiusistema operatiu tipus Unix, Linux, GNU/Linux, OpenBSD, NetBSD, FreeBSD, DragonFly BSD i Minix 3 Modifica el valor a Wikidata
Plataformamultiplataforma, Linux, FreeBSD, NetBSD, OpenBSD, Minix 3, DragonFly BSD, BSD, x86, x86_64, RISC-V, ARM, PowerPC i WebAssembly Modifica el valor a Wikidata
Utilitzat perC++, Objective-C i C Modifica el valor a Wikidata
Escrit enC++ i C Modifica el valor a Wikidata
Equip
Desenvolupador(s)Apple Inc, Microsoft, Google, ARM Holdings, Sony, Intel Corporation i AMD Modifica el valor a Wikidata
Més informació
Lloc webclang.llvm.org (anglès) Modifica el valor a Wikidata
Stack ExchangeEtiqueta Modifica el valor a Wikidata
Id. Framalibreclang Modifica el valor a Wikidata

Clang /ˈklæŋ/ és un compilador front-end per als llenguatges de programació C, C++, Objective-C i Objective-C++ i els frameworks de programari OpenMP,[1] OpenCL, RenderScript, CUDA, SYCL i HIP.[2] 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.[3][4] Inclou un analitzador estàtic i diverses eines d'anàlisi de codi.[5] Clang funciona conjuntament amb el backend del compilador LLVM i ha estat un subprojecte de LLVM 2.6 i posteriors.[6] Igual que amb LLVM, és programari lliure i de codi obert sota la llicència de programari Apache 2.0.[7][8] 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.[9] 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.[10]

Rerefons

[modifica]

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.[11]

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.[12] 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.[13][14]

Per aquestes raons, Apple va desenvolupar Clang, un nou front-end de compilació que admet C, Objective-C i C++.[15] El juliol de 2007, el projecte va rebre l'aprovació per convertir-se en codi obert.

Disseny

[modifica]

Clang treballa conjuntament amb LLVM.[16] 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,[17] 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

[modifica]

El projecte Flang, de Nvidia i The Portland Group, afegeix suport per a Fortran.[18] 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. A Octubre 2023 , hi havia versions de desenvolupament de Flang en curs i es podien descarregar del projecte LLVM.[19]

Rendiment i compatibilitat amb GCC

[modifica]
Image
Compilació de Clang a htop

Clang és compatible amb GCC.[20] 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.[21]

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.[22] El 2011, Clang semblava conservar aquest avantatge en el rendiment del compilador.[23][24] 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.[25] 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.[26]

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),[27] replicant informes anteriors de rendiment més lent.[28] 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

[modifica]

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

[modifica]
  1. «OpenMP Support» (en anglès). LLVM Project Blog, 22-05-2015. Arxivat de l'original el March 26, 2016. [Consulta: 28 març 2016].
  2. «C++ Heterogeneous-Compute Interface for Portability» (en anglès). GitHub. Arxivat de l'original el June 27, 2020. [Consulta: 18 febrer 2020].
  3. «Clang Language Extensions» (en anglès). Arxivat de l'original el February 24, 2014. [Consulta: 8 novembre 2017].
  4. Clang - Features and Goals: GCC Compatibility, 15 April 2013, <https://clang.llvm.org/features.html#gcccompat>. Consulta: 30 abril 2018
  5. «Clang Static Analyzer» (en anglès). LLVM. Arxivat de l'original el April 30, 2018. [Consulta: 3 setembre 2009].
  6. , <https://clang.llvm.org/get_involved.html>. Consulta: 18 setembre 2012
  7. , <https://releases.llvm.org/9.0.0/LICENSE.TXT>. Consulta: 24 setembre 2019
  8. , <https://llvm.org/docs/DeveloperPolicy.html#copyright-license-and-patents>. Consulta: 12 setembre 2021
  9. «C++ and C++'0x Support in Clang» (en anglès). LLVM. Arxivat de l'original el July 4, 2013. [Consulta: 12 març 2023].
  10. «Clang 17.0.1 Release Notes» (en anglès). LLVM. [Consulta: 25 octubre 2023].
  11. Lattner (25 May 2007). "LLVM for OpenGL and other stuff" (Slides) a LLVM Developers' Meeting. [Consulta: 30 abril 2018] 
  12. Naroff (25 May 2007). "New LLVM C Front-end" (Slides) a LLVM Developers' Meeting. [Consulta: 30 abril 2018] 
  13. , <https://releases.llvm.org/9.0.0/LICENSE.TXT>. Consulta: 24 setembre 2019
  14. , <https://llvm.org/docs/DeveloperPolicy.html#copyright-license-and-patents>. Consulta: 12 setembre 2021
  15. Naroff (25 May 2007). "New LLVM C Front-end" (Slides) a LLVM Developers' Meeting. [Consulta: 30 abril 2018] 
  16. Clang team, clang: a C language family frontend for LLVM Arxivat November 12, 2017, a Wayback Machine.
  17. «Clang: Utility and Applications: Library Based Architecture» (en anglès). Arxivat de l'original el April 27, 2018. [Consulta: 30 abril 2018].
  18. «FLANG: NVIDIA Brings Fortran To LLVM» (en anglès). Arxivat de l'original el May 20, 2017. [Consulta: 18 maig 2017].
  19. «Welcome to Flang's documentation — the Flang Compiler» (en anglès).
  20. Clang - Features and Goals: GCC Compatibility, 15 April 2013, <https://clang.llvm.org/features.html#gcccompat>. Consulta: 30 abril 2018
  21. Clang can often be used as a drop-in replacement for GCC, May 2020, <https://clang.llvm.org/get_started.html#driver>. Consulta: 9 maig 2020
  22. Clang - Features and Goals: Fast compiles and Low Memory Use, October 2007, <https://clang.llvm.org/features.html>. Consulta: 30 abril 2018
  23. Simonis, Volker. «Compiling the HotSpot VM with Clang» (en anglès), 10-02-2011. Arxivat de l'original el 18 February 2011. [Consulta: 13 febrer 2011].
  24. «Benchmarking LLVM & Clang Against GCC 4.5» (en anglès). Phoronix, 21-04-2010. Arxivat de l'original el November 2, 2016. [Consulta: 13 febrer 2011].
  25. «GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks» (en anglès). OpenBenchmarking.org, 14-04-2014. Arxivat de l'original el October 23, 2017. [Consulta: 25 juny 2014].
  26. Michael Larabel. «LLVM Clang Achieves ~96% The Performance Of GCC On Intel Ice Lake» (en anglès), 23-12-2019. Arxivat de l'original el January 15, 2021. [Consulta: 14 gener 2021].
  27. «GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks» (en anglès). OpenBenchmarking.org, 14-04-2014. Arxivat de l'original el October 23, 2017. [Consulta: 25 juny 2014].
  28. Simonis, Volker. «Compiling the HotSpot VM with Clang» (en anglès), 10-02-2011. Arxivat de l'original el 18 February 2011. [Consulta: 13 febrer 2011].