stringtranslate.com

Sonido metálico

Clang ( / ˈ k l æ ŋ / ) [8] es una interfaz de compilación para los lenguajes de programación C , C++ , Objective-C y Objective-C++ , así como OpenMP , [9] OpenCL , RenderScript , CUDA , Marcos SYCL y HIP [10] . Actúa como un reemplazo directo de GNU Compiler Collection (GCC), y admite la mayoría de sus indicadores de compilación y extensiones de lenguaje no oficiales. [11] [12] Incluye un analizador estático y varias herramientas de análisis de código. [13]

Clang opera en conjunto con el backend del compilador LLVM y ha sido un subproyecto de LLVM 2.6 y posteriores. [14] Al igual que LLVM, es un software gratuito y de código abierto bajo la licencia de software Apache License 2.0 . [6] [7] 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 funciones de C++20 y tiene soporte inicial para el próximo estándar C++23. . [15] Desde v16.0.0, Clang compila C++ utilizando el dialecto GNU++17 de forma predeterminada, que incluye características del estándar C++17 y extensiones GNU conformes. [dieciséis]

Fondo

A partir de 2005, Apple Inc. comenzó a utilizar ampliamente LLVM en varios productos comerciales, [17] 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 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 usaban conjuntos de chips Intel GMA , aumentando el rendimiento en esas máquinas. [18]

El proyecto LLVM originalmente pretendía 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". [19] Además, el software de Apple utiliza Objective-C , que es de baja prioridad para los desarrolladores de GCC. Como tal, GCC no se integra fácilmente en el entorno de desarrollo integrado (IDE) de Apple. [20] Finalmente, el acuerdo de licencia de GCC, la Licencia Pública General GNU (GPL) versión 3 , requiere que los desarrolladores que distribuyen extensiones o versiones modificadas de GCC hagan que su código fuente esté disponible, pero la licencia de software permisiva de LLVM no requiere esto. [6] [7]

Al final, Apple decidió desarrollar Clang, un nuevo compilador que soporta C, Objective-C y C++. [20] En julio de 2007, el proyecto recibió la aprobación para convertirse en código abierto. [21]

Diseño

Clang trabaja en conjunto con LLVM. [22] 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, [23] para 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 utiliza un paso llamado plegar 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 no se parece al código fuente original. Si se encuentra un error durante o después del paso de plegado, puede resultar difícil volver a traducirlo a una ubicación en la fuente original. Además, los proveedores que utilizan la pila GCC dentro de los IDE deben utilizar herramientas independientes para indexar el código y 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 preserva 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 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 sólo 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 necesaria ] Es compatible con la mayoría de las opciones de GCC utilizadas comúnmente. Flang, un proyecto de Fortran, estaba en progreso en 2022. Sin embargo, para otros lenguajes, como Ada , LLVM sigue dependiendo de GCC u otra interfaz de compilador.

Flang - Fortran

El proyecto Flang de Nvidia y The Portland Group añade soporte para Fortran . [24] Flang es la interfaz Fortran de LLVM. A menudo se le conoce como "LLVM Flang" para diferenciarse del "Classic Flang": son dos compiladores de Fortran separados e independientes. "LLVM Flang" está en desarrollo activo. Las versiones de desarrollo de Flang estaban en progreso en octubre de 2023 y se podían descargar desde el Proyecto LLVM. [25]

Rendimiento y compatibilidad con GCC

Sonido metálico compilando htop

Clang es compatible con GCC. [12] Su interfaz de línea de comandos comparte muchas de las opciones 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 corresponden exactamente con los atómicos C11 , también implementa __sync_*los 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 sustituto directo de GCC. [26]

Los desarrolladores de Clang pretenden reducir el uso de memoria y aumentar la velocidad de compilación en comparación con compiladores de la competencia, como GCC. En octubre de 2007, informaron que Clang compiló las bibliotecas 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. [27] En 2011, Clang parecía conservar esta ventaja en el rendimiento del compilador. [28] [29] A mediados de 2014, Clang todavía compila consistentemente más rápido que GCC en un tiempo de compilación mixto y una prueba comparativa de rendimiento del programa. [30] Sin embargo, para 2019, Clang es significativamente más lento en la compilación del kernel de Linux que GCC, mientras que sigue siendo un poco más rápido en la compilación de LLVM. [31]

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 iba por detrás del rendimiento del programa compilado por GCC, a veces por factores importantes (hasta 5,5 veces), [30] replicando informes anteriores de un rendimiento más lento. [28] Ambos compiladores han evolucionado para aumentar su rendimiento desde entonces, y la brecha se ha reducido:

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 y asociar ubicaciones de origen con elementos dentro del AST.

Historial de estado

Esta tabla presenta solo pasos y lanzamientos importantes en la historia de Clang.

Ver también

Referencias

  1. ^ "Notas de la versión LLVM 2.1". llvm.org . Grupo de desarrolladores LLVM. 27 de septiembre de 2007. Archivado desde el original el 17 de noviembre de 2016 . Consultado el 30 de abril de 2018 .
  2. ^ "¡Lanzamiento de LLVM 17.0.6!" . Consultado el 28 de noviembre de 2023 .
  3. ^ "LLVM 17.0.6" . Consultado el 28 de noviembre de 2023 .
  4. ^ "LLVM 18.1.0-rc2".
  5. ^ "Lanzamientos". Repositorio llvm/llvm-project . Grupo de desarrolladores LLVM. 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 .
  6. ^ abc "LICENSE.TXT", llvm.org , LLVM Developer Group, archivado desde el original el 11 de noviembre de 2020 , consultado el 24 de septiembre de 2019
  7. ^ abc "LLVM Developer Policy", llvm.org , LLVM Developer Group, § Copyright, licencia y patentes, archivado desde el original el 13 de noviembre de 2012 , recuperado 12 de septiembre de 2021
  8. ^ 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 .
  9. ^ "Soporte 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 .
  10. ^ "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 .
  11. ^ "Extensiones de 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 idiomas enumeradas aquí, Clang pretende admitir una amplia gama de extensiones de GCC.
  12. ^ ab Clang - Características y objetivos: compatibilidad con GCC, 15 de abril de 2013, archivado desde el original el 27 de abril de 2018 , recuperado 30 de abril de 2018
  13. ^ "Analizador estático Clang". LVM. Archivado desde el original el 30 de abril de 2018 . Consultado el 3 de septiembre de 2009 .
  14. ^ "Involucrarse con el Proyecto Clang", clang.llvm.org , LLVM Developer Group, archivado desde el original el 27 de abril de 2018 , recuperado 18 de septiembre 2012 , Clang es un subproyecto del Proyecto LLVM, pero tiene su propio correo listas porque las comunidades tienen personas con intereses diferentes.
  15. ^ ab "Compatibilidad con C++ y C++'0x en Clang". LVM. Archivado desde el original el 4 de julio de 2013 . Consultado el 12 de marzo de 2023 .
  16. ^ "Notas de la versión de Clang 17.0.1". LLVM . Consultado el 25 de octubre de 2023 .
  17. ^ Trate, 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.
  18. ^ Lattner, Chris (25 de mayo de 2007). LLVM para OpenGL y otras cosas (Diapositivas) . Reunión de desarrolladores de LLVM. Archivado (PDF) desde el original el 8 de mayo de 2016 . Consultado el 30 de abril de 2018 .
  19. ^ Zadeck, Kenneth (19 de noviembre de 2005). "Re: Propuesta de integración LLVM/GCC". Desarrollo GCC (Lista de correo). Archivado desde el original el 10 de marzo de 2016 . Consultado el 25 de julio de 2016 .
  20. ^ ab Naroff, Steve (25 de mayo de 2007). "Nueva interfaz de usuario de LLVM C (diapositivas)" . Reunión de desarrolladores de LLVM. Archivado (PDF) desde el original el 3 de abril de 2019 . Consultado el 30 de abril de 2018 .
  21. ^ Lattner, Chris (11 de julio de 2007). "Nueva interfaz de usuario de LLVM C:" sonido metálico"". cfe-dev (lista de correo). Archivado desde el original el 26 de marzo de 2020 . Consultado el 26 de marzo de 2020 .
  22. ^ ab Clang team, clang: una interfaz de familia de lenguaje C para LLVM Archivado el 12 de noviembre de 2017 en Wayback Machine.
  23. ^ "Clang: utilidad y aplicaciones: arquitectura basada en biblioteca". Archivado desde el original el 27 de abril de 2018 . Consultado el 30 de abril de 2018 .
  24. ^ "FLANG: NVIDIA lleva Fortran a LLVM". Archivado desde el original el 20 de mayo de 2017 . Consultado el 18 de mayo de 2017 .
  25. ^ "Bienvenido a la documentación de Flang: el compilador de Flang".
  26. ^ Clang a menudo se puede utilizar como reemplazo directo de GCC, mayo de 2020, archivado desde el original el 8 de mayo de 2020 , recuperado 9 de mayo de 2020
  27. ^ Clang: características y objetivos: compilaciones rápidas y uso reducido de memoria, octubre de 2007, archivado desde el original el 27 de abril de 2018 , consultado el 30 de abril de 2018
  28. ^ abc 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 con GCC es excelente y los tiempos de compilación son impresionantes, el rendimiento del código generado aún es deficiente en comparación con una versión reciente de GCC.
  29. ^ "Evaluación comparativa de LLVM y Clang frente a GCC 4.5". Forónix . 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 punto de referencia cronometrado de HMMer de una búsqueda en la base de datos de Pfam. LLVM-GCC y Clang eran aproximadamente un 23% más lentos (...) Aunque LLVM/Clang no es el campeón de rendimiento en este momento, ambos componentes continúan en desarrollo muy activo y, con suerte, habrá más noticias que informar en el futuro. meses
  30. ^ ab "Parámetros de referencia del compilador de Linux GCC 4.9 VS. LLVM Clang 3.5". OpenBenchmarking.org. 14 de abril de 2014. Archivado desde el original el 23 de octubre de 2017 . Consultado el 25 de junio de 2014 .
  31. ^ ab Michael Larabel (23 de diciembre de 2019). "LLVM Clang logra ~96% del rendimiento de GCC en Intel Ice Lake". Archivado desde el original el 15 de enero de 2021 . Consultado el 14 de enero de 2021 .
  32. ^ "Clang vs GCC: ¿cuál produce mejores archivos binarios?". stackoverflow.com . Archivado desde el original el 1 de junio de 2017 . Consultado el 1 de octubre de 2018 .
  33. ^ Divacky, Roman (25 de febrero de 2009). "[Anuncio] clang/llvm puede compilar el kernel FreeBSD de arranque en i386/amd64". Archivado desde el original el 1 de mayo de 2018 . Consultado el 30 de abril de 2018 .
  34. ^ Construyendo FreeBSD con Clang, Wiki.freebsd.org, 24 de agosto de 2012, archivado desde el original el 30 de abril de 2018 , recuperado 18 de septiembre 2012
  35. ^ Hornung, Alex. "llvm/clang una vez más". Archivado desde el original el 30 de abril de 2018 . Consultado el 30 de abril de 2018 .
  36. ^ Clang, DragonFly BSD, archivado desde el original el 30 de abril de 2018 , recuperado 18 de septiembre 2012
  37. ^ "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 .
  38. ^ "Clang se autohospeda 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 .
  39. ^ Gregor, Doug (20 de mayo de 2010). "¡Clang ++ genera impulso!". Blog del proyecto LLVM. Archivado desde el original el 26 de abril de 2012 . Consultado el 21 de mayo de 2010 .
  40. ^ Davis, Brad. "Informes de estado de FreeBSD de abril a junio de 2010". Archivado desde el original el 24 de junio de 2018 . Consultado el 30 de abril de 2018 .
  41. ^ Clang crea un kernel de Linux que funciona (arranca en RL5 con SMP, redes y X, hosts propios), Lists.cs.uiuc.edu, archivado desde el original el 7 de septiembre de 2015 , recuperado 18 de septiembre 2012
  42. ^ Gregor, Douglas (26 de enero de 2011). "Compatibilidad con nuevas funciones de C++ 0x en Clang" (lista de correo). Archivado desde el original el 30 de enero de 2011 . Consultado el 29 de enero de 2011 .
  43. ^ 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 .
  44. ^ 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 .
  45. ^ "Sitio web oficial de Minix 3: Noticias". Archivado desde el original el 17 de diciembre de 2009 . Consultado el 7 de diciembre de 2012 .
  46. ^ Gerzo, Daniel (12 de mayo de 2012). "Informe de estado trimestral de FreeBSD de enero a marzo de 2012" (lista de correo). Archivado desde el original el 18 de febrero de 2018 . Consultado el 14 de mayo de 2012 .
  47. ^ Davis, Brooks (5 de noviembre de 2012). "Aviso: 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 .
  48. ^ Webster, Behan (18 de febrero de 2013). "LLVMLinux: Compilación de Android con LLVM" (PDF) . Archivado desde el original (PDF) el 12 de mayo de 2014 . Consultado el 11 de mayo de 2013 .
  49. 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 .
  50. ^ Du Toit, Stefanus. "¡Clang es la característica de C++ 11 completa a partir de *justo ahora*!". Archivado desde el original el 24 de septiembre de 2019 . Consultado el 20 de abril de 2013 .
  51. ^ "[llvm-proyecto] Revisión 194194". Archivado desde el original el 18 de noviembre de 2018 . Consultado el 30 de abril de 2018 .
  52. ^ 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 .
  53. ^ "Historial de revisiones de NDK | Desarrolladores de Android". desarrollador.android.com . Archivado desde el original el 6 de marzo de 2018 . Consultado el 6 de marzo de 2018 .
  54. ^ "Historial de revisiones de NDK | NDK de Android | Desarrolladores de Android". Desarrolladores de Android . Archivado desde el original el 5 de abril de 2019 . Consultado el 30 de abril de 2018 .
  55. ^ Nagy, Robert (26 de julio de 2017). "cambiar 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 .
  56. ^ 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 .
  57. ^ "Clang ahora se utiliza 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 .
  58. ^ "Firefox Beta 63.0beta, vea todas las funciones nuevas, actualizaciones y correcciones". www.mozilla.org . Archivado desde el original el 19 de abril de 2021 . Consultado el 18 de marzo de 2020 .
  59. ^ Hankala, Visa (1 de julio de 2019). "Cambie el compilador predeterminado en octeon a clang" (Lista de correo). Archivado desde el original el 8 de abril de 2022 . Consultado el 27 de agosto de 2020 .
  60. ^ "Lanzamientos de LLVM 9 con compatibilidad oficial con 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 .
  61. ^ "FreeBSD svn confirma r358454". 29 de febrero de 2020. Archivado desde el original el 10 de marzo de 2020 . Consultado el 7 de marzo de 2020 .
  62. ^ 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 .
  63. ^ 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 .

enlaces externos