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]
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 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]
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]
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 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.
Flang-Fortran
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]
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:
Las comparaciones realizadas en noviembre de 2016 entre GCC 4.8.2 y clang 3.4, en una gran cantidad 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 son específicos del código y el código fuente C no optimizado puede revertir dichas diferencias. Por lo tanto, los dos compiladores parecen comparables en líneas generales. [30] [ fuente no confiable ]
Las comparaciones realizadas en 2019 en Intel Ice Lake han demostrado que los programas generados por Clang 10 han logrado el 96% del rendimiento de GCC 10 en 41 puntos de referencia diferentes (ganando en 22 y perdiendo en 19 de ellos). [29]
En 2023, otra comparación realizada cuatro años después 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, 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.
Historial de estado
Esta tabla presenta solo los pasos y lanzamientos significativos en la historia de Clang.
^ "Notas de la versión LLVM 2.1". llvm.org . LLVM Developer Group. 27 de septiembre de 2007. Archivado desde el original el 17 de noviembre de 2016 . Consultado el 30 de abril de 2018 .
^ "LLVM 19.1.2". 15 de octubre de 2024. Consultado el 15 de octubre de 2024 .
^ "Lanzamientos". llvm – repositorio llvm-project . LLVM Developer Group. 27 de agosto de 2021. Archivado desde el original el 12 de septiembre de 2021 . Consultado el 12 de septiembre de 2021 – a través de GitHub.com .
^ abc "LICENSE.TXT", llvm.org , LLVM Developer Group, archivado del original el 11 de noviembre de 2020 , consultado el 24 de septiembre de 2019
^ abc "Política para desarrolladores de LLVM", llvm.org , LLVM Developer Group, § Copyright, License, and Patents, archivado desde el original el 13 de noviembre de 2012 , consultado el 12 de septiembre de 2021
^ Christopher, Eric (3 de julio de 2008). "Simplemente me pregunto la pronunciación de Clang". LLVMdev (Lista de correo) . Consultado el 22 de septiembre de 2015 .
^ "Compatibilidad con OpenMP". Blog del proyecto LLVM . 22 de mayo de 2015. Archivado desde el original el 26 de marzo de 2016. Consultado el 28 de marzo de 2016 .
^ "Interfaz de computación heterogénea de C++ para portabilidad". GitHub . Archivado desde el original el 27 de junio de 2020 . Consultado el 18 de febrero de 2020 .
^ "Extensiones del lenguaje Clang". Archivado desde el 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 ofrecer compatibilidad con una amplia gama de extensiones GCC .
^ ab Clang - Características y objetivos: compatibilidad con GCC, 15 de abril de 2013, archivado desde el original el 27 de abril de 2018 , consultado el 30 de abril de 2018
^ "Analizador estático de Clang". LLVM. Archivado desde el original el 30 de abril de 2018. Consultado el 3 de septiembre de 2009 .
^ "Cómo involucrarse con el Proyecto Clang", clang.llvm.org , LLVM Developer Group, archivado del original el 27 de abril de 2018 , consultado 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.
^ ab "Compatibilidad con C++ y C++'0x en Clang". LLVM. Archivado desde el original el 4 de julio de 2013. Consultado el 12 de marzo de 2023 .
^ "Notas de la versión de Clang 17.0.1". LLVM . Consultado el 25 de octubre de 2023 .
^ Treat, Adam (19 de febrero de 2005). "mkspecs y parches para la compilación LLVM de Qt4". Qt4-preview-feedback (lista de correo). Archivado desde el original el 4 de octubre de 2011.
^ 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. Consultado el 30 de abril de 2018 .
^ Zadeck, Kenneth (19 de noviembre de 2005). "Re: Propuesta de integración LLVM/GCC". Desarrollo de GCC (Lista de correo). Archivado desde el original el 10 de marzo de 2016 . Consultado el 25 de julio de 2016 .
^ ab Naroff, Steve (25 de mayo de 2007). New LLVM C Front-end (Slides) ( Nuevo front-end de LLVM C (diapositivas)) . Reunión de desarrolladores de LLVM. Archivado (PDF) del original el 3 de abril de 2019. Consultado el 30 de abril de 2018 .
^ Lattner, Chris (11 de julio de 2007). «Nuevo front-end de LLVM C: "clang"». cfe-dev (Lista de correo). Archivado desde el original el 26 de marzo de 2020. Consultado el 26 de marzo de 2020 .
^ ab Clang team, clang: una interfaz de usuario de la familia de lenguajes C para LLVM Archivado el 12 de noviembre de 2017 en Wayback Machine
^ "Clang: Utilidad y aplicaciones: arquitectura basada en bibliotecas". Archivado desde el original el 27 de abril de 2018 . Consultado el 30 de abril de 2018 .
^ "FLANG: NVIDIA incorpora Fortran a LLVM". Archivado desde el original el 20 de mayo de 2017 . Consultado el 18 de mayo de 2017 .
^ "Bienvenido a la documentación de Flang: el compilador de Flang".
^ Clang se puede utilizar a menudo como un reemplazo directo de GCC, mayo de 2020, archivado del original el 8 de mayo de 2020 , consultado el 9 de mayo de 2020
^ Clang - Características y objetivos: compilaciones rápidas y bajo uso de memoria, octubre de 2007, archivado desde el original el 27 de abril de 2018 , consultado el 30 de abril de 2018
^ abc Simonis, Volker (10 de febrero de 2011). "Compiling the HotSpot VM with Clang". Archivado desde el original el 18 de febrero de 2011. Consultado 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 es inferior al de una versión reciente de GCC.
^ "Benchmarking de LLVM y Clang contra GCC 4.5". Phoronix . 21 de abril de 2010. Archivado desde el 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 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
^ ab "GCC 4.9 VS. LLVM Clang 3.5 Linux Compiler Benchmarks". OpenBenchmarking.org. 14 de abril de 2014. Archivado desde el original el 23 de octubre de 2017. Consultado el 25 de junio de 2014 .
^ de Michael Larabel (23 de diciembre de 2019). «LLVM Clang alcanza un rendimiento de aproximadamente el 96 % de GCC en Intel Ice Lake». Archivado desde el original el 15 de enero de 2021. Consultado el 14 de enero de 2021 .
^ "Clang vs GCC: ¿cuál produce mejores binarios?". stackoverflow.com . Archivado desde el original el 1 de junio de 2017 . Consultado el 1 de octubre de 2018 .
^ Michael Larabel (11 de mayo de 2023). «Rendimiento del compilador LLVM Clang 16 frente a GCC 13 en Intel Raptor Lake» . Consultado el 24 de abril de 2024 .
^ Divacky, Roman (25 de febrero de 2009). «[Anuncio] clang/llvm puede compilar el kernel de FreeBSD en i386/amd64». Archivado desde el original el 1 de mayo de 2018. Consultado el 30 de abril de 2018 .
^ Construyendo FreeBSD con Clang, Wiki.freebsd.org, 24 de agosto de 2012, archivado desde el original el 30 de abril de 2018 , consultado el 18 de septiembre de 2012
^ Hornung, Alex. «llvm/clang once more». Archivado desde el original el 30 de abril de 2018. Consultado el 30 de abril de 2018 .
^ Clang, DragonFly BSD, archivado desde el original el 30 de abril de 2018 , consultado el 18 de septiembre de 2012
^ "Clang puede compilar LLVM y Clang". Blog del proyecto LLVM. 24 de diciembre de 2009. Archivado desde el original el 26 de abril de 2012. Consultado el 31 de diciembre de 2009 .
^ "Clang se autoaloja con éxito". Blog del proyecto LLVM. 4 de febrero de 2010. Archivado desde el original el 26 de abril de 2012. Consultado el 5 de febrero de 2010 .
^ Gregor, Doug (20 de mayo de 2010). "Clang++ Builds Boost!". Blog del proyecto LLVM. Archivado desde el original el 26 de abril de 2012. Consultado el 21 de mayo de 2010 .
^ Davis, Brad. «FreeBSD Status Reports April–June, 2010». Archivado desde el original el 24 de junio de 2018. Consultado el 30 de abril de 2018 .
^ Clang crea un kernel Linux funcional (arranca en RL5 con SMP, redes y X, hosts propios), Lists.cs.uiuc.edu, archivado desde el original el 7 de septiembre de 2015 , consultado el 18 de septiembre de 2012
^ Gregor, Douglas (26 de enero de 2011). "New C++0x feature support in Clang" (Lista de correo). Archivado desde el original el 30 de enero de 2011 . Consultado el 29 de enero de 2011 .
^ Sonnenberger, Jörg (19 de enero de 2012). «Estado de NetBSD y LLVM». Archivado desde el original el 21 de septiembre de 2016. Consultado el 26 de febrero de 2014 .
^ Ledru, Sylvestre. «Reconstrucción del archivo de Debian con clang». Archivado desde el original el 1 de mayo de 2018. Consultado el 30 de abril de 2018 .
^ "Sitio web oficial de Minix 3: Noticias". Archivado desde el original el 17 de diciembre de 2009. Consultado el 7 de diciembre de 2012 .
^ Gerzo, Daniel (12 de mayo de 2012). «FreeBSD Quarterly Status Report January–March, 2012» (Lista de correo). Archivado desde el original el 18 de febrero de 2018 . Consultado el 14 de mayo de 2012 .
^ Davis, Brooks (5 de noviembre de 2012). "Atención: Clang ahora es el valor predeterminado en x86" (Lista de correo). Archivado desde el original el 30 de abril de 2018. Consultado el 7 de noviembre de 2012 .
^ Webster, Behan (18 de febrero de 2013). «LLVMLinux: Compiling Android with LLVM» (PDF) . Archivado desde el original (PDF) el 12 de mayo de 2014. Consultado el 11 de mayo de 2013 .
^ Tinti, Vinicius (17 de marzo de 2013). «LLVMLinux: Nexus 7». Archivado desde el original el 11 de junio de 2014. Consultado el 11 de mayo de 2013 .
^ Du Toit, Stefanus. "¡Clang ya tiene todas las características de C++11 disponibles! ". Archivado desde el original el 24 de septiembre de 2019. Consultado el 20 de abril de 2013 .
^ "[llvm-project] Revisión 194194". Archivado desde el original el 18 de noviembre de 2018 . Consultado el 30 de abril de 2018 .
^ Ledru, Sylvestre. «Reconstrucción de Debian usando Clang 3.5.0». Archivado desde el original el 1 de mayo de 2018. Consultado el 30 de abril de 2018 .
^ "Historial de revisiones del NDK | Desarrolladores de Android". developer.android.com . Archivado desde el original el 6 de marzo de 2018. Consultado el 6 de marzo de 2018 .
^ "Historial de revisiones del NDK | Android NDK | Desarrolladores de Android". Desarrolladores de Android . Archivado desde el original el 5 de abril de 2019. Consultado el 30 de abril de 2018 .
^ Nagy, Robert (26 de julio de 2017). «Cambie el compilador predeterminado en amd64 e i386 a clang» (Lista de correo). Archivado desde el original el 25 de octubre de 2018. Consultado el 30 de septiembre de 2017 .
^ Kettenis, Mark (19 de enero de 2018). «Cambie el compilador predeterminado en armv7 a clang» (Lista de correo). Archivado desde el original el 8 de abril de 2022. Consultado el 27 de agosto de 2020 .
^ "Clang se utiliza ahora para crear Chrome para Windows". blog.llvm.org . 5 de marzo de 2018. Archivado desde el original el 5 de marzo de 2018 . Consultado el 7 de abril de 2018 .
^ "Firefox Beta 63.0beta, ver todas las nuevas funciones, actualizaciones y correcciones". www.mozilla.org . Archivado desde el original el 19 de abril de 2021 . Consultado el 18 de marzo de 2020 .
^ Hankala, Visa (1 de julio de 2019). «Cambie el compilador predeterminado de Octeon a Clang» (Lista de correo). Archivado desde el original el 8 de abril de 2022. Consultado el 27 de agosto de 2020 .
^ "LLVM 9 se lanza con soporte oficial para RISC-V Target, Asm Goto, Clang 9 y más". riscv.org . 26 de septiembre de 2019. Archivado desde el original el 28 de diciembre de 2019 . Consultado el 26 de septiembre de 2019 .
^ "FreeBSD svn commit r358454". 29 de febrero de 2020. Archivado desde el original el 10 de marzo de 2020. Consultado el 7 de marzo de 2020 .
^ Kettenis, Mark (2 de abril de 2020). «Cambie el compilador predeterminado en PowerPC a Clang» (Lista de correo). Archivado desde el original el 8 de abril de 2022. Consultado el 27 de agosto de 2020 .
^ Hankala, Visa (21 de diciembre de 2020). «Hacer que clang sea el compilador predeterminado en loongson» (Lista de correo). Archivado desde el original el 13 de enero de 2021. Consultado el 1 de enero de 2021 .