2009-01-18 21 views
53

No entiendo la diferencia entre LLVM y java (bytecode), ¿qué son?¿Cuáles son las diferencias entre LLVM y bytecode java?

-editar- por 'qué son ellos' me refiero a las diferencias entre LLVM y java (bytecode) no lo que son LLVM y java.

+18

En nombre de aquellos de nosotros que realmente entendieron lo que usted pidió, me gustaría pedirle disculpas por todas las estúpidas respuestas que recibió. :-( – Ken

+17

si la pregunta está redactada ambiguamente, no las respuestas son estúpidas, pero la pregunta es: lo siento, pero quien diga 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. –

+2

Me encanta el comentario ken. Lo siento AcidZombie24 por algunas de estas respuestas. – user254492

Respuesta

71

Suponiendo que decir JVM en lugar de Java:

El LLVM es una máquina virtual basado en registrosbajo nivel. Está diseñado para abstraer el hardware subyacente y dibujar una línea limpia entre un back-end del compilador (generación de código de máquina) y front-end (análisis sintáctico, etc.).

La JVM es una máquina virtual basada en la pila de mucho más alto nivel. 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 del lenguaje (al igual que el CLR de Microsoft).

(Es posible construir estas abstracciones más de LLVM al igual que es posible construir en la parte superior de C.)

+1

LLVM tiene soporte de recolector de basura [más aquí] (http://llvm.org/docs/GarbageCollection .html) –

+11

@Robert Zaremba ¿Alguna vez ha tratado de implementar la recolección de basura con LLVM? Lo he hecho. Básicamente debe hacerlo todo usted mismo (ni siquiera proporcionan un simple recolector de basura, aunque hay un ejemplo desactualizado flotando). LLVM solo proporciona intrínsecos para que su código se enganche en el GC. A diferencia de la JVM, que proporciona un recolector de basura obligatorio incorporado que funciona automáticamente en todos los objetos s. – mgiuca

+0

@mgiuca Después de 5 años, ARC en Swift es mucho mejor que Java GC. https://www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-in-Java –

-2

Java es un lenguaje de programación, que utiliza la JVM como un medio de "Justo a Tiempo "(JIT) ejecución, mientras que LLVM es un compilador kit de construcción destinado a desarrollar nuevos lenguajes y front-ends para los idiomas existentes. LLVM tiene tiene un motor JIT, pero no necesita ser utilizado si no lo requiere. Puede descartar el ensamblador LLVM, el código de byte o el ensamblador específico de plataforma en lugar de usar la ejecución JIT.

22

Es una lástima que esta pregunta haya tenido un mal resultado. Llegué a ello buscando una comparación más detallada.

La mayor diferencia entre el código de bytes JVM y el código de bits LLVM es que las instrucciones de JVM están orientadas a la pila, mientras que el código de bits LLVM no lo está. Esto significa que en lugar de cargar valores en los registros, el bytecode 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á limitado por 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. ¿Tal vez alguien más familiarizado con LLVM puede hablar aquí?

+1

"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. –

+1

"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 ocuparse de la asignación de registros, es más una forma de SSA. LLVM/JVM para funcionar eficientemente ** debe ** hacerlo, ya que en general la memoria es mucho más lenta que la CPU registra (o incluso más lento). –

+4

Cargando valores en la pila es ** desventaja ** desde el punto de vista del rendimiento. Mire [esto] (http://static.usenix.org/events/vee05/full_papers/p153-yunhe.pdf) pdf. –

Cuestiones relacionadas