Autor(es) original(es) | Chris Lattner |
---|---|
Desarrollador(es) | Grupo de desarrolladores de LLVM |
Lanzamiento inicial | 26 de septiembre de 2007 ( 26 de septiembre de 2007 ) | [1]
Versión estable | 19.1.2 [2] / 15 de octubre de 2024 ( 15 de octubre de 2024 ) |
Repositorio |
|
Escrito en | C++ |
Sistema operativo | Similar a Unix |
Plataforma | AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le [3] |
Tipo | Interfaz del compilador |
Licencia | Apache 2.0 con excepciones LLVM [4] [5] |
Sitio web | clang.llvm.org |
Clang ( / ˈ k l eɪ ŋ / ) [6] es un compilador frontend para los lenguajes de programación C , C++ , Objective-C , Objective-C++ y los marcos de software OpenMP , [7] OpenCL , RenderScript , CUDA , SYCL y HIP . [8] Actúa como un reemplazo directo para GNU Compiler Collection (GCC), y admite la mayoría de sus indicadores 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 opera en conjunto con el back end del compilador LLVM y ha sido un subproyecto de LLVM 2.6 y versiones posteriores. [12] Al igual que LLVM, es un software gratuito y de código abierto bajo la licencia de software Apache 2.0 . [4] [5] Entre sus contribuyentes se incluyen Apple , Microsoft , Google , ARM , Sony , Intel y AMD .
Clang 17, la última versión principal de Clang a partir de octubre de 2023, tiene soporte completo para todos los estándares C++ publicados hasta C++17 , implementa la mayoría de las características de C++20 y tiene soporte inicial para el próximo estándar C++23 . [13] Desde v16.0.0, Clang compila C++ usando el dialecto GNU++17 de forma predeterminada, que incluye características del estándar C++17 y extensiones GNU conformes. [14]
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 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 , lo que aumentó el rendimiento en esas máquinas. [16]
El proyecto LLVM originalmente tenía la intención de utilizar el frontend de GCC . Sin embargo, el código fuente de GCC es grande y algo engorroso; como dijo un desarrollador de GCC de larga trayectoria refiriéndose a LLVM, "Intentar hacer bailar al hipopótamo no es realmente muy divertido". [17] Además, el software de Apple utiliza Objective-C , que es una baja prioridad para los desarrolladores de GCC. Como tal, GCC no se integra sin problemas en el entorno de desarrollo integrado (IDE) de Apple. [18] Finalmente, el acuerdo de licencia de GCC, la Licencia Pública General GNU (GPL) versión 3 , requiere que los desarrolladores que distribuyan extensiones o versiones modificadas de GCC hagan disponible su código fuente , pero la licencia de software permisiva de LLVM no lo requiere. [4] [5]
Por estas razones, Apple desarrolló Clang, un nuevo frontend de compilador que soporta C, Objective-C y C++. [18] En julio de 2007, el proyecto recibió la aprobación para convertirse en código abierto. [19]
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 GCC . Uno de los principales objetivos 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). Por el contrario, GCC funciona 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 parece al código fuente original. Si se encuentra un error durante o después del paso de fold, puede ser difícil traducirlo de nuevo a una ubicación en la fuente original. Además, los proveedores que utilizan la pila GCC dentro de los IDE deben utilizar herramientas separadas para indexar el código, para proporcionar funciones como resaltado de sintaxis y finalización inteligente de código .
Clang retiene más información durante el proceso de compilación que GCC y conserva la forma general del código original, lo que facilita la asignación de errores a la fuente original. Los informes de errores de Clang son más detallados, específicos y legibles por máquina, por lo que los IDE pueden indexar la salida del compilador. El diseño modular del compilador puede ofrecer indexación de código fuente, verificación de sintaxis y otras funciones normalmente asociadas con los sistemas de desarrollo rápido de aplicaciones . El árbol de análisis también es más adecuado para admitir la refactorización automatizada de código , ya que representa directamente el código fuente original.
Clang compila solo 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 otros efectos en la cadena de herramientas en su conjunto. [ cita requerida ] Admite la mayoría de las opciones de GCC de uso común. Flang, un proyecto de Fortran, estaba en curso en 2022. Sin embargo, para otros lenguajes, como Ada , LLVM sigue dependiendo de GCC u otro interfaz de compilador.
El proyecto Flang de Nvidia y The Portland Group añade compatibilidad con Fortran . [22] Flang es la interfaz Fortran de LLVM. A menudo se lo denomina "LLVM Flang" para diferenciarse de "Classic Flang", que son dos compiladores Fortran independientes y separados. "LLVM Flang" se encuentra en desarrollo activo. Las versiones de desarrollo de Flang estaban en proceso en octubre de 2023 [actualizar]y se podían descargar desde el Proyecto LLVM. [23]
Clang es compatible con GCC. [10] Su interfaz de línea de comandos comparte muchas de las opciones y características de GCC . Clang implementa muchas extensiones de lenguaje GNU y funciones intrínsecas del compilador , algunas de las cuales son puramente para compatibilidad. Por ejemplo, aunque Clang implementa funciones intrínsecas atómicas que corresponden exactamente con las funciones atómicas de C11 , también implementa __sync_*
las funciones 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 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 tienen como objetivo 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, mientras que utilizaba 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 todavía compilaba consistentemente más rápido que GCC en un punto de referencia mixto de tiempo de compilación y rendimiento del programa. [28] Sin embargo, para 2019, Clang es significativamente más lento en la compilación del kernel de Linux que GCC, mientras que sigue siendo ligeramente más rápido en la compilación de LLVM. [29]
Si bien Clang ha sido históricamente más rápido que GCC en la compilación, la calidad de salida ha quedado rezagada. A partir de 2014, el rendimiento de los programas compilados con Clang quedó rezagado con respecto al del programa compilado con GCC, a veces por grandes factores (hasta 5,5x), [28] replicando informes anteriores de rendimiento más lento. [26] Ambos compiladores han evolucionado para aumentar su rendimiento desde entonces, y la brecha se ha reducido:
libclang
proporciona una interfaz C, que proporciona una API relativamente pequeña. La funcionalidad expuesta incluye: analizar el código fuente en un AST , cargar AST, recorrer el AST, asociar ubicaciones de origen con elementos dentro del AST.
Esta tabla presenta solo los pasos y lanzamientos significativos en la historia de Clang.
Fecha | Reflejos |
---|---|
11 de julio de 2007 | La interfaz de usuario de Clang se publicó bajo licencia de código abierto |
25 de febrero de 2009 | Clang/LLVM puede compilar un núcleo FreeBSD funcional . [32] [33] |
16 de marzo de 2009 | Clang/LLVM puede compilar un núcleo DragonFly BSD funcional. [34] [35] |
23 de octubre de 2009 | Se lanzó Clang 1.0, con LLVM 2.6 por primera vez. |
Diciembre de 2009 | La generación de código para C y Objective-C alcanza la calidad de producción. El soporte para C++ y Objective-C++ aún es incompleto. Clang C++ puede analizar GCC 4.2 libstdc++ y generar código funcional para programas no triviales, [20] y puede compilarse a sí mismo. [36] |
2 de febrero de 2010 | Clang autoalojado . [37] |
20 de mayo de 2010 | La última versión de Clang creó las bibliotecas Boost C++ con éxito y pasó casi todas las pruebas. [38] |
10 de junio de 2010 | Clang/LLVM se convierte en parte integral de FreeBSD , pero el compilador predeterminado sigue siendo GCC. [39] |
25 de octubre de 2010 | Clang/LLVM puede compilar un kernel Linux modificado que funcione . [40] |
Enero de 2011 | Se completó el trabajo preliminar para respaldar el borrador del estándar C++0x , con algunas de las nuevas características del borrador compatibles con la versión de desarrollo de Clang. [41] [13] |
10 de febrero de 2011 | Clang puede compilar una máquina virtual Java HotSpot funcional . [26] |
19 de enero de 2012 | Clang se convierte en un componente opcional en el sistema de compilación multiplataforma de NetBSD , pero GCC sigue siendo el predeterminado. [42] |
29 de febrero de 2012 | Clang 3.0 puede reconstruir el 91,2% del archivo Debian . [43] |
29 de febrero de 2012 | Clang se convierte en el compilador predeterminado en MINIX 3 [44] |
12 de mayo de 2012 | Se anuncia que Clang/LLVM reemplazará a GCC en FreeBSD . [45] |
5 de noviembre de 2012 | Clang se convierte en el compilador predeterminado en FreeBSD 10.x en amd64/i386. [46] |
18 de febrero de 2013 | Clang/LLVM puede compilar un kernel Linux Android modificado y funcional para Nexus 7. [ 47] [48] |
19 de abril de 2013 | Clang es una característica completa de C++11 . [49] |
6 de noviembre de 2013 | Clang es una herramienta completa de C++14 . [50] |
11 de septiembre de 2014 | Clang 3.5 puede reconstruir el 94,3% del archivo de Debian. El porcentaje de fallos ha disminuido un 1,2% por versión desde enero de 2013, principalmente debido a una mayor compatibilidad con los indicadores GCC. [51] |
Octubre de 2016 | Clang se convierte en el compilador predeterminado para Android [52] (y más tarde en el único compilador compatible con Android NDK [53] ). |
13 de marzo de 2017 | Se lanzó Clang 4.0.0 |
26 de julio de 2017 | Clang se convierte en el compilador predeterminado en OpenBSD 6.2 en amd64/i386. [54] |
7 de septiembre de 2017 | Se lanzó Clang 5.0.0 |
19 de enero de 2018 | Clang se convierte en el compilador predeterminado en OpenBSD 6.3 en arm. [55] |
5 de marzo de 2018 | Clang ahora se utiliza para crear Google Chrome para Windows. [56] |
8 de marzo de 2018 | Lanzamiento de Clang 6.0.0 |
5 de septiembre de 2018 | Clang ahora se utiliza para crear Firefox para Windows. [57] |
19 de septiembre de 2018 | Lanzamiento de Clang 7.0.0 |
20 de marzo de 2019 | Lanzamiento de Clang 8.0.0 |
1 de julio de 2019 | Clang se convierte en el compilador predeterminado en OpenBSD 6.6 en mips64. [58] |
19 de septiembre de 2019 | Se lanzó Clang 9.0.0 con soporte oficial para objetivos RISC-V . [59] |
29 de febrero de 2020 | Clang se convierte en el único compilador de C en el sistema base de FreeBSD , con la eliminación de GCC . [60] |
24 de marzo de 2020 | Se lanzó Clang 10.0.0 |
2 de abril de 2020 | Clang se convierte en el compilador predeterminado en OpenBSD 6.7 en PowerPC. [61] |
12 de octubre de 2020 | Se lanzó Clang 11.0.0 |
21 de diciembre de 2020 | Clang se convierte en el compilador predeterminado en OpenBSD 6.9 en mips64el. [62] |
14 de abril de 2021 | Se lanzó Clang 12.0.0 |
4 de octubre de 2021 | Se lanzó Clang 13.0.0 |
25 de marzo de 2022 | Se lanzó Clang 14.0.0 |
6 de septiembre de 2022 | Se lanzó Clang 15.0.0 |
17 de marzo de 2023 | Se lanzó Clang 16.0.0 |
9 de septiembre de 2023 | Lanzamiento de Clang 17.0.1 |
8 de marzo de 2024 | Lanzamiento de Clang 18.1.1 |
17 de septiembre de 2024 | Lanzamiento de Clang 19.1.0 |
Además de las extensiones de lenguaje que se enumeran aquí, Clang pretende ofrecer compatibilidad con una amplia gama de extensiones GCC.
Clang es un subproyecto del Proyecto LLVM, pero tiene sus propias listas de correo porque las comunidades tienen personas con diferentes intereses.
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 es inferior al de una versión reciente de GCC.
Los binarios de LLVM-GCC y Clang tuvieron dificultades para competir con GCC 4.5.0 en el benchmark HMMer cronometrado 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 en rendimiento en este momento, ambos componentes continúan bajo un desarrollo muy activo y es de esperar que haya más novedades que informar en los próximos meses