¿De qué forma (s) es LLVM de bajo nivel?

12

¿De qué forma (s) es LLVM (máquina virtual de bajo nivel ) de bajo nivel? (Al momento de escribir, no encontré esta expansión de la abreviatura "LLVM" en su sitio web, sino en Wikipedia ).

¿Se llama "Nivel bajo" en qué está diseñado (una infraestructura de compilación) o porque funciona en un "nivel inferior" que otras herramientas?

Como (una especie de) "ilustración" de esto, ¿LLVM es de nivel inferior a JVM y CLR , o solo está diseñado para usos de "nivel inferior"?

Abbafei
fuente

Respuestas:

16

LLVM tiene un nivel más bajo que las máquinas virtuales típicas como JVM y CLR. Por ejemplo, aunque tiene ganchos para un recolector de basura, no proporciona un recolector de basura en sí.

Del mismo modo, la JVM tiene un compilador JIT incorporado (excepto en versiones muy antiguas). LLVM tiene algunos compiladores JIT para LLVM IR, pero aún depende del desarrollador conectar las cosas y JIT el código.

Cuando la JVM encuentra un externo no resuelto, sale y encuentra la clase correcta para satisfacerlo, y sabe cómo buscar archivos .class directamente en el sistema de archivos y en los archivos .jar 1 . Los compiladores JIT de LLVM tienen ganchos donde puedes decidir cómo se manejan esas cosas. Como era de esperar, algunas personas han escrito algunas versiones predeterminadas, por lo que puede hacer las cosas más o menos en el mismo orden que la JVM, pero también puede ignorarlas y hacer las cosas de manera diferente si lo desea.

En pocas palabras, si está desarrollando un compilador (o algo en ese orden) tiene muchas herramientas para facilitarle la vida. En lugar de preocuparse mucho por la optimización, puede hacer aproximadamente la traducción más simple que puede administrar desde su código fuente a LLVM IR, y luego usar las bibliotecas LLVM para administrar la optimización, JIT, vinculación, etc. Sin embargo, son bibliotecas: proporciona algunas funciones realmente útiles para que no tenga que lidiar con todos los detalles, pero todavía son funciones y todavía está escribiendo código para invocarlas. No es un producto terminado, solo herramientas útiles para construir productos de manera relativamente rápida y fácil.


1 Técnicamente, no todo esto está integrado en la JVM propiamente dicha. Especifica lo que generalmente se llama el cargador de clases primordial como parte de la JVM propiamente dicha, y luego hay cargadores de clases de usuario especificados en java.util.ClassLoader que manejan otras cosas. Algunos cargadores de clases se incluyen de forma predeterminada, y si lo desea lo suficiente, puede complementarlos definiendo los suyos.

Jerry Coffin
fuente
12

Es de bajo nivel porque está diseñado para que las máquinas virtuales existentes o futuras (JVM) puedan usarlo como el núcleo de su implementación.

Véalo de esta manera: las máquinas virtuales de Java y Python son muy portátiles porque están escritas en el estándar C y dependen mucho de sus propias bibliotecas. La intención de LLVM es proporcionar una infraestructura para que sea fácil portar cualquier máquina virtual a una plataforma que ya sea compatible con LLVM.

LLVM ofrece soporte para compilación estática y JIT, y está diseñado de tal manera que podría ejecutarse en un espacio confiable del sistema operativo. Eso significa que, en teoría, ejecutar una máquina virtual sobre LLVM debería significar mucho menos trabajo y producir algo mucho más rápido y eficiente. En teoria.

Entonces LLVM, al ser de nivel inferior, debería ser más fácil de portar a diferentes arquitecturas de SO y hardware.

Se pueden obtener grandes ahorros si los implementadores de idiomas pudieran escribir en una única plataforma de bajo nivel fácil de portar. Las máquinas virtuales más conocidas están a medio camino entre el lenguaje que sirven y el sistema operativo, y tienen que implementar sus propias representaciones intermedias y JITC.

Apalala
fuente
5

La parte de "nivel bajo" del nombre LLVM se refiere al nivel del conjunto de instrucciones virtuales utilizado. El lenguaje intermedio (IR) que utiliza LLVM está cerca del nivel de código de máquina, aunque es independiente de la arquitectura y general.

El bytecode de JVM y CLR, por otro lado, es bastante alto, ya que tiene instrucciones que se encuentran en una capa de abstracción más alta. Ambos son lenguajes de ensamblaje basados ​​en pila orientados a objetos. Por ejemplo, la JVM tiene la instrucción invokevirtual, que es una instrucción que debe conocer el modelo de objeto específico del lenguaje Java.

Zayenz
fuente
3

Ciertamente es un nivel más bajo que cualquiera de las máquinas virtuales específicas del lenguaje y las máquinas virtuales unificadas como JVM y CLR. Su diseño está cerca de la representación intermedia de bajo nivel en GCC (GIMPLE) y compiladores similares. No hay un GC predeterminado, no se aplica ningún sistema de tipo de alto nivel específico, no se supone alineación (se debe especificar explícitamente), los tipos de datos de punto entero y flotante son explícitos (y dependen de la plataforma), y el nivel más bajo de todos: un La aritmética de puntero decente está disponible.

SK-logic
fuente