Clang - Clang

Sonido metálico
LLVM New Logo.png
Información de la versión de Clang 12.0.1 screenshot.png
Clang 12.0.1
Autor (es) original (es) Chris Lattner
Desarrollador (es) Grupo de desarrolladores LLVM
Versión inicial 26 de septiembre de 2007 ; hace 14 años ( 2007-09-26 )
Lanzamiento estable
13.0.0 / 4 de octubre de 2021 ; Hace 12 dias ( 04/10/2021 )
Versión de vista previa
13.0.0-rc2 / 27 de agosto de 2021 ; Hace 50 dias ( 27 de agosto de 2021 )
Repositorio
Escrito en C ++
Sistema operativo Tipo Unix
Plataforma AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Escribe Interfaz del compilador
Licencia Licencia Apache 2.0 con excepciones LLVM
Sitio web clang .llvm .org

Clang / k l æ ŋ / es un extremo frontal compilador para los C , C ++ , Objective-C , y Objective-C ++ lenguajes de programación , así como la OpenMP , OpenCL , renderScript , CUDA , y HIP marcos. Actúa como un reemplazo directo para la colección de compiladores de GNU (GCC), el apoyo a la mayoría de sus banderas de compilación y extensiones de lenguaje no oficiales. Incluye un analizador estático y varias herramientas de análisis de código.

Clang opera en conjunto con el back-end del compilador LLVM y ha sido un subproyecto de LLVM 2.6 y posteriores. Al igual que con LLVM, es un software gratuito y de código abierto bajo la licencia de software Apache License 2.0 . Entre sus contribuyentes se incluyen Apple , Microsoft , Google , ARM , Sony , Intel y AMD .

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 . 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.

Fondo

A partir de 2005, Apple Inc. inició un uso extensivo de LLVM en varios productos comerciales, 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 GMA , aumentando el rendimiento en esas máquinas.

El proyecto LLVM originalmente tenía la intención de utilizar la interfaz de GCC . El código fuente de GCC, sin embargo, es grande y algo engorroso; 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". Además, el software de Apple usa Objective-C , que es de baja prioridad para los desarrolladores de GCC. Como tal, GCC no se integra sin problemas en el entorno de desarrollo integrado (IDE) de Apple . Finalmente, el acuerdo de licencia de GCC, la GNU General Public License (GPL) versión 3 , requiere 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 carece de tal impedimento.

Al final, Apple optó por desarrollar Clang, una nueva interfaz de compilador compatible con C, Objective-C y C ++. En julio de 2007, el proyecto recibió la aprobación para convertirse en código abierto.

Diseño

Clang trabaja en conjunto con LLVM. 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, 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 trabaja en una de compilación enlace - depuración del flujo de trabajo; integrarlo 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 usan la pila GCC dentro de los IDE deben usar herramientas separadas para indexar el código, para proporcionar características 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 error 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 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 y Objective-C ++. En muchos casos, Clang puede reemplazar GCC según sea necesario, sin otros efectos en la cadena de herramientas en su conjunto. Es compatible con la mayoría de las opciones de GCC de uso común. El proyecto Flang de Nvidia y The Portland Group agrega compatibilidad con Fortran . Sin embargo, para otros lenguajes, como Ada , LLVM sigue dependiendo de GCC u otra interfaz del compilador.

Rendimiento y compatibilidad con GCC

Clang es compatible con GCC. Su interfaz de línea de comandos comparte muchos de los indicadores y opciones de GCC . Clang implementa muchas extensiones de lenguaje GNU e intrínsecos del compilador, algunos de los cuales son puramente 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 es un reemplazo directo de GCC.

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. Para 2011, Clang parece conservar esta ventaja en el rendimiento del compilador. 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. Sin embargo, para 2019, Clang es significativamente más lento en la compilación del kernel de Linux que GCC, mientras que se mantiene un poco más rápido en la compilación de LLVM.

Si bien Clang históricamente ha sido 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 retrasó con respecto al rendimiento del programa compilado por GCC, a veces por factores importantes (hasta 5.5x), replicando informes anteriores de rendimiento más lento. 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 en general comparables.
  • 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).

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 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.

Historial de estado

Esta tabla presenta solo los pasos y lanzamientos importantes en el historial de Clang.

Fecha Reflejos
11 de julio de 2007 Interfaz de Clang lanzada bajo licencia de código abierto
25 de febrero de 2009 Clang / LLVM puede compilar un kernel FreeBSD que funcione .
16 de marzo de 2009 Clang / LLVM puede compilar un kernel DragonFly BSD que funcione .
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, y puede compilarse a sí mismo.
2 de febrero de 2010 Tañido autoalojamiento .
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.
10 de junio de 2010 Clang / LLVM se convierte en parte integral de FreeBSD , pero el compilador predeterminado sigue siendo GCC.
25 de octubre de 2010 Clang / LLVM puede compilar un kernel de Linux modificado que funcione .
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.
10 de febrero de 2011 Clang puede compilar una máquina virtual Java HotSpot que funcione .
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.
29 de febrero de 2012 Clang 3.0 puede reconstruir el 91,2% del archivo Debian .
29 de febrero de 2012 Clang se convierte en el compilador predeterminado en MINIX 3
12 de mayo de 2012 Se anunció que Clang / LLVM reemplazará a GCC en FreeBSD .
5 de noviembre de 2012 Clang se convierte en el compilador predeterminado en FreeBSD 10.x en amd64 / i386.
18 de febrero de 2013 Clang / LLVM puede compilar un kernel de Linux de Android modificado que funcione para Nexus 7 .
19 de abril de 2013 Clang es una característica completa de C ++ 11 .
6 de noviembre de 2013 Clang es una característica completa de C ++ 14 .
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.
Octubre de 2016 Clang se convierte en el compilador predeterminado para Android (y luego solo en el compilador compatible con Android NDK ).
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.
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.
5 de marzo de 2018 Clang ahora se usa para construir Google Chrome para Windows.
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.
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.
19 de septiembre de 2019 Clang 9.0.0 lanzado con soporte oficial de destino RISC-V .
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 .
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.
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.
14 de abril de 2021 12.0.0 sonido metálico liberado

Ver también

Referencias

enlaces externos