No entiendo la diferencia entre el código de bits LLVM y el código de bytes de Java, ¿cuáles son?
-editar- por ‘qué son’ me refiero a las diferencias entre el código de bits de LLVM y el código de bytes de Java, no a lo que son LLVM y Java.
Suponiendo que te refieres a JVM en lugar de Java:
El LLVM es un nivel bajo Máquina virtual basada en registros. Está diseñado para abstraer el hardware subyacente y trazar una línea clara entre el back-end del compilador (generación de código de máquina) y el front-end (análisis, etc.).
La JVM es una máquina virtual basada en pilas de un nivel mucho más alto. La JVM proporciona recolección de basura, tiene la noción de objetos y llamadas a métodos virtuales y más. Por lo tanto, la JVM proporciona una infraestructura de nivel mucho más alto para la interoperabilidad de lenguajes (al igual que CLR de Microsoft).
(Es posible construir estas abstracciones sobre LLVM del mismo modo que es posible construirlas sobre C).
-
LLVM tiene soporte para recolector de basura más aquí
– Roberto Zaremba
16 de marzo de 2011 a las 16:31
-
@Robert Zaremba ¿Alguna vez ha intentado implementar la recolección de basura con LLVM? Tengo. Básicamente, debe hacerlo todo usted mismo (ni siquiera proporcionan un recolector de basura simple, aunque hay un ejemplo obsoleto flotando). LLVM solo proporciona elementos intrínsecos para que su código se conecte al GC. A diferencia de la JVM, que proporciona un recolector de basura obligatorio incorporado que funciona automáticamente en todos los objetos.
– mgiuca
13 de mayo de 2011 a las 6:54
-
¿No es una de las diferencias también que JVM es casi como un intérprete, en el sentido de que el usuario necesita tenerlo instalado para ejecutar programas, mientras que LLVM se usa para generar los ejecutables específicos de la arquitectura de antemano (puedo estar muy equivocado, acabo de empezar aprendiendo sobre esto)?
– Usuario
12 de mayo de 2020 a las 7:57
-
(Probablemente estoy describiendo JIT vs. AOT, ¿donde JVM se usa más comúnmente para JIT y LLVM AOT?)
– Usuario
12 mayo 2020 a las 8:00
Owen
Es una lástima que esta pregunta comenzó con el pie izquierdo. Llegué a él buscando una comparación más detallada.
La mayor diferencia entre el código de bytes de JVM y el código de bits de LLVM es que las instrucciones de JVM están orientadas a la pila, mientras que el código de bits de LLVM no lo está. Esto significa que, en lugar de cargar valores en registros, el código de bytes de JVM carga valores en una pila y calcula los valores desde allí. Creo que una ventaja de esto es que el compilador no tiene que asignar registros, pero no estoy seguro.
El código de bits LLVM está más cerca del código de nivel de máquina, pero no está sujeto a una arquitectura en particular. Por ejemplo, creo que el código de bits LLVM puede hacer uso de un número arbitrario de registros lógicos. ¿Quizás alguien más familiarizado con LLVM pueda hablar aquí?
-
“Creo que una ventaja de esto es que el compilador no tiene que asignar registros, pero no estoy seguro”. No estoy seguro de eso. ISTR la ventaja es que la pila es más fácil de verificar.
– JD
26 de abril de 2010 a las 18:44
-
“Creo que una ventaja de esto es que el compilador no tiene que asignar registros, pero no estoy seguro”. – El compilador basado en LLVM no tiene que lidiar con la asignación de registros, es más una forma de SSA. LLVM/JVM para ejecutarse de manera eficiente debe hágalo ya que, en general, la memoria es mucho más lenta que los registros de la CPU (o incluso más lentos).
– Maciej Piechotka
8 de noviembre de 2010 a las 19:39
-
Cargar valores en la pila es desventaja desde el punto de vista del rendimiento. Mira a este pdf.
– Om nom nom
08/04/2012 a las 13:55
-
¿Cuál es la diferencia entre el código de bits y el código de bytes? significan lo mismo o hay algo mas?
– preguntas
27 de septiembre de 2017 a las 8:51
-
llvm IR (representación intermedia) asume que tiene registros infinitos para trabajar, el back-end de llvm asignará esos registros a registros físicos según la arquitectura a la que se dirige.
– wfbarksdale
13 de marzo de 2018 a las 3:44
Los códigos de bytes JVM y los códigos de bytes LLVM tienen similitudes y diferencias. En términos de similitudes, estas son dos representaciones intermedias del programa. Por lo tanto, pueden representar programas escritos en diferentes lenguajes de programación. Como ejemplo, hay interfaces que traducen Java, Closure, Scala, etc. a bytecodes de JVM, y hay interfaces que traducen C, C++, Swift, Julia, Rust, etc. a bytecodes de LLVM.
Dicho esto, los códigos de bytes JVM y los códigos de bytes LLVM son muy diferentes en propósito y diseño. Históricamente, los bytecodes de JVM han sido diseñados para ser distribuidos a través de una red, por ejemplo, Internet, e interpretados en la computadora local, a través de una máquina virtual. Esa es una de las razones por las que se basa en la pila: por lo general, los bytecodes basados en la pila son más pequeños.
Quizás, en sus inicios, los bytecodes LLVM también se han pensado para ser interpretados, pero si sucedió, su propósito ha cambiado con el tiempo. Por lo tanto, los códigos de bytes LLVM son una representación de programa destinada a ser analizada y optimizada. Está codificado en el formato de asignación única estática, que se parece más a una abstracción matemática de un programa que a un conjunto ejecutable real. Por lo tanto, hay instrucciones como funciones phi en el LLVM IR que no tienen un equivalente directo en las arquitecturas informáticas típicas, por ejemplo. Por lo tanto, aunque es posible interpretar códigos de bytes de LLVM (hay una herramienta llamada lli que es parte de la cadena de herramientas de LLVM, que hace eso), esa no es la forma más importante en la que se usa LLVM IR.
Java es un lenguaje de programación que utiliza JVM como un medio de ejecución “Justo a tiempo” (JIT), mientras que LLVM es un kit de construcción de compiladores destinado a desarrollar nuevos lenguajes y interfaces para lenguajes existentes. LLVM hace tiene un motor JIT, pero no es necesario utilizarlo si no lo necesita. Puede descartar el ensamblador LLVM, el código de bytes o el ensamblador específico de la plataforma en lugar de usar la ejecución JIT.
En nombre de aquellos de nosotros que realmente entendimos lo que preguntaste, me gustaría disculparme por todas las respuestas estúpidas que obtuviste. 🙁
– ken
17 de abril de 2009 a las 17:27
si la pregunta está redactada de forma ambigua, no las respuestas son estúpidas, pero la pregunta sí lo es. lo siento, pero quien diga que las respuestas a continuación son “estúpidas” debería volver a leer todo en este hilo. cuando respondí su pregunta fue como “diferencia entre llvm y java”. El comentario de Ken suena bastante arrogante.
– Johannes Schaub – litb
18 de abril de 2009 a las 14:23
Me encanta el comentario Ken. Lo siento, AcidZombie24, por algunas de estas respuestas.
– usuario254492
1 de marzo de 2010 a las 10:05
Aquí se proporciona más información sobre el código de bits LLVM: llvm.org/docs/BitCodeFormat.html
– Hari
16 de marzo a las 13:12