Pregunta

Yo estaba leyendo brevemente sobre Maxine que es una implementación de código abierto que JVM escrito en Java . Esto suena circular para mí. Si Java requiere una máquina virtual para ejecutar en, ¿cómo puede la máquina virtual en sí ser escrito en Java (no el código de máquina virtual requiere una máquina virtual en la que se ejecutará, y así sucesivamente?).

Editar : Ok, por lo que veo yo por alto el hecho de que Java no tiene que correr en una máquina virtual. ¿Cómo entonces se puede explicar cómo un compilador de Lisp puede ser escrito en LISP? O debería ser esto una nueva pregunta en total?

¿Fue útil?

Solución

Su suposición de que Java requiere una máquina virtual es incorrecta, para empezar .

Otros consejos

Se está preguntando acerca del huevo y la gallina.

Leer: http://en.wikipedia.org/wiki/Bootstrapping_%28compilers% 29

La JVM que se necesita para arrancar una máquina virtual Java escrito en Java, probablemente no necesita una gran cantidad de características (tales como la recolección de basura y JIT), podría ser muy simple. Todas las características más avanzadas podrían ser implementados en Java (que parece ser exactamente el punto de Maxine, para experimentar con nuevas ideas en la tecnología JVM).

Además, Maxine contiene el código C, que supongo que conforma un entorno de ejecución mínimo que se utiliza para obtener el resto de Maxine ir. Puedo entender que las cosas interesantes (compilador JIT, la recolección de basura) se implementan completamente en Java.

código Java puede ser compilado directamente en código máquina, de manera que no se necesita una máquina virtual.

Yo tenía un aspecto en Maxine la semana pasada y se preguntaba lo mismo:)

Desde el Maxine :

  

1 La construcción de la imagen de arranque

     

Ahora vamos a construir una [imagen de arranque]. En   este paso, Maxine se ejecuta en una JVM de acogida   para configurar un prototipo, a continuación,   compila su propio código y datos a   crear un programa ejecutable para el   plataforma de destino.

     

2 Ejecución de Maxine

     

Ahora que Maxine ha compilado en sí,   podemos ejecutarlo como un estándar de Java VM.   El comando max vm maneja los detalles   de las trayectorias de clase y biblioteca y   proporciona una interfaz similar a la   comando estándar de Java lanzador.

Puede echar un vistazo al método bien establecido de los compiladores de bootstrapping. Creo que empezó en los años 70 ...

Es un poco 'hombre whooaoaa, ¿cómo puede funcionar eso ???' - pero creo que está describiendo el fenómeno conocido como 'autoalojamiento':

Idiomas (o cadenas de herramientas / plataformas) no empiezan como auto-hosting - Comienzan la vida de haber sido construida sobre una plataforma existente: en un determinado momento se convierten suficientemente funcional para permitir que los programas que se escriben los que entienden la sintaxis que él mismo le sucede a ser escrito en.

No es un gran ejemplo en el libro clásico AWK, que introduce un programa AWK que puede analizar (una versión reducida como es el caso) otros programas AWK:. Ver enlace abajo

Hay otro ejemplo en el libro "Beautiful Código", que tiene un programa que puede analizar Javascript Javascript.

Creo que lo que hay que recordar en esto - si usted tiene (por ejemplo) una JVM escrito en Java, por tanto, que se puede ejecutar código de bytes de Java: la JVM que ejecuta el propio Java JVM tiene que ser alojado de forma nativa (tal vez esta JVM fue escrito en 'C' y luego compilado a código máquina): esto es cierto en cualquier caso de un programa de auto-alojamiento con el tiempo - en algún lugar a lo largo de la línea

.

Así que el misterio se retira -. Porque en algún momento, hay un programa de código máquina nativo corriendo por debajo de todo

Es un poco de equivalente de ser capaz de describir el idioma Inglés (etc) usando el idioma Inglés en sí .... tal vez ...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

Sé que este post es viejo pero pensé que podría añadir un poco a la discusión, ya que son los puntos que han sido perdidas. Así futuros lectores pueden encontrar útil esta información.

Me pregunto si todo el mundo le falta el punto aquí. Puede escribir la mayoría de cualquier tipo de compilador, intérprete o máquina virtual en casi cualquier idioma. Cuando se utiliza C para escribir un compilador de C se necesita un compilador C para compilar el nuevo compilador. Sin embargo, la salida es el código nativo que se ejecuta en la plataforma designada. El hecho de que la JVM está escrito en el lenguaje que se ejecuta en la JVM no significa que la salida debe resultar en código que se ejecuta en la JVM. Por ejemplo, puede escribir C, Basic, Pascal compiladores o incluso montadores en Java. En este caso, tendrá la JVM para crear el compilador o ensamblador pero una vez creado ya no necesite la JVM si el código inicial dio lugar a código nativo. Otro enfoque es escribir un traductor que tiene un idioma de entrada y la convierte en un lenguaje máquina nativo de modo que escriba su programa en lenguaje A, que compila en lengua B que que se compila en código máquina. En el mundo micro controlador que se ve mucho esto. Alguien quiere escribir programas en Basic o Java, por lo que escriben el compilador básico / Java para producir código C para un compilador de C existente. A continuación, el código C resultante se compila en lenguaje de máquina que proporciona el nativo compilador básico / Java. Este enfoque suele ser más fácil que escribir el compilador básico / Java directamente en código máquina.

Hace muchos años escribí programas Basica y GWBASIC que produjeron el código de montaje de 6800 y micros Z80. Mi punto es que la salida no tiene que ser de la misma calaña que la entrada o el objetivo. ES DECIR. El hecho de que usted está escribiendo una JVM en Java no significa que el resultado final debe ser corrió bajo una JVM de Java.

Aquí hay un buen papel en una máquina virtual bootstraping alojado en sí mismo. No es Java, pero JavaScript, pero los principios son los mismos.

Inicializar un investigación máquina virtual alojado en sí mismo JavaScript: un relato de experiencia

Tenga en cuenta que, si bien bootstraping un compilador auto-host y bootstraping una máquina virtual alojado en sí mismo son algo similares, creo que no plantean los mismos retos exactas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top