Articulo de referencia

Sonido metálico

{{Cite web|url=https://www.llvm.org/releases/2.1/docs/ReleaseNotes.html|title=LLVM 2.1 Release Notes|website=llvm.org|publisher=LLVM Developer Group|date=27 September 2007|acces...

Clang ( / ˈ k l æ ŋ / ) [ 6 ] es un front-end de compilador para los lenguajes de programación C , C++ , Objective-C y Objective-C++ y los marcos de software OpenMP , [ 7 ] OpenCL , RenderScript , CUDA , SYCL y HIP . [ 8 ] Actúa como un reemplazo directo para la Colección de Compiladores GNU (GCC), soportando la mayoría de sus banderas de compilación y extensiones de lenguaje no oficiales. [ 9 ] [ 10 ] Incluye un analizador estático y varias herramientas de análisis de código. [ 11 ]

Clang funciona en conjunto con el backend del compilador LLVM y ha sido un subproyecto de LLVM 2.6 y posteriores. [ 12 ] Al igual que LLVM, es software libre y de código abierto bajo la licencia de software Apache 2.0 . [ 4 ] [ 5 ] Entre sus contribuyentes se incluyen Apple , IBM , Microsoft , Google , ARM , Sony , Intel y AMD .

Clang 22 ofrece soporte completo para todos los estándares C++ publicados hasta C++17 , implementa la mayoría de las características de C++20 y C++23 , y ofrece soporte inicial para el estándar C++26 . [ 13 ] Desde la versión 16.0.0, Clang compila C++ utilizando el dialecto GNU++17 por defecto, que incluye características del estándar C++17 y extensiones GNU conformes. [ 14 ]

Fondo

En 2005, Apple Inc. hizo un uso extensivo de LLVM en varios productos comerciales, [ 15 ] incluyendo el SDK de iOS y Xcode 3.1. Un compilador de código OpenGL para OS X que convierte las llamadas de OpenGL en llamadas más fundamentales para unidades de procesamiento gráfico (GPU) que no admiten ciertas características fue uno de los primeros usos de LLVM. Esto permitió a Apple admitir OpenGL en computadoras que usan chipsets Intel GMA , aumentando el rendimiento en esas máquinas. [ 16 ]

El proyecto LLVM originalmente pretendía usar el front-end de GCC . Sin embargo, el código fuente de GCC es extenso y algo engorroso; como dijo un desarrollador veterano de GCC, refiriéndose a LLVM: "Intentar hacer bailar al hipopótamo no es muy divertido". [ 17 ] Además, el software de Apple usa Objective-C , que es una prioridad baja para los desarrolladores de GCC. Por lo tanto, GCC no se integra fácilmente en el entorno de desarrollo integrado de Apple . [ 18 ] Finalmente, el acuerdo de licencia de GCC, la Licencia Pública General GNU (GPL) versión 3 , exige que los desarrolladores que distribuyen extensiones o versiones modificadas de GCC pongan a disposición su código fuente , pero la licencia de software permisiva de LLVM no lo exige. [ 4 ] [ 5 ]

Por estas razones, Apple desarrolló Clang, un nuevo front-end de compilador que admite C, Objective-C y C++. [ 18 ] En julio de 2007, el proyecto recibió la aprobación para convertirse en código abierto. [ 19 ]

Diseño

Clang trabaja en conjunto con LLVM. [ 20 ] La combinación de Clang y LLVM proporciona la mayor parte de la cadena de herramientas para reemplazar la pila de GCC . Uno de los objetivos principales de Clang es proporcionar una arquitectura basada en bibliotecas, [ 21 ] de modo que el compilador pueda interoperar con otras herramientas que interactúan con el código fuente, como los entornos de desarrollo integrados (IDE). En contraste, GCC trabaja en un flujo de trabajo de compilación- enlace - depuración ; integrarlo con otras herramientas no siempre es fácil. Por ejemplo, GCC utiliza un paso llamado fold que es clave para el proceso de compilación general, que tiene el efecto secundario de traducir el árbol de código a una forma que se ve diferente del código fuente original. Si se encuentra un error durante o después del paso fold, puede ser difícil traducirlo de nuevo a una ubicación en el código fuente original. Además, los proveedores que utilizan la pila de GCC dentro de los IDE deben usar herramientas separadas para indexar el código, para proporcionar características como resaltado de sintaxis y autocompletado de código inteligente .

Clang retiene más información durante el proceso de compilación que GCC y conserva la estructura general del código original, lo que facilita la identificación de errores en el código fuente original. Los informes de errores de Clang son más detallados, específicos y legibles por máquina, lo que permite a los IDE indexar la salida del compilador. El diseño modular del compilador ofrece indexación del código fuente, comprobación de sintaxis y otras características propias de los sistemas de desarrollo rápido de aplicaciones . El árbol de análisis sintáctico también resulta más adecuado para la refactorización automatizada del código , ya que representa directamente el código fuente original.

Clang compila únicamente lenguajes similares a C, como C, C++, Objective-C y Objective-C++. En muchos casos, Clang puede reemplazar a GCC según sea necesario, sin afectar el conjunto de herramientas. Admite la mayoría de las opciones de GCC de uso común. Flang, un proyecto de Fortran, estaba en desarrollo en 2022. Sin embargo, para otros lenguajes, como Ada , LLVM sigue dependiendo de GCC u otro compilador.

Brida

El proyecto Flang , de Nvidia y The Portland Group , añade soporte para Fortran . [ 22 ] Flang es el frontend de Fortran de LLVM, a menudo denominado LLVM Flang para diferenciarlo de Classic Flang . Se trata de dos compiladores de Fortran separados e independientes. LLVM Flang se encuentra en desarrollo activo. A fecha de octubre de 2023 , las versiones de desarrollo de Flang estaban en progreso y podían descargarse desde el Proyecto LLVM. [ 23 ]

Rendimiento y compatibilidad con GCC

Compilación de htop con Clang

Clang es compatible con GCC. [ 10 ] Su interfaz de línea de comandos comparte muchas de las opciones y banderas de GCC . Clang implementa muchas extensiones del lenguaje GNU e intrínsecas del compilador , algunas de las cuales son puramente para compatibilidad. Por ejemplo, aunque Clang implementa intrínsecas atómicas que se corresponden exactamente con las atómicas de C11 , también implementa __sync_*las intrínsecas de GCC para compatibilidad con GCC y la biblioteca estándar de C++ (libstdc++). Clang también mantiene la compatibilidad de la interfaz binaria de la aplicación (ABI) con el código objeto generado por GCC . En la práctica, Clang es un reemplazo directo para GCC. [ 24 ]

Los desarrolladores de Clang buscan reducir el consumo de memoria y aumentar la velocidad de compilación en comparación con otros compiladores, como GCC. En octubre de 2007, informaron que Clang compilaba las bibliotecas Carbon más del doble de rápido que GCC, utilizando aproximadamente una sexta parte de la memoria y el espacio en disco de GCC. [ 25 ] Para 2011, Clang parecía mantener esta ventaja en el rendimiento del compilador. [ 26 ] [ 27 ] A mediados de 2014, Clang seguía compilando consistentemente más rápido que GCC en una prueba de rendimiento mixta de tiempo de compilación y programa. [ 28 ] Sin embargo, para 2019, Clang era significativamente más lento en la compilación del kernel de Linux que GCC, aunque seguía siendo ligeramente más rápido en la compilación de LLVM. [ 29 ]

Si bien Clang históricamente ha sido más rápido que GCC en la compilación, la calidad de la salida se ha quedado atrás. En 2014, el rendimiento de los programas compilados con Clang era inferior al de los programas compilados con GCC, a veces por factores considerables (hasta 5,5 veces), [ 28 ] replicando informes anteriores de un rendimiento más lento. [ 26 ] Ambos compiladores han evolucionado para aumentar su rendimiento desde entonces, y la brecha se ha reducido:

  • Las comparaciones realizadas en noviembre de 2016 entre GCC 4.8.2 y clang 3.4, en un amplio conjunto de archivos de prueba, muestran que GCC supera a clang en aproximadamente un 17 % en código fuente bien optimizado. Los resultados de las pruebas dependen del código, y el código fuente C no optimizado puede revertir estas diferencias. Por lo tanto, ambos compiladores parecen ser, en términos generales, comparables. [ 30 ]
  • Las comparaciones realizadas en 2019 en Intel Ice Lake demostraron que los programas generados por Clang 10 alcanzaron el 96 % del rendimiento de GCC 10 en 41 pruebas de rendimiento diferentes (ganando en 22 y perdiendo en 19 de ellas). [ 29 ]
  • Otra comparación realizada en 2023 reveló que los programas compilados con Clang ahora igualan el rendimiento de los compilados con GCC. En promedio, Clang 16 supera a GCC 13 en un 6 %. [ 31 ]

Interfaz

libclangProporciona una interfaz C, ofreciendo una API relativamente pequeña. La funcionalidad expuesta incluye: analizar el código fuente para generar un AST , cargar AST, recorrer el AST y asociar ubicaciones de código fuente con elementos dentro del AST.

Historial de estado

Esta tabla presenta únicamente los pasos y lanzamientos más significativos en la historia de Clang.

Véase también

Referencias

  1. "Notas de la versión LLVM 2.1" . llvm.org . Grupo de desarrolladores de LLVM. 27 de septiembre de 2007. Archivado del original el 17 de noviembre de 2016. Consultado el 30 de abril de 2018 .
  2. "LLVM 22.1.8" . 16 de junio de 2026. Consultado el 16 de junio de 2026 .
  3. "Versiones" . llvm – repositorio llvm-project . Grupo de desarrolladores de LLVM. 27 de agosto de 2021. Archivado del original el 12 de septiembre de 2021. Recuperado el 12 de septiembre de 2021 a través de GitHub.com .
  4. 1 2 3 "LICENSE.TXT" , llvm.org , Grupo de desarrolladores de LLVM, archivado del original el 11 de noviembre de 2020 , recuperado el 24 de septiembre de 2019
  5. 1 2 3 "Política para desarrolladores de LLVM" , llvm.org , Grupo de desarrolladores de LLVM, § Derechos de autor, licencia y patentes, archivado del original el 13 de noviembre de 2012 , recuperado el 12 de septiembre de 2021
  6. Christopher, Eric (3 de julio de 2008). "Simplemente me pregunto sobre la pronunciación de Clang" . LLVMdev (Lista de correo) . Consultado el 22 de septiembre de 2015 .
  7. "Soporte para OpenMP" . Blog del proyecto LLVM . 22 de mayo de 2015. Archivado del original el 26 de marzo de 2016. Consultado el 28 de marzo de 2016 .
  8. "Interfaz de computación heterogénea de C++ para portabilidad" . GitHub . Archivado del original el 27 de junio de 2020. Consultado el 18 de febrero de 2020 .
  9. "Extensiones del lenguaje Clang" . Archivado del original el 24 de febrero de 2014. Consultado el 8 de noviembre de 2017. Además de las extensiones de lenguaje que se enumeran aquí, Clang pretende admitir una amplia gama de extensiones de GCC.
  10. 1 2 Clang - Características y objetivos: Compatibilidad con GCC , 15 de abril de 2013, archivado del original el 27 de abril de 2018 , recuperado el 30 de abril de 2018
  11. "Analizador estático de Clang" . LLVM. Archivado del original el 30 de abril de 2018. Recuperado el 3 de septiembre de 2009 .
  12. "Cómo participar en el proyecto Clang" , clang.llvm.org , Grupo de desarrolladores de LLVM, archivado del original el 27 de abril de 2018 , recuperado el 18 de septiembre de 2012. Clang es un subproyecto del proyecto LLVM, pero tiene sus propias listas de correo porque las comunidades tienen personas con diferentes intereses.
  13. 1 2 "Soporte para C++ y C++'0x en Clang" . LLVM. Archivado del original el 4 de julio de 2013. Recuperado el 12 de marzo de 2023 .
  14. "Notas de la versión 17.0.1 de Clang" . LLVM . Consultado el 25 de octubre de 2023 .
  15. Treat, Adam (19 de febrero de 2005). "mkspecs y parches para la compilación de Qt4 con LLVM" . Qt4-preview-feedback (Lista de correo). Archivado del original el 4 de octubre de 2011.
  16. Lattner, Chris (25 de mayo de 2007). LLVM para OpenGL y otras cosas (Diapositivas) . Reunión de desarrolladores de LLVM . Archivado (PDF) del original el 8 de mayo de 2016. Recuperado el 30 de abril de 2018 .
  17. Zadeck, Kenneth (19 de noviembre de 2005). "Re: Propuesta de integración LLVM/GCC" . Desarrollo de GCC (Lista de correo). Archivado del original el 10 de marzo de 2016. Recuperado el 25 de julio de 2016 .
  18. 1 2 Naroff, Steve (25 de mayo de 2007). Nuevo front-end C de LLVM (diapositivas) . Reunión de desarrolladores de LLVM . Archivado (PDF) del original el 3 de abril de 2019. Recuperado el 30 de abril de 2018 .
  19. Lattner, Chris (11 de julio de 2007). "Nuevo front-end C de LLVM: "clang"" . cfe-dev (Lista de correo). Archivado del original el 26 de marzo de 2020. Recuperado el 26 de marzo de 2020 .
  20. 1 2 Equipo de Clang, clang: una interfaz para la familia de lenguajes C para LLVM. Archivado el 12 de noviembre de 2017 en Wayback Machine .
  21. "Clang: Utilidades y aplicaciones: Arquitectura basada en bibliotecas" . Archivado del original el 27 de abril de 2018. Consultado el 30 de abril de 2018 .
  22. "FLANG: NVIDIA lleva Fortran a LLVM" . Archivado del original el 20 de mayo de 2017. Consultado el 18 de mayo de 2017 .
  23. "Bienvenido a la documentación de Flang: el compilador de Flang" .
  24. Clang a menudo se puede usar como reemplazo directo de GCC , mayo de 2020, archivado del original el 8 de mayo de 2020 , recuperado el 9 de mayo de 2020
  25. Clang - Características y objetivos: compilaciones rápidas y bajo consumo de memoria , octubre de 2007, archivado del original el 27 de abril de 2018 , consultado el 30 de abril de 2018.
  26. 1 2 3 Simonis, Volker (10 de febrero de 2011). "Compilación de la máquina virtual HotSpot con Clang" . Archivado del original el 18 de febrero de 2011. Recuperado el 13 de febrero de 2011. Si bien la compatibilidad general con GCC es excelente y los tiempos de compilación son impresionantes, el rendimiento del código generado aún está por debajo de una versión reciente de GCC.
  27. "Comparativa de rendimiento de LLVM y Clang con GCC 4.5" . Phoronix . 21 de abril de 2010. Archivado del original el 2 de noviembre de 2016. Consultado el 13 de febrero de 2011. Los binarios de LLVM-GCC y Clang tuvieron dificultades para competir con GCC 4.5.0 en la prueba de rendimiento cronometrada HMMer de una búsqueda en la base de datos Pfam. LLVM-GCC y Clang fueron aproximadamente un 23% más lentos (...). Aunque LLVM/Clang no es el campeón del rendimiento en este momento, ambos componentes continúan en desarrollo activo y esperamos tener más noticias que reportar en los próximos meses.
  28. 1 2 "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks" . OpenBenchmarking.org. 14 de abril de 2014. Archivado del original el 23 de octubre de 2017. Recuperado el 25 de junio de 2014 .
  29. 1 2 Michael Larabel (23 de diciembre de 2019). "LLVM Clang logra aproximadamente el 96 % del rendimiento de GCC en Intel Ice Lake" . Archivado del original el 15 de enero de 2021. Recuperado el 14 de enero de 2021 .
  30. "Clang vs GCC: ¿cuál produce mejores binarios?" . stackoverflow.com . Archivado del original el 1 de junio de 2017 . Consultado el 1 de octubre de 2018 .
  31. Michael Larabel (11 de mayo de 2023). "Rendimiento del compilador LLVM Clang 16 frente al GCC 13 en Intel Raptor Lake" . Consultado el 24 de abril de 2024 .
  32. Divacky, Roman (25 de febrero de 2009). " [ Anuncio ] clang/llvm puede compilar el kernel de arranque de FreeBSD en i386/amd64" . Archivado del original el 1 de mayo de 2018. Recuperado el 30 de abril de 2018 .
  33. Compilación de FreeBSD con Clang , Wiki.freebsd.org, 24 de agosto de 2012, archivado del original el 30 de abril de 2018 , consultado el 18 de septiembre de 2012.
  34. Hornung, Alex. "llvm/clang once more" . Archivado del original el 30 de abril de 2018. Recuperado el 30 de abril de 2018 .
  35. Clang , DragonFly BSD, archivado del original el 30 de abril de 2018 , recuperado el 18 de septiembre de 2012.
  36. "Clang puede compilar LLVM y Clang" . Blog del proyecto LLVM. 24 de diciembre de 2009. Archivado del original el 26 de abril de 2012. Consultado el 31 de diciembre de 2009 .
  37. "Clang se autoaloja con éxito" . Blog del proyecto LLVM. 4 de febrero de 2010. Archivado del original el 26 de abril de 2012. Consultado el 5 de febrero de 2010 .
  38. Gregor, Doug (20 de mayo de 2010). "¡Clang++ Builds Boost!" . Blog del proyecto LLVM. Archivado del original el 26 de abril de 2012. Recuperado el 21 de mayo de 2010 .
  39. Davis, Brad. "Informes de estado de FreeBSD abril-junio de 2010" . Archivado del original el 24 de junio de 2018. Recuperado el 30 de abril de 2018 .
  40. Clang crea un kernel de Linux funcional (arranca a RL5 con SMP, redes y X, autoalojamiento) , Lists.cs.uiuc.edu, archivado del original el 7 de septiembre de 2015 , recuperado el 18 de septiembre de 2012.
  41. Gregor, Douglas (26 de enero de 2011). "Nuevo soporte para la característica C++0x en Clang" (Lista de correo). Archivado del original el 30 de enero de 2011. Recuperado el 29 de enero de 2011 .
  42. Sonnenberger, Jörg (19 de enero de 2012). "Estado de NetBSD y LLVM" . Archivado del original el 21 de septiembre de 2016. Recuperado el 26 de febrero de 2014 .
  43. Ledru, Sylvestre. "Reconstrucción del archivo Debian con clang" . Archivado del original el 1 de mayo de 2018. Recuperado el 30 de abril de 2018 .
  44. "Sitio web oficial de Minix 3: Noticias" . Archivado del original el 17 de diciembre de 2009. Consultado el 7 de diciembre de 2012 .
  45. Gerzo, Daniel (12 de mayo de 2012). "Informe trimestral sobre el estado de FreeBSD, enero-marzo de 2012" (Lista de correo). Archivado del original el 18 de febrero de 2018. Recuperado el 14 de mayo de 2012 .
  46. Davis, Brooks (5 de noviembre de 2012). "Heads Up: Clang ahora es el predeterminado en x86" (Lista de correo). Archivado del original el 30 de abril de 2018. Recuperado el 7 de noviembre de 2012 .
  47. Webster, Behan (18 de febrero de 2013). "LLVMLinux: Compilando Android con LLVM" (PDF) . Archivado del original (PDF) el 12 de mayo de 2014. Recuperado el 11 de mayo de 2013 .
  48. Tinti, Vinicius (17 de marzo de 2013). "LLVMLinux: Nexus 7" . Archivado del original el 11 de junio de 2014. Recuperado el 11 de mayo de 2013 .
  49. Du Toit, Stefanus. "¡Clang ya cuenta con todas las funcionalidades de C++11!" . Archivado del original el 24 de septiembre de 2019. Consultado el 20 de abril de 2013 .
  50. " [ llvm-project ] Revisión 194194" . Archivado del original el 18 de noviembre de 2018 . Recuperado el 30 de abril de 2018 .
  51. Ledru, Sylvestre. "Reconstrucción de Debian usando Clang 3.5.0" . Archivado del original el 1 de mayo de 2018. Recuperado el 30 de abril de 2018 .
  52. "Historial de revisiones del NDK | Desarrolladores de Android" . developer.android.com . Archivado del original el 6 de marzo de 2018. Consultado el 6 de marzo de 2018 .
  53. "Historial de revisiones de NDK | Android NDK | Desarrolladores de Android" . Desarrolladores de Android . Archivado del original el 5 de abril de 2019. Consultado el 30 de abril de 2018 .
  54. Nagy, Robert (26 de julio de 2017). "Cambiar el compilador predeterminado en amd64 e i386 a clang" (Lista de correo). Archivado del original el 25 de octubre de 2018. Recuperado el 30 de septiembre de 2017 .
  55. Kettenis, Mark (19 de enero de 2018). "Cambiar el compilador predeterminado en armv7 a clang" (Lista de correo). Archivado del original el 8 de abril de 2022. Recuperado el 27 de agosto de 2020 .
  56. "Clang ahora se usa para compilar Chrome para Windows" . blog.llvm.org . 5 de marzo de 2018. Archivado del original el 5 de marzo de 2018. Consultado el 7 de abril de 2018 .
  57. "Firefox Beta 63.0beta, vea todas las nuevas funciones, actualizaciones y correcciones" . www.mozilla.org . Archivado del original el 19 de abril de 2021. Consultado el 18 de marzo de 2020 .
  58. Hankala, Visa (1 de julio de 2019). "Cambiar el compilador predeterminado de octeon a clang" (Lista de correo). Archivado del original el 8 de abril de 2022. Recuperado el 27 de agosto de 2020 .
  59. "LLVM 9 se lanza con soporte oficial para el destino RISC-V, Asm Goto, Clang 9 y más" . riscv.org . 26 de septiembre de 2019. Archivado del original el 28 de diciembre de 2019. Consultado el 26 de septiembre de 2019 .
  60. "FreeBSD svn commit r358454" . 29 de febrero de 2020. Archivado del original el 10 de marzo de 2020. Recuperado el 7 de marzo de 2020 .
  61. Kettenis, Mark (2 de abril de 2020). "Cambiar el compilador predeterminado en powerpc a clang" (Lista de correo). Archivado del original el 8 de abril de 2022. Recuperado el 27 de agosto de 2020 .
  62. Hankala, Visa (21 de diciembre de 2020). "Hacer clang el compilador predeterminado en loongson" (Lista de correo). Archivado del original el 13 de enero de 2021. Recuperado el 1 de enero de 2021 .
  • Sitio web oficialEdita esto en Wikidata