El proyecto de infraestructura del compilador LLVM es un conjunto de tecnologías de cadena de herramientas y compilador , [4] que se pueden utilizar para desarrollar un front-end para cualquier lenguaje de programación y un back-end para cualquier arquitectura de conjunto de instrucciones . LLVM está diseñado en torno a una representación intermedia (IR) independiente del lenguaje que sirve como un lenguaje ensamblador portátil de alto nivel que se puede optimizar con una variedad de transformaciones en múltiples pasadas. [5]
Autor (es) original (es) | Vikram Adve , Chris Lattner |
---|---|
Desarrollador (es) | Grupo de desarrolladores LLVM |
Versión inicial | 2003 |
Lanzamiento estable | 12.0.0 / 14 de abril de 2021 [1] |
Versión de vista previa | 12.0.0-rc5 / 7 de abril de 2021 [2] |
Repositorio | |
Escrito en | C ++ |
Sistema operativo | Multiplataforma |
Tipo | Compilador |
Licencia | Licencia Apache 2.0 UIUC ( estilo BSD ) con excepciones LLVM (v9.0.0 o posterior) [3] |
Sitio web | www |
LLVM está escrito en C ++ y está diseñado para tiempo de compilación , en tiempo de enlace , en tiempo de ejecución , y la optimización del "tiempo de inactividad". Implementado originalmente para C y C ++, el diseño independiente del lenguaje de LLVM ha generado una amplia variedad de interfaces : los lenguajes con compiladores que usan LLVM incluyen ActionScript , Ada , C # , [6] [7] [8] Common Lisp , PicoLisp , Crystal , CUDA , D , Delphi , Dylan , Fortran , gráfica G , [9] Halide , Haskell , código de bytes de Java , Julia , Kotlin , Lua , Objective-C , OpenCL , [10] PostgreSQL 's SQL y plpgsql, [11 ] Ruby , [12] Rust , Scala , [13] Swift , XC, [14] Xojo y Zig .
Historia
El proyecto LLVM comenzó en 2000 en la Universidad de Illinois en Urbana – Champaign , bajo la dirección de Vikram Adve y Chris Lattner . LLVM se desarrolló originalmente como una infraestructura de investigación para investigar técnicas de compilación dinámica para lenguajes de programación estáticos y dinámicos . LLVM fue lanzado bajo la Licencia de Código Abierto de la Universidad de Illinois / NCSA , [3] una licencia de software libre permisiva . En 2005, Apple Inc. contrató a Lattner y formó un equipo para trabajar en el sistema LLVM para varios usos dentro de los sistemas de desarrollo de Apple. [15] LLVM es una parte integral de las últimas herramientas de desarrollo de Apple para macOS e iOS . [dieciséis]
El nombre LLVM era originalmente una inicial de Low Level Virtual Machine . Esta abreviatura se ha eliminado oficialmente para evitar confusiones, ya que LLVM se ha convertido en un proyecto general que tiene poca relación con lo que la mayoría de los desarrolladores actuales consideran (más específicamente) máquinas virtuales de proceso . [17] Ahora, LLVM es una marca que se aplica al proyecto paraguas LLVM, la representación intermedia LLVM (IR), el depurador LLVM , la implementación LLVM de la biblioteca estándar de C ++ (con soporte completo de C ++ 11 y C ++ 14 [18] ), etc. LLVM es administrado por la Fundación LLVM. Su presidenta es la ingeniera compiladora Tanya Lattner. [19]
"Por diseñar e implementar LLVM" , la Association for Computing Machinery presentó a Vikram Adve, Chris Lattner y Evan Cheng con el premio ACM Software System Award 2012 . [20]
Desde v9.0.0, se volvió a obtener la licencia de Apache License 2.0 con excepciones LLVM. [3]
Características
LLVM puede proporcionar las capas intermedias de un sistema compilador completo, tomando código de representación intermedia (IR) de un compilador y emitiendo un IR optimizado. Este nuevo IR se puede convertir y vincular a un código de lenguaje ensamblador dependiente de la máquina para una plataforma de destino. LLVM puede aceptar el IR de la cadena de herramientas GNU Compiler Collection (GCC) , lo que permite su uso con una amplia gama de interfaces de compilador existentes escritas para ese proyecto.
LLVM también puede generar código de máquina reubicable en tiempo de compilación o en tiempo de enlace o incluso código de máquina binario en tiempo de ejecución.
LLVM admite un conjunto de instrucciones y un sistema de tipos independientes del idioma . [5] Cada instrucción está en forma estática de asignación única (SSA), lo que significa que cada variable (llamada registro escrito) se asigna una vez y luego se congela. Esto ayuda a simplificar el análisis de dependencias entre variables. LLVM permite que el código se compile estáticamente, como en el sistema tradicional GCC, o se deja para la compilación tardía del IR al código de máquina a través de la compilación Just-In -Time (JIT), similar a Java . El sistema de tipos consta de tipos básicos como números enteros o de punto flotante y cinco tipos derivados : punteros , matrices , vectores , estructuras y funciones . Una construcción de tipo en un lenguaje concreto se puede representar combinando estos tipos básicos en LLVM. Por ejemplo, una clase en C ++ se puede representar mediante una combinación de estructuras, funciones y matrices de punteros de función .
El compilador LLVM JIT puede optimizar las ramas estáticas innecesarias de un programa en tiempo de ejecución y, por lo tanto, es útil para la evaluación parcial en los casos en que un programa tiene muchas opciones, la mayoría de las cuales se pueden determinar fácilmente si no son necesarias en un entorno específico. Esta función se utiliza en la canalización de OpenGL de Mac OS X Leopard (v10.5) para proporcionar compatibilidad con las funciones de hardware que faltan. [21]
El código de gráficos dentro de la pila OpenGL se puede dejar en una representación intermedia y luego compilarse cuando se ejecuta en la máquina de destino. En sistemas con unidades de procesamiento de gráficos (GPU) de gama alta, el código resultante sigue siendo bastante delgado, pasando las instrucciones a la GPU con cambios mínimos. En sistemas con GPU de gama baja, LLVM compilará procedimientos opcionales que se ejecutan en la unidad de procesamiento central local (CPU) que emulan instrucciones que la GPU no puede ejecutar internamente. LLVM mejoró el rendimiento en máquinas de gama baja que utilizan conjuntos de chips Intel GMA . Se desarrolló un sistema similar bajo Gallium3D LLVMpipe, y se incorporó al shell de GNOME para permitir que se ejecute sin un controlador de hardware 3D adecuado cargado. [22]
Para el rendimiento en tiempo de ejecución de los programas compilados, GCC anteriormente superó a LLVM en un 10% en promedio en 2011. [23] [24] Los resultados más recientes de 2013 indican que LLVM ha alcanzado ahora a GCC en esta área y ahora está compilando binarios de rendimiento aproximadamente igual. [25]
Componentes
LLVM se ha convertido en un proyecto general que contiene múltiples componentes.
Frente termina
LLVM se escribió originalmente para reemplazar el generador de código existente en la pila GCC, [26] y muchas de las interfaces de GCC se han modificado para trabajar con él, lo que resulta en la ahora desaparecida suite LLVM-GCC. Las modificaciones generalmente implican un paso de IR de GIMPLE a LLVM para que los optimizadores LLVM y el codegen se puedan usar en lugar del sistema GIMPLE de GCC. Apple fue un usuario importante de LLVM-GCC a través de Xcode 4.x (2013). [27] [28] Este uso de la interfaz GCC se consideró principalmente una medida temporal, pero con el advenimiento de Clang y las ventajas de LLVM y la base de código moderna y modular de Clang (así como la velocidad de compilación), es en su mayoría obsoleto.
LLVM actualmente admite la compilación de Ada , C , C ++ , D , Delphi , Fortran , Haskell , Julia , Objective-C , Rust y Swift utilizando varias interfaces .
El interés generalizado en LLVM ha llevado a varios esfuerzos para desarrollar nuevas interfaces para una variedad de idiomas. El que ha recibido más atención es Clang, un nuevo compilador compatible con C, C ++ y Objective-C. Principalmente compatible con Apple, Clang tiene como objetivo reemplazar el compilador C / Objective-C en el sistema GCC con un sistema que se integra más fácilmente con entornos de desarrollo integrados (IDE) y tiene un soporte más amplio para subprocesos múltiples . La compatibilidad con las directivas OpenMP se ha incluido en Clang desde la versión 3.8. [29]
El compilador de Utrecht Haskell puede generar código para LLVM. Aunque el generador se encuentra en las primeras etapas de desarrollo, en muchos casos ha sido más eficiente que el generador de código C. [30] Existe un backend Glasgow Haskell Compiler (GHC) que usa LLVM que logra un 30% de aceleración del código compilado en relación con la compilación del código nativo a través de la generación de código GHC o C seguida de compilación, faltando solo una de las muchas técnicas de optimización implementado por la GHC. [31]
Muchos otros componentes se encuentran en varias etapas de desarrollo, incluidos, entre otros, el compilador Rust , una interfaz de código de bytes de Java , una interfaz de usuario de Common Intermediate Language (CIL), la implementación de MacRuby de Ruby 1.9, varias interfaces de usuario para Standard ML y un nuevo asignador de registros de coloración de gráficos . [ cita requerida ]
Representación intermedia
El núcleo de LLVM es la representación intermedia (IR), un lenguaje de programación de bajo nivel similar al ensamblador. IR es un conjunto de instrucciones de computación de conjunto de instrucciones reducidas (RISC) fuertemente tipado que abstrae la mayoría de los detalles del objetivo. Por ejemplo, la convención de llamada se abstrae mediante instrucciones call y ret con argumentos explícitos. Además, en lugar de un conjunto fijo de registros, IR utiliza un conjunto infinito de temporales de la forma% 0,% 1, etc. LLVM admite tres formas equivalentes de IR: un formato de ensamblaje legible por humanos, un formato en memoria adecuado para frontends y un formato de código de bits denso para serializar. Un simple "¡Hola, mundo!" programa en formato IR: [32]
@ .str = constante interna [ 14 x i8 ] c "hola, mundo \ 0A \ 00" declarar i32 @printf ( i8 *, ...)definir i32 @main ( i32 % argc , i8 ** % argv ) nounwind { entrada: % tmp1 = getelementptr [ 14 x i8 ], [ 14 x i8 ] * @ .str , i32 0 , i32 0 % TMP2 = llamada i32 ( i8 *, ...) @printf ( i8 * % tmp1 ) nounwind ret i32 0 }
Las muchas convenciones diferentes utilizadas y las características proporcionadas por los diferentes objetivos significan que LLVM no puede producir realmente un IR independiente del objetivo y reorientarlo sin romper algunas reglas establecidas. Se pueden encontrar ejemplos de dependencia del objetivo más allá de lo que se menciona explícitamente en la documentación en una propuesta de 2011 para "wordcode", una variante totalmente independiente del objetivo de LLVM IR destinada a la distribución en línea. [33] Un ejemplo más práctico es PNaCl . [34]
Extremos traseros
En la versión 3.4, LLVM admite muchos conjuntos de instrucciones , incluidos ARM , Qualcomm Hexagon , MIPS , Nvidia Parallel Thread Execution (PTX; llamado NVPTX en la documentación de LLVM), PowerPC , AMD TeraScale , [35] AMD Graphics Core Next (GCN), SPARC , z / Architecture (llamado SystemZ en la documentación de LLVM), x86 , x86-64 y XCore . Algunas funciones no están disponibles en algunas plataformas. La mayoría de las funciones están presentes para x86, x86-64, z / Architecture, ARM y PowerPC. [36] RISC-V se admite a partir de la versión 7. En el pasado, LLVM también admitía total o parcialmente otros backends, incluido el backend C, Cell SPU , mblaze (MicroBlaze) , [37] AMD R600, DEC / Compaq Alpha ( Alpha AXP ) [38] y Nios2 , [39] pero la mayor parte de este hardware es en su mayoría obsoleto, y los desarrolladores de LLVM decidieron que los costos de soporte y mantenimiento ya no estaban justificados.
LLVM también admite WebAssembly como destino, lo que permite que los programas compilados se ejecuten en entornos habilitados para WebAssembly como Google Chrome / Chromium , Firefox , Microsoft Edge , Apple Safari o WAVM . Los compiladores de WebAssembly compatibles con LLVM suelen admitir en su mayoría código fuente no modificado escrito en C, C ++, D, Rust, Nim, Kotlin y varios otros lenguajes.
El subproyecto de código de máquina (MC) de LLVM es el marco de trabajo de LLVM para traducir instrucciones de máquina entre formas textuales y código de máquina. Anteriormente, LLVM se basaba en el ensamblador del sistema, o en uno proporcionado por una cadena de herramientas, para traducir el ensamblaje en código de máquina. El ensamblador integrado de LLVM MC es compatible con la mayoría de los objetivos de LLVM, incluidos x86, x86-64, ARM y ARM64. Para algunos objetivos, incluidos los diversos conjuntos de instrucciones MIPS, se puede utilizar el soporte de ensamblaje integrado, pero aún se encuentra en la etapa beta.
Enlazador
El subproyecto lld es un intento de desarrollar un enlazador integrado independiente de la plataforma para LLVM. [40] lld tiene como objetivo eliminar la dependencia de un enlazador de terceros. En mayo de 2017[actualizar], lld admite ELF , PE / COFF , Mach-O y WebAssembly [41] en orden descendente de completitud. lld es más rápido que las dos versiones de GNU ld . [40]
A diferencia de los enlazadores GNU, lld tiene soporte incorporado para la optimización del tiempo de enlace . Esto permite una generación de código más rápida ya que evita el uso de un complemento de enlazador, pero por otro lado prohíbe la interoperabilidad con otras versiones de LTO. [42]
Biblioteca estándar de C ++
El proyecto LLVM incluye una implementación de la biblioteca estándar de C ++ llamada libc ++ , con doble licencia bajo la licencia MIT y la licencia UIUC . [43]
Desde v9.0.0, se volvió a obtener la licencia de Apache License 2.0 con excepciones LLVM. [3]
Polly
Esto implementa un conjunto de optimizaciones de localidad de caché, así como auto-paralelismo y vectorización utilizando un modelo poliédrico. [44]
Depurador
Derivados
Debido a su licencia permisiva, muchos proveedores lanzan sus propios diapasones de LLVM. Esto está oficialmente reconocido por la documentación de LLVM, que sugiere no usar números de versión en las verificaciones de funciones por este motivo. [45] Algunos de los proveedores incluyen:
- El compilador AMD Optimizing C / C ++ de AMD se basa en LLVM, Clang y Flang.
- Apple mantiene una bifurcación de código abierto para Xcode . [46]
- ARM mantiene una bifurcación de LLVM 9 como el "Compilador de Arm".
- El Laboratorio Nacional de Los Alamos tiene una bifurcación de computación paralela de LLVM 8 llamada "Kitsune". [47]
- Desde 2013, Sony ha estado utilizando el compilador Clang de front-end principal de LLVM en el kit de desarrollo de software (SDK) de su consola PlayStation 4 . [48]
- Nvidia utiliza LLVM en la implementación de su compilador NVVM CUDA . [49] El compilador NVVM es distinto del backend "NVPTX" mencionado en la sección Backends , aunque ambos generan código PTX para las GPU de Nvidia.
- IBM está adoptando LLVM en sus compiladores C / C ++ y Fortran . [50]
Ver también
- H HVM
- C--
- Kit del compilador de Amsterdam (ACK)
- LLDB (depurador)
- Rayo GNU
- Colección de compiladores GNU (GCC)
- Puro
- OpenCL
- Emscripten
- Formato de distribución TenDRA
- Formato de distribución neutral de arquitectura (ANDF)
- Comparación de máquinas virtuales de aplicaciones
- SPIR-V
- Universidad de Illinois en Urbana Champaign descubrimientos e innovaciones
Literatura
- Chris Lattner - La arquitectura de las aplicaciones de código abierto - Capítulo 11 LLVM , ISBN 978-1257638017 , publicado en 2012 bajo CC BY 3.0 ( Acceso abierto ). [51]
- LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation , un artículo publicado por Chris Lattner , Vikram Adve
Referencias
- ^ "Lanzamientos" . Github . 17 de febrero de 2021 . Consultado el 18 de febrero de 2021 .
- ^ "Lanzamiento LLVM 12.0.0-rc5 · llvm / llvm-project" . GitHub . Consultado el 15 de abril de 2021 .
- ^ a b c d "LICENCIA.TXT" . llvm.org . Consultado el 24 de septiembre de 2019 .
- ^ "El proyecto de infraestructura del compilador LLVM" . Consultado el 11 de marzo de 2016 .
- ^ a b "Manual de referencia del lenguaje LLVM" . Consultado el 9 de junio de 2019 .
- ^ "Anuncio de LLILC - Un nuevo compilador basado en LLVM para .NET" . dotnetfoundation.org . Consultado el 12 de septiembre de 2020 .
- ^ Mono LLVM , consultado el 10 de marzo de 2013
- ^ Chris Lattner (2011). "LLVM" . En Amy Brown; Greg Wilson (eds.). La arquitectura de las aplicaciones de código abierto .
- ^ William Wong (23 de mayo de 2017). "¿Cuál es la diferencia entre LabVIEW 2017 y LabVIEW NXG?" . Diseño Electrónico .
- ^ Michael Larabel (11 de abril de 2018). "Khronos anuncia oficialmente su traductor LLVM / SPIR-V" . phoronix.com.
- ^ "32.1. ¿Qué es la compilación JIT?" . Documentación de PostgreSQL . 12 de noviembre de 2020 . Consultado el 25 de enero de 2021 .
- ^ "Características" . RubyMotion . Scratchwork Development LLC . Consultado el 17 de junio de 2017 .
RubyMotion transforma el código fuente de Ruby de su proyecto en ... código máquina usando un compilador [n] ... adelantado (AOT), basado en LLVM.
- ^ Reedy, Geoff (24 de septiembre de 2012). "Compilando Scala a LLVM" . St. Louis, Missouri, Estados Unidos . Consultado el 19 de febrero de 2013 . Cite journal requiere
|journal=
( ayuda ) - ^ "xCORE: Teoría, hardware y programación multinúcleo (2014-12-01)" , Developer Tool xTIMEcomposer , XMOS , consultado el 27 de marzo de 2021
- ^ Adam Treat (19 de febrero de 2005), mkspecs y parches para la compilación LLVM de Qt4 , archivado desde el original el 4 de octubre de 2011 , consultado el 27 de enero de 2012
- ^ "Apple LLVM Compiler" , Developer Tools , Apple , consultado el 27 de enero de 2012
- ^ Lattner, Chris (21 de diciembre de 2011). "El nombre de LLVM" . llvm-dev (lista de correo) . Consultado el 2 de marzo de 2016 .
- ^ " " libc ++ "Biblioteca estándar de C ++" .
- ^ Chris Lattner (3 de abril de 2014). "La Fundación LLVM" . Blog del proyecto LLVM .
- ^ "Premio ACM Software System" . ACM.
- ^ Chris Lattner (15 de agosto de 2006). "Un buen uso de LLVM en Apple: la pila de OpenGL" . llvm-dev (lista de correo) . Consultado el 1 de marzo de 2016 .
- ^ Michael Larabel, "GNOME Shell funciona sin compatibilidad con el controlador de GPU" , phoronix , 6 de noviembre de 2011
- ^ V. Makarov. "SPEC2000: Comparación de LLVM-2.9 y GCC4.6.1 en x86" . Consultado el 3 de octubre de 2011 .
- ^ V. Makarov. "SPEC2000: Comparación de LLVM-2.9 y GCC4.6.1 en x86_64" . Consultado el 3 de octubre de 2011 .
- ^ Michael Larabel (27 de diciembre de 2012). "Compilador LLVM / Clang 3.2 que compite con GCC" . Consultado el 31 de marzo de 2013 .
- ^ Lattner, Chris ; Vikram Adve (mayo de 2003). Arquitectura para un GCC de próxima generación . Primera Cumbre Anual de Desarrolladores de GCC . Consultado el 6 de septiembre de 2009 .
- ^ "Descripción general del compilador LLVM" . developer.apple.com .
- ^ "Notas de la versión de Xcode 5" . Apple .
- ^ "Notas de la versión 3.8 de Clang" . Consultado el 24 de agosto de 2016 .
- ^ "Compilación de Haskell a LLVM" . Consultado el 22 de febrero de 2009 .
- ^ "Blog del proyecto LLVM: el compilador de Glasgow Haskell y LLVM" . Consultado el 13 de agosto de 2010 .
- ^ Para obtener la documentación completa, consulte llvm .org / docs / LangRef .html .
- ^ Kang, Jin-Gu. "Wordcode: más código de bits LLVM independiente de destino" (PDF) . Consultado el 1 de diciembre de 2019 .
- ^ "PNaCl: ejecutables de cliente nativo portátil" (PDF) . Archivado desde el original (PDF) el 2 de mayo de 2012 . Consultado el 25 de abril de 2012 .
- ^ Stellard, Tom (26 de marzo de 2012). "[LLVMdev] RFC: R600, un nuevo backend para las GPU de AMD" . llvm-dev (lista de correo).
- ^ Notas de implementación específicas de destino: Matriz de funciones de destino // Generador de código independiente de destino de LLVM, sitio de LLVM.
- ^ "Quite el backend mblaze de llvm" . GitHub . 25 de julio de 2013 . Consultado el 26 de enero de 2020 .
- ^ "Eliminar el backend Alpha" . GitHub . 27 de octubre de 2011 . Consultado el 26 de enero de 2020 .
- ^ "[Nios2] Elimina el backend de Nios2" . GitHub . 15 de enero de 2019 . Consultado el 26 de enero de 2020 .
- ^ a b "lld - El vinculador LLVM" . El Proyecto LLVM . Consultado el 10 de mayo de 2017 .
- ^ "Puerto lld de WebAssembly" .
- ^ "42446 - lld no puede manejar archivos gcc LTO" . bugs.llvm.org .
- ^ " " libc ++ "Biblioteca estándar de C ++" .
- ^ "Polly - Optimizaciones poliédricas para LLVM" .
- ^ "Extensiones de lenguaje Clang" . Documentación de Clang 12 .
Tenga en cuenta que los números de versión de marketing no deben usarse para verificar las características del idioma, ya que diferentes proveedores usan diferentes esquemas de numeración. En su lugar, utilice las macros de comprobación de funciones.
- ^ "proyecto apple / llvm" . Manzana. 5 de septiembre de 2020.
- ^ "lanl / kitsune" . Laboratorio Nacional de Los Alamos. 27 de febrero de 2020.
- ^ Developer Toolchain para ps4 (PDF) , consultado el 24 de febrero de 2015
- ^ "Especificación de infrarrojos NVVM 1.5" .
El IR NVVM actual se basa en LLVM 5.0
- ^ "Compiladores de IBM C / C ++ y Fortran para adoptar la infraestructura de código abierto LLVM" .
- ^ Chris Lattner (15 de marzo de 2012). "Capítulo 11" . La arquitectura de las aplicaciones de código abierto . Amy Brown, Greg Wilson. ISBN 978-1257638017.
enlaces externos
- Página web oficial