¿Qué es exactamente LLVM?

464

Sigo escuchando sobre LLVM todo el tiempo. Está en Perl, luego en Haskell, ¿alguien lo usa en otro idioma? ¿Qué es?

bodacydo
fuente
45
Hay un buen capítulo en un libro que explica todo muy bien aquí: www.aosabook.org/en/llvm.html
David d C e Freitas

Respuestas:

369

LLVM es una biblioteca que se utiliza para construir, optimizar y producir código de máquina intermedio y / o binario.

LLVM se puede usar como un marco de compilación, donde se proporciona el "front-end" (analizador y lexer) y el "back-end" (código que convierte la representación de LLVM en código de máquina real).

LLVM también puede actuar como un compilador JIT: tiene soporte para x86 / x86_64 y la generación de ensamblaje PPC / PPC64 con optimizaciones de código rápidas destinadas a la velocidad de compilación.

Si está interesado, puede jugar con el código de máquina de LLVM que se genera a partir del código C o C ++ en su página de demostración , pero la página de demostración está actualmente desactivada desde el año 2013.

LiraNuna
fuente
39
Si quieres jugar con él, mira este increíble artículo: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna
29
El enlace provisto en la respuesta dice "La página de demostración de LLVM está actualmente deshabilitada".
EngrStudent
55
ellcc.org/demo/index.cgi es otra forma de jugar compilando C / C ++ a través de LLVM para varios objetivos, incluido el código intermedio
Tom Goodfellow
1
¿Puedes dar un ejemplo real de lo que significa?
Migrate2Lazarus ver mi perfil
112

Un buen resumen de LLVM es este:

ingrese la descripción de la imagen aquí

En la interfaz tienes Perl y muchos otros idiomas de alto nivel. En el backend, tiene el código nativo que se ejecuta directamente en la máquina.

En el centro está su representación de código intermedio. Si cada lenguaje de alto nivel puede representarse en este formato LLVM IR, entonces las herramientas de análisis basadas en este IR pueden reutilizarse fácilmente, esa es la razón básica.

Peter Teoh
fuente
39
la imagen vale más que mil palabras 👍
ipatch
3
Entonces parece que LLVM es útil para los diseñadores de compiladores. ¿Debería importarle un programador si compila con un compilador estándar o uno basado en LLVM, además de analizar el código generado independientemente del código fuente?
jinawee
44
si puede compilar con LLVM en su IR, entonces se le pueden abrir muchas herramientas para analizar el IR. Pero si su herramienta solo es capaz de analizar los binarios nativos (x86, por ejemplo), entonces si son binarios generados por LLVM o binarios generados por gcc, o generados por el compilador Intel, no hay diferencia.
Peter Teoh
73

LLVM (solía significar "Máquina virtual de bajo nivel", pero ya no es más) es una infraestructura de compilación, escrita en C ++, que está diseñada para la optimización de los programas escritos en tiempo de compilación, tiempo de enlace, tiempo de ejecución y "tiempo de inactividad". en lenguajes de programación arbitrarios. Originalmente implementado para C / C ++, el diseño independiente del lenguaje (y el éxito) de LLVM ha generado una amplia variedad de front-end, incluidos Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , y otros.

Lea esto para obtener más explicaciones.
Consulte también Unladen Swallow

N 1.1
fuente
13
.. Entonces, ¿qué están tratando de decir los documentos? mientras LLVM es un acrónimo de máquina virtual de bajo nivel , el proyecto simplemente se llama LLVM , no las palabras completamente enunciadas.
Jochem Kuijpers
2
Anteriormente tenía la abreviatura anterior, pero luego se eliminó en.wikipedia.org/wiki/LLVM
VVB
2
Para resumir los comentarios. "La máquina virtual de bajo nivel (LLVM)" debería ser algo así como "LLVM (que significaba" máquina virtual de bajo nivel "anteriormente en la vida útil de los proyectos)"
ssokolow
52

De acuerdo con el libro 'Comenzando con las bibliotecas principales de LLVM' (c):

De hecho, el nombre LLVM podría referirse a cualquiera de los siguientes:

  • El proyecto / infraestructura de LLVM: este es un paraguas para varios proyectos que, juntos, forman un compilador completo: frontends, backends, optimizadores, ensambladores, enlazadores, libc ++, compiler-rt y un motor JIT. La palabra "LLVM" tiene este significado, por ejemplo, en la siguiente oración: "LLVM se compone de varios proyectos".

  • Un compilador basado en LLVM: este es un compilador construido parcial o completamente con la infraestructura LLVM. Por ejemplo, un compilador podría usar LLVM para el front-end y el back-end, pero usar las bibliotecas del sistema GCC y GNU para realizar el enlace final. LLVM tiene este significado en la siguiente oración, por ejemplo: "Usé LLVM para compilar programas C en una plataforma MIPS".

  • Bibliotecas LLVM: esta es la porción de código reutilizable de la infraestructura LLVM. Por ejemplo, LLVM tiene este significado en la oración: "Mi proyecto usa LLVM para generar código a través de su marco de compilación Just-in-Time".

  • Núcleo LLVM: las optimizaciones que ocurren en el nivel de lenguaje intermedio y los algoritmos de back-end forman el núcleo LLVM donde comenzó el proyecto. LLVM tiene este significado en la siguiente oración: "LLVM y Clang son dos proyectos diferentes".

  • El LLVM IR: Esta es la representación intermedia del compilador LLVM. LLVM tiene este significado cuando se usa en oraciones como "Construí una interfaz que traduce mi propio lenguaje a LLVM".

Ittrin
fuente
35

LLVM es básicamente una biblioteca utilizada para compilar compiladores y / o software orientado al lenguaje. La esencia básica es que aunque tiene gcc, que es probablemente el conjunto de compiladores más común, no está diseñado para ser reutilizable, es decir. es difícil tomar componentes de gcc y usarlos para construir su propia aplicación. LLVM aborda bien este problema mediante la creación de un conjunto de "tecnologías compiladoras y de herramientas modulares y reutilizables" que cualquiera podría usar para construir compiladores y software orientado al lenguaje.

redbandit
fuente
66
Entonces, ¿LLVM es la biblioteca y Clang es el compilador?
Abdul
11
Clang es el compilador frontend C / C ++ de LLVM. Convierte el código C en código de bits LLVM, que un compilador de fondo traduce a algún lenguaje ensamblador.
Boris Mulder el
6

La infraestructura del compilador LLVM es particularmente útil para realizar optimizaciones y transformaciones en el código. También consta de una serie de herramientas que sirven para distintos usos. llvm-prof es una herramienta de creación de perfiles que le permite crear perfiles de ejecución para identificar puntos de acceso de programas. Opt es una herramienta de optimización que ofrece varios pases de optimización (eliminación de código muerto, por ejemplo).

Es importante destacar que LLVM le proporciona las bibliotecas para escribir sus propios pases. Por ejemplo, si necesita agregar una verificación de rango en ciertos argumentos que se pasan a ciertas funciones de un Programa, sería suficiente escribir un Pase LLVM simple.

Para obtener más información sobre cómo escribir su propio Pase, consulte http://llvm.org/docs/WritingAnLLVMPass.html

Hashim Sharif
fuente