¿Cómo ejecuta la Máquina Virtual Java el código escrito en otros idiomas?

12

Desde Java 1.6, la JVM puede ejecutar una gran cantidad de lenguajes de programación en lugar de solo Java. Conceptualmente entiendo cómo se ejecuta Java en la máquina virtual de Java, pero no cómo otros lenguajes también pueden ejecutarse en él. Para mí, todo parece magia negra. ¿Tiene algún artículo al que dirigirme para poder entender mejor cómo encaja todo esto?

    
pregunta Pomario 07.06.2012 - 15:08

4 respuestas

23

La clave es el idioma nativo de la JVM: el código de bytes de Java. Cualquier lenguaje se puede compilar en el código de bytes que entiende la JVM; todo lo que necesita para esto es un compilador que emita un código de bytes. A partir de entonces, no hay diferencia desde el punto de vista de la JVM. Tanto es así que puede tomar un archivo de clase compilado de Scala, Clojure, Jython, etc. y descompilarlo (utilizando, por ejemplo, JAD ) en código fuente Java de aspecto normal.

Puede encontrar más detalles sobre esto en los siguientes artículos / temas:

No tengo conocimiento de ningún cambio fundamental en Java 5 o 6 JVMs que lo habrían hecho posible o más fácil para (código compilado de) otros idiomas para ejecutar en él. En mi opinión, la JVM 1.4 era más o menos tan capaz a ese respecto como la JVM 6 (aunque puede haber diferencias; no soy un experto en JVM). Fue solo que la gente comenzó a desarrollar otros lenguajes y / o compiladores de código de bytes en la primera mitad de la década, y los resultados comenzaron a aparecer (y se hicieron más conocidos) alrededor de 2006 cuando se publicó Java 6.

Sin embargo, todas estas versiones de JVM comparten algunas limitaciones: la JVM está tipificada estáticamente por naturaleza, y hasta la versión 7, no era compatible con los idiomas dinámicos. Esto ha cambiado con la introducción de invokedynamic , una nueva instrucción de código de byte que permite el método invocación que se basa en la comprobación dinámica de tipos.

    
respondido por el Péter Török 07.06.2012 - 15:09
3

Una máquina virtual, como JVM, es un programa que acepta como entrada, generalmente archivos, un conjunto de instrucciones simples (que generalmente son fáciles de convertir a instrucciones reales de CPU), y en realidad las compila y ejecuta como instrucciones de CPU nativas. (por lo general, utiliza un compilador a pedido, como HotSpot o JIT).

Es esencialmente una capa de abstracción. Por lo general, es mucho más fácil trasladar implementaciones de conjuntos de instrucciones de VM a diferentes arquitecturas de procesadores, debido a varias similitudes (como estar basado en la pila). También es mucho más fácil portar diferentes lenguajes de programación a las instrucciones de la máquina virtual, ya que está más orientado a los lenguajes de programación modernos que las instrucciones primitivas de la CPU. Muchas máquinas virtuales como JVM y CLR (.NET) contienen instrucciones para llamar a métodos virtuales y crear instancias de objetos.

Por ejemplo, tomemos un lenguaje. Llámalo MyLanguage. Dado que es un lenguaje de programación, en última instancia, se compila en un conjunto de instrucciones de arquitectura de CPU. Eso significa que, dado un conjunto de instrucciones de máquina virtual flexible y compatible, también es posible compilar MyLanguage en un conjunto de instrucciones de esa máquina virtual.

Siempre hay una cuestión de eficiencia, ya que es posible que deba piratear algunas soluciones en los conjuntos de instrucciones de VM que no tendría que hacer de forma nativa, pero aún es posible.

    
respondido por el Yam Marcovic 07.06.2012 - 16:22
3

Una JVM es una máquina de cálculo completa de Turing (excepto para memoria limitada), y cualquier máquina completa de Turing (física o virtual) puede ejecutar cualquier lenguaje de programación (excepto para memoria, rendimiento y limitaciones físicas de E / S).

    
respondido por el hotpaw2 07.06.2012 - 16:58
2

Por un momento, piense en la JVM como un procesador con su propio conjunto de instrucciones como quizás el x86. El procesador puede ejecutar, digamos, el código C que se ha compilado en su lenguaje de máquina. Aplicando la misma analogía a la JVM, se pueden ejecutar otros idiomas en la JVM al igual que en otros procesadores si esos idiomas se compilan de acuerdo con las instrucciones de la máquina de la JVM. La JVM puede ejecutar estas instrucciones para el idioma X.

    
respondido por el cobie 08.06.2012 - 03:39

Lea otras preguntas en las etiquetas