Clang / k l æ ŋ / [5] es un extremo frontal compilador para el C , C ++ , Objective-C y Objective-C ++ lenguajes de programación , así como la OpenMP , [6] OpenCL , RenderScript , CUDA y HIP [7 ] marcos. Utiliza la infraestructura del compilador LLVM como su back-end y ha sido parte del ciclo de lanzamiento de LLVM desde LLVM 2.6.
Autor (es) original (es) | Chris Lattner |
---|---|
Desarrollador (es) | Grupo de desarrolladores LLVM |
Versión inicial | 26 de septiembre de 2007 [1] |
Lanzamiento estable | 12.0.0 [2] / 14 de abril de 2021 |
Repositorio | |
Escrito en | C ++ |
Sistema operativo | Tipo Unix |
Plataforma | LLVM ( ARMv7 , AArch64 , IA-32 , x64 , ppc64le ) [3] |
Tipo | Compilador |
Licencia |
|
Sitio web | clang |
Está diseñado para actuar como un reemplazo directo de GNU Compiler Collection (GCC), y es compatible con la mayoría de sus indicadores de compilación y extensiones de lenguaje no oficiales. [8] [9] Entre sus colaboradores se encuentran Apple , Microsoft , Google , ARM , Sony , Intel y Advanced Micro Devices (AMD). Es un software de código abierto , [10] con el código fuente publicado bajo la licencia de la Universidad de Illinois / NCSA , una licencia de software libre permisiva . Desde v9.0.0, se volvió a obtener la licencia de Apache License 2.0 con excepciones LLVM. [4]
Clang 12, la última versión principal de Clang en abril de 2021, 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 agrega soporte inicial para el próximo estándar C ++ 23 . [11] Desde v6.0.0, Clang compila C ++ usando el dialecto GNU ++ 14 por defecto, que incluye características del estándar C ++ 14 y extensiones GNU conformes. [12]
El proyecto Clang incluye la interfaz Clang , un analizador estático y varias herramientas de análisis de código. [13]
Fondo
A partir de 2005, Apple Inc. hizo un uso extensivo de LLVM en varios productos comerciales, [14] incluidos iOS SDK y Xcode 3.1.
Uno de los primeros usos de LLVM fue un compilador de código OpenGL para OS X que convierte las llamadas OpenGL en llamadas más fundamentales para unidades de procesamiento de gráficos (GPU) que no admiten ciertas funciones. Esto permitió a Apple admitir OpenGL en computadoras que usan chipsets Intel Graphics Media Accelerator (GMA), aumentando el rendimiento en esas máquinas. [15] Para las GPU que lo admiten, el código se compila para explotar por completo el hardware subyacente, pero en las máquinas GMA, LLVM compila el mismo código OpenGL en subrutinas para garantizar un funcionamiento adecuado continuo.
La intención original de LLVM era utilizar la interfaz de GCC, pero resultó que GCC causó algunos problemas a los desarrolladores de LLVM y de Apple. El código fuente de GCC es un sistema grande y algo engorroso para que los desarrolladores trabajen con él; como lo expresó un desarrollador de GCC desde hace mucho tiempo refiriéndose a LLVM, "Tratar de hacer bailar al hipopótamo no es realmente muy divertido". [dieciséis]
El software de Apple hace un uso intensivo de Objective-C, pero el front-end de Objective-C en GCC es una prioridad baja para los desarrolladores de GCC. Además, GCC no se integra sin problemas en el entorno de desarrollo integrado (IDE) de Apple . [17] Finalmente, GCC tiene licencia bajo los términos de la Licencia Pública General GNU (GPL) versión 3 , que requiere que los desarrolladores que distribuyen extensiones o versiones modificadas de GCC pongan a disposición su código fuente , mientras que LLVM tiene un código BSD. licencia [18] que no tiene tal requisito.
Apple eligió desarrollar una nueva interfaz de compilador desde cero, compatible con C, Objective-C y C ++. [17] Este proyecto "clang" fue de código abierto en julio de 2007. [19]
Diseño
Clang está diseñado para funcionar sobre LLVM. [18] La combinación de Clang y LLVM proporciona la mayor parte de la cadena de herramientas , para permitir reemplazar la pila GCC completa . Debido a que está construido con un diseño basado en bibliotecas, como el resto de LLVM, Clang es fácil de integrar en otras aplicaciones. Esta es una de las razones por las que la mayoría de las implementaciones de OpenCL se crean con Clang y LLVM. [ cita requerida ]
Uno de los principales objetivos de Clang es proporcionar una arquitectura basada en bibliotecas, [20] para permitir que el compilador esté más estrechamente vinculado a herramientas que interactúan con el código fuente, como una interfaz gráfica de usuario (GUI) de entorno de desarrollo integrado (IDE ). Por el contrario, el CCG está diseñado para el trabajo de compilación en un enlace - depuración del flujo de trabajo, y su integración con otras herramientas no siempre es fácil. Por ejemplo, GCC usa 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 al código fuente original. Si se encuentra un error durante o después del paso de plegado, puede ser difícil traducirlo a una ubicación en la fuente original. Además, los proveedores que utilizan la pila GCC dentro de los IDE utilizan herramientas independientes para indexar el código y proporcionar funciones como el resaltado de sintaxis y el autocompletado .
Clang está diseñado para retener más información durante el proceso de compilación que GCC y para preservar la forma general del código original. El objetivo de esto es facilitar la asignación de errores a la fuente original. Los informes de error que ofrece Clang también están destinados a ser más detallados y específicos, además de legibles por máquina, de modo que los IDE puedan indexar la salida del compilador durante la compilación. El diseño modular del compilador puede ofrecer indexación de código fuente , verificación de sintaxis y otras características 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 automática de código , ya que representa directamente el código fuente original.
Clang compila solo lenguajes similares a C, como C, C ++, Objective-C, Objective-C ++, OpenCL, CUDA y HIP. Para otros lenguajes, como Ada , LLVM sigue dependiendo de GCC u otra interfaz del compilador. En muchos casos, Clang se puede usar o cambiar por GCC según sea necesario, sin otros efectos en la cadena de herramientas en su conjunto. [ cita requerida ] Es compatible con la mayoría de las opciones de GCC de uso común. Un subproyecto Flang de Nvidia y The Portland Group agregó soporte para Fortran . [21]
Rendimiento y compatibilidad con GCC
Clang está diseñado para ser altamente compatible con GCC. [9] La interfaz de línea de comandos de Clang es similar y comparte muchos indicadores y opciones con GCC. Clang implementa muchas extensiones de lenguaje GNU y las habilita de forma predeterminada. Clang implementa muchos elementos intrínsecos del compilador GCC simplemente por compatibilidad. Por ejemplo, a pesar de que Clang implementos intrínsecos atómicas que se corresponden exactamente con C11 atómicas , sino que también pone en práctica de GCC __sync_*
intrínsecos para la compatibilidad con GCC y libstdc ++ . Clang también mantiene la compatibilidad ABI con el código objeto generado por GCC . En la práctica, Clang se puede utilizar a menudo como un reemplazo directo de GCC. [22]
Los desarrolladores de Clang tienen como objetivo reducir la huella de memoria y aumentar la velocidad de compilación en comparación con compiladores de la competencia, como GCC. En octubre de 2007, informan que Clang compiló las bibliotecas de Carbon más del doble de rápido que GCC, mientras usaba aproximadamente una sexta parte de la memoria y el espacio en disco de GCC. [23] Para 2011, Clang parece conservar esta ventaja en el rendimiento del compilador. [24] [25] A mediados de 2014, Clang aún se compila de manera consistente más rápido que GCC en un tiempo de compilación mixto y un punto de referencia de rendimiento del programa. [26] Sin embargo, para 2019, Clang es significativamente más lento en la compilación del Kernel de Linux que GCC mientras se mantiene un poco más rápido en la compilación de LLVM. [27]
Si bien Clang ha sido históricamente más rápido que GCC en la compilación, la calidad de salida se ha quedado atrás. A partir de 2014, el rendimiento de los programas compilados por Clang se quedó atrás del rendimiento del programa compilado por GCC, a veces por factores importantes (hasta 5.5x), [26] replicando informes anteriores de rendimiento más lento. [24] Ambos compiladores han evolucionado para aumentar su rendimiento desde entonces, y la brecha se ha reducido:
- Las comparaciones en noviembre de 2016 entre GCC 4.8.2 versus clang 3.4, en un gran número de archivos de prueba, muestran que GCC supera al clang en aproximadamente un 17% en el 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 tales diferencias. Por tanto, los dos compiladores parecen comparables en términos generales. [28] [ fuente no confiable ]
- Las comparaciones 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 22 y perdiendo 19 de ellos). [27]
En 2021 se realizó un punto de referencia para comparar el rendimiento y los tiempos de compilación de LLVM 2.7 frente a LLVM 11. La conclusión fue que LLVM 11 tiende a tardar 2 veces más en compilar código con optimizaciones y, como resultado, produce un código que se ejecuta entre un 10 y un 20% más rápido (con valores atípicos ocasionales en cualquier dirección), en comparación con LLVM 2.7, que tiene más de 10 años. [29]
Historial de estado
Esta tabla presenta solo los pasos y lanzamientos importantes en la historia de Clang.
Fecha | Reflejos |
---|---|
11 de julio de 2007 | La interfaz de Clang se lanzó bajo licencia de código abierto |
25 de febrero de 2009 | Clang / LLVM puede compilar un kernel FreeBSD que funcione . [30] [31] |
16 de marzo de 2009 | Clang / LLVM puede compilar un kernel DragonFly BSD que funcione . [32] [33] |
23 de octubre de 2009 | Lanzamiento de 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 está incompleto. Clang C ++ puede analizar GCC 4.2 libstdc ++ y generar código de trabajo para programas no triviales, [18] y puede compilarse a sí mismo. [34] |
2 de febrero de 2010 | Tañido autoalojamiento . [35] |
20 de mayo de 2010 | La última versión de Clang construyó las bibliotecas de Boost C ++ con éxito y pasó casi todas las pruebas. [36] |
10 de junio de 2010 | Clang / LLVM se convierte en parte integral de FreeBSD , pero el compilador predeterminado sigue siendo GCC. [37] |
25 de octubre de 2010 | Clang / LLVM puede compilar un kernel de Linux modificado que funcione . [38] |
Enero de 2011 | Se completó el trabajo preliminar para admitir el borrador del estándar C ++ 0x , con algunas de las nuevas características del borrador admitidas en la versión de desarrollo de Clang. [39] [11] |
10 de febrero de 2011 | Clang puede compilar una máquina virtual Java HotSpot que funcione . [24] |
19 de enero de 2012 | Clang se convierte en un componente opcional en el sistema de construcción multiplataforma de NetBSD , pero GCC sigue siendo el predeterminado. [40] |
29 de febrero de 2012 | Clang 3.0 puede reconstruir el 91,2% del archivo Debian . [41] |
29 de febrero de 2012 | Clang se convierte en el compilador predeterminado en MINIX 3 [42] |
12 de mayo de 2012 | Se anunció que Clang / LLVM reemplazará a GCC en FreeBSD . [43] |
5 de noviembre de 2012 | Clang se convierte en el compilador predeterminado en FreeBSD 10.x en amd64 / i386. [44] |
18 de febrero de 2013 | Clang / LLVM puede compilar un kernel de Linux de Android modificado que funcione para Nexus 7 . [45] [46] |
19 de abril de 2013 | Clang es una característica completa de C ++ 11 . [47] |
6 de noviembre de 2013 | Clang es una característica completa de C ++ 14 . [48] |
11 de septiembre de 2014 | Clang 3.5 puede reconstruir el 94,3% del archivo Debian. El porcentaje de fallas se ha reducido en un 1,2% por versión desde enero de 2013, principalmente debido a una mayor compatibilidad con las banderas GCC. [49] |
Octubre de 2016 | Clang se convierte en el compilador predeterminado para Android [50] (y, posteriormente, solo en el compilador compatible con Android NDK [51] ). |
13 de marzo de 2017 | Tañido 4.0.0 liberada |
26 de julio de 2017 | Clang se convierte en el compilador predeterminado en OpenBSD 6.2 en amd64 / i386. [52] |
7 de septiembre de 2017 | Tañido 5.0.0 liberada |
19 de enero de 2018 | Clang se convierte en el compilador predeterminado en OpenBSD 6.3 en arm. [53] |
5 de marzo de 2018 | Clang ahora se usa para construir Google Chrome para Windows. [54] |
8 de marzo de 2018 | Tañido 6.0.0 liberada |
5 de septiembre de 2018 | Clang ahora se usa para construir Firefox para Windows. [55] |
19 de septiembre de 2018 | Tañido 7.0.0 liberada |
20 de marzo de 2019 | Tañido 8.0.0 liberada |
1 de julio de 2019 | Clang se convierte en el compilador predeterminado en OpenBSD 6.6 en mips64. [56] |
19 de septiembre de 2019 | Clang 9.0.0 lanzado con soporte oficial de destino RISC-V . [57] |
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 . [58] |
24 marzo 2020 | 10.0.0 sonido metálico liberado |
2 de abril de 2020 | Clang se convierte en el compilador predeterminado en OpenBSD 6.7 en powerpc. [59] |
12 de octubre de 2020 | 11.0.0 sonido metálico liberado |
21 de diciembre de 2020 | Clang se convierte en el compilador predeterminado en OpenBSD 6.9 en mips64el. [60] |
14 de abril de 2021 | 12.0.0 sonido metálico liberado |
Ver también
- Compilador AMD Optimizing C / C ++
- LLDB
- Compilador de C portátil
Referencias
- ^ "Notas de la versión LLVM 2.1" .
- ^ "Descargar lanzamientos de LLVM" .
- ^ Página de descarga de LLVM
- ^ a b LICENSE.TXT , llvm.org , consultado el 24 de septiembre de 2019
- ^ 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 .
- ^ "Soporte OpenMP" . Blog del proyecto LLVM . Consultado el 28 de marzo de 2016 .
- ^ "Interfaz de computación heterogénea C ++ para portabilidad" . Consultado el 18 de febrero de 2020 .
- ^ "Extensiones de lenguaje Clang" . Consultado el 8 de noviembre de 2017 .
Además de las extensiones de idioma enumeradas aquí, Clang tiene como objetivo admitir una amplia gama de extensiones de GCC.
- ^ a b Clang - Funciones y objetivos: compatibilidad con GCC , 15 de abril de 2013
- ^ Instrucciones de "Introducción" de Clang , Clang.llvm.org , consultado el 18 de septiembre de 2012
- ^ a b "Compatibilidad con C ++ y C ++ '0x en Clang" . LLVM.
- ^ "Notas de la versión de Clang 6.0.0" . LLVM.
- ^ "Analizador de estática Clang" . LLVM . Consultado el 3 de septiembre de 2009 .
- ^ 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 LLVM .
- ^ Zadeck, Kenneth (19 de noviembre de 2005). "Re: propuesta de integración LLVM / GCC" . Desarrollo de GCC (lista de correo).
- ^ a b Naroff, Steve (25 de mayo de 2007). Nuevo Front-end LLVM C (Diapositivas) . Reunión de desarrolladores LLVM .
- ^ a b c Equipo de Clang, clang: una interfaz de familia de lenguajes C para LLVM
- ^ Lattner, Chris (11 de julio de 2007). "Nuevo front-end LLVM C:" clang " " . cfe-dev (lista de correo).
- ^ Clang: Utilidad y aplicaciones: arquitectura basada en bibliotecas
- ^ FLANG: NVIDIA trae Fortran a LLVM
- ^ Clang a menudo se puede usar como reemplazo directo de GCC , mayo de 2020
- ^ Clang - Funciones y objetivos: compilaciones rápidas y bajo uso de memoria , octubre de 2007
- ^ a b c Simonis, Volker (10 de febrero de 2011). "Compilación de HotSpot VM con Clang" . Archivado desde el original el 18 de febrero de 2011 . Consultado el 13 de febrero de 2011 .
Si bien la compatibilidad general de GCC es excelente y los tiempos de compilación son impresionantes, el rendimiento del código generado aún no se encuentra detrás de una versión reciente de GCC.
- ^ "Evaluación comparativa LLVM y Clang contra GCC 4.5" . Phoronix . 21 de abril de 2010 . Consultado el 13 de febrero de 2011 .
Los binarios de LLVM-GCC y Clang lucharon por competir con GCC 4.5.0 en el punto de referencia cronometrado de HMMer de una búsqueda de base de datos de Pfam. LLVM-GCC y Clang fueron aproximadamente un 23% más lentos (...) Aunque LLVM / Clang no es el campeón de rendimiento en este momento, ambos componentes continúan en un desarrollo muy activo y es de esperar que haya más noticias para informar en el próximo meses
- ^ a b "Puntos de referencia del compilador de Linux GCC 4.9 VS. LLVM Clang 3.5" . OpenBenchmarking.org. 14 de abril de 2014 . Consultado el 25 de junio de 2014 .
- ^ a b Michael Larabel (23 de diciembre de 2019). "LLVM Clang logra ~ 96% el rendimiento de GCC en Intel Ice Lake" .
- ^ "Clang vs GCC - ¿cuál produce mejores binarios?" . stackoverflow.com . Consultado el 1 de octubre de 2018 .[ fuente no confiable ]
- ^ https://gist.github.com/zeux/3ce4fcc3a43072b4315abde95319ecb6
- ^ Divacky, Roman. "[Anunciar] clang / llvm puede compilar arrancando el kernel de FreeBSD en i386 / amd64" .
- ^ Building FreeBSD with Clang , Wiki.freebsd.org, 24 de agosto de 2012 , consultado el 18 de septiembre de 2012
- ^ Hornung, Alex. "llvm / clang una vez más" .
- ^ Clang , DragonFly BSD , consultado el 18 de septiembre de 2012
- ^ "Clang puede compilar LLVM y Clang" . Blog del proyecto LLVM.
- ^ "Clang se autohospeda con éxito" . Blog del proyecto LLVM.
- ^ Gregor, Doug. "¡Clang ++ Builds Boost!" . Blog del proyecto LLVM.
- ^ Davis, Brad. "Informes de estado de FreeBSD de abril a junio de 2010" .
- ^ Clang construye un kernel de Linux funcional (Boots to RL5 con SMP, networking y X, self hosts) , 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). "Nuevo soporte de funciones C ++ 0x en 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 Debian con clang" .
- ^ "Sitio web oficial de Minix 3: Noticias" .
- ^ Gerzo, Daniel (12 de mayo de 2012). "Informe de estado trimestral de FreeBSD de enero a marzo de 2012" (lista de correo) . Consultado el 14 de mayo de 2012 .
- ^ Davis, Brooks (5 de noviembre de 2012). "Aviso: Clang ahora es el predeterminado en x86" (lista de correo) . Consultado el 7 de noviembre de 2012 .
- ^ Webster, Behan (18 de febrero de 2013). "LLVMLinux: compilando Android con LLVM" (PDF) . Consultado el 11 de mayo de 2013 .
- ^ Tinti, Vinicius (17 de marzo de 2013). "LLVMLinux: Nexus 7" . Consultado el 11 de mayo de 2013 .
- ^ Du Toit, Stefanus. "¡Clang es la característica de C ++ 11 completa a partir de * justo ahora *!" .
- ^ "[llvm-project] Revisión 194194" .
- ^ Ledru, Sylvestre. "Reconstrucción de Debian usando Clang 3.5.0" .
- ^ "Historial de revisiones del NDK | Desarrolladores de Android" . developer.android.com . Consultado el 6 de marzo de 2018 .
- ^ "Historial de revisiones del NDK | NDK de Android | Desarrolladores de Android" . Desarrolladores de Android . Consultado el 30 de abril de 2018 .
- ^ Nagy, Robert (26 de julio de 2017). "cambia el compilador predeterminado en amd64 e i386 a clang" (lista de correo) . 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) . Consultado el 27 de agosto de 2020 .
- ^ "Clang ahora se usa para construir Chrome para Windows" . blog.llvm.org . Consultado el 7 de abril de 2018 .
- ^ "Firefox Beta 63.0beta, vea todas las funciones nuevas, actualizaciones y correcciones" . www.mozilla.org . Consultado el 18 de marzo de 2020 .
- ^ Hankala, Visa (1 de julio de 2019). "Cambia el compilador predeterminado en octeon a clang" (lista de correo) . Consultado el 27 de agosto de 2020 .
- ^ "Lanzamientos de LLVM 9 con soporte oficial de destino RISC-V, Asm Goto, Clang 9 y más" . riscv.org . 26 de septiembre de 2019 . Consultado el 26 de septiembre de 2019 .
- ^ "FreeBSD svn commit r358454" .
- ^ Kettenis, Mark (2 de abril de 2020). "Cambie el compilador predeterminado en powerpc a clang" (lista de correo) . Consultado el 27 de agosto de 2020 .
- ^ Hankala, Visa (21 de diciembre de 2020). "Hacer clang el compilador predeterminado en loongson" (lista de correo) . Consultado el 1 de enero de 2021 .
enlaces externos
- Página web oficial