Clang

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

Clang es una interfaz de compilación para los lenguajes de programación C, C++, Objective-C y Objective-C++, así como para los marcos OpenMP, OpenCL, RenderScript, CUDA y HIP. Actúa como un reemplazo directo de GNU Compiler Collection (GCC), y admite la mayoría de sus banderas de compilación y extensiones de idioma 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 versiones posteriores. Al igual que con LLVM, es un software gratuito y de código abierto bajo la licencia de software Apache License 2.0. Sus colaboradores incluyen Apple, Microsoft, Google, ARM, Sony, Intel y AMD.

Clang 14, la última versión principal de Clang a partir de marzo de 2022, tiene soporte completo para todos los estándares C++ publicados hasta C++17, implementa la mayoría de las funciones de C++20 y tiene soporte inicial para el próximo estándar C++23. Desde v6.0.0, Clang compila C++ utilizando el dialecto GNU++14 de forma predeterminada, que incluye características del estándar C++14 y extensiones GNU conformes.

Fondo

A partir de 2005, Apple Inc. comenzó a utilizar LLVM de forma extensiva 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 conjuntos de chips Intel GMA, lo que aumentó el rendimiento en esas máquinas.

El proyecto LLVM originalmente tenía la intención de usar el front-end de GCC. El código fuente de GCC, sin embargo, es grande y algo engorroso; como dijo un desarrollador de GCC desde hace mucho tiempo refiriéndose a LLVM, "Tratar de hacer que el hipopótamo baile 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 Licencia pública general de GNU (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 dicho impedimento.

Al final, Apple optó por desarrollar Clang, una nueva interfaz de compilación 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 funciona 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 funciona en un flujo de trabajo de compilación, enlace y depuración; integrarlo con otras herramientas no siempre es fácil. Por ejemplo, GCC usa un paso llamado foldeso 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 plegado, puede ser difícil volver a 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 funciones como resaltado de sintaxis y finalización de código inteligente.

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 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 de código automatizada, 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 comúnmente utilizadas. El proyecto Flang de Nvidia y The Portland Group agrega soporte para Fortran. Sin embargo, para otros lenguajes, como Ada, LLVM sigue dependiendo de GCC u otro front-end del compilador.

Rendimiento y compatibilidad con GCC

Clang es compatible con GCC. Su interfaz de línea de comandos comparte muchas de las banderas y opciones de GCC. Clang implementa muchas extensiones del lenguaje GNU e intrínsecos del compilador, algunos de los cuales son puramente por compatibilidad. Por ejemplo, aunque Clang implementa intrínsecos atómicos que se corresponden exactamente con los atómicos C11, también implementa los __sync_*intrínsecos de GCC para 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 el consumo de memoria y aumentar la velocidad de compilación en comparación con los compiladores de la competencia, como GCC. En octubre de 2007, informaron 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 todavía compila constantemente más rápido que GCC en un punto de referencia mixto de tiempo de compilación y rendimiento del programa. Sin embargo, para 2019, Clang es significativamente más lento para compilar el kernel de Linux que GCC, mientras que sigue siendo un poco más rápido para compilar 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 quedó rezagado 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 y clang 3.4, en un gran 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 son específicos del código y el código fuente C no optimizado puede revertir tales diferencias. Los dos compiladores, por lo tanto, parecen ampliamente comparables.
  • Las comparaciones en 2019 en Intel Ice Lake han demostrado que los programas generados por Clang 10 han logrado un 96 % del rendimiento de GCC 10 en 41 puntos de referencia diferentes (ganando 22 y perdiendo 19 de ellos).

Interfaz

libclangproporciona una interfaz C, proporcionando una API relativamente pequeña. La funcionalidad expuesta incluye: analizar el código fuente en un AST, cargar AST, atravesar 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.

FechaReflejos
11 de julio de 2007Frontend de Clang lanzado bajo licencia de código abierto
25 de febrero de 2009Clang/LLVM puede compilar un kernel de FreeBSD en funcionamiento.
16 de marzo de 2009Clang/LLVM puede compilar un núcleo DragonFly BSD en funcionamiento.
23 de octubre de 2009Lanzamiento de Clang 1.0, con LLVM 2.6 por primera vez.
diciembre 2009La 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 febrero 2010Clang alojamiento propio.
20 de mayo de 2010La última versión de Clang creó las bibliotecas de Boost C++ con éxito y pasó casi todas las pruebas.
10 de junio de 2010Clang/LLVM se convierte en parte integral de FreeBSD, pero el compilador predeterminado sigue siendo GCC.
25 de octubre de 2010Clang/LLVM puede compilar un kernel de Linux modificado que funcione.
enero 2011Se completó el trabajo preliminar para respaldar 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 febrero 2011Clang puede compilar una máquina virtual HotSpot Java en funcionamiento.
19 de enero de 2012Clang se convierte en un componente opcional en el sistema de compilación multiplataforma de NetBSD, pero GCC sigue siendo el predeterminado.
29 febrero 2012Clang 3.0 puede reconstruir el 91,2 % del archivo de Debian.
29 febrero 2012Clang se convierte en compilador predeterminado en MINIX 3
12 de mayo de 2012Clang/LLVM anunció que reemplazará a GCC en FreeBSD.
5 de noviembre de 2012Clang se convierte en el compilador predeterminado en FreeBSD 10.x en amd64/i386.
18 febrero 2013Clang/LLVM puede compilar un Kernel Linux de Android modificado que funcione para Nexus 7.
19 de abril de 2013Clang es la característica completa de C++11.
6 de noviembre de 2013Clang es la característica completa de C++14.
11 de septiembre de 2014Clang 3.5 puede reconstruir el 94,3% del archivo de Debian. El porcentaje de errores se ha reducido en un 1,2 % por versión desde enero de 2013, principalmente debido a una mayor compatibilidad con las banderas de GCC.
octubre 2016Clang se convierte en el compilador predeterminado para Android (y luego solo el compilador compatible con Android NDK).
13 marzo 2017Lanzamiento de Clang 4.0.0
26 julio 2017Clang se convierte en compilador predeterminado en OpenBSD 6.2 en amd64/i386.
7 septiembre 2017Lanzamiento de Clang 5.0.0
19 enero 2018Clang se convierte en el compilador predeterminado en OpenBSD 6.3 en arm.
5 de marzo de 2018Clang ahora se usa para compilar Google Chrome para Windows.
8 de marzo de 2018Lanzamiento de Clang 6.0.0
5 de septiembre de 2018Clang ahora se usa para compilar Firefox para Windows.
19 septiembre 2018Lanzamiento de Clang 7.0.0
20 de marzo de 2019Lanzamiento de Clang 8.0.0
1 julio 2019Clang se convierte en compilador predeterminado en OpenBSD 6.6 en mips64.
19 septiembre 2019Lanzamiento de Clang 9.0.0 con soporte oficial de destino RISC-V.
29 febrero 2020Clang se convierte en el único compilador de C en el sistema base de FreeBSD, con la eliminación de GCC.
24 de marzo de 2020Lanzamiento de Clang 10.0.0
2 abril 2020Clang se convierte en compilador predeterminado en OpenBSD 6.7 en powerpc.
12 octubre 2020Lanzamiento de Clang 11.0.0
21 diciembre 2020Clang se convierte en compilador predeterminado en OpenBSD 6.9 en mips64el.
14 abril 2021Lanzamiento de Clang 12.0.0
4 octubre 2021Lanzamiento de Clang 13.0.0
25 marzo 2022Lanzamiento de Clang 14.0.0
6 septiembre 2022Lanzamiento de Clang 15.0.0

Contenido relacionado

Código muerto

Miranda (lenguaje de programación)

Colección de compiladores GNU

GNU Compiler Collection es un compilador de optimización producido por el Proyecto GNU que admite varios lenguajes de programación, arquitecturas de...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save