2010-02-17 15 views
34

Estuve leyendo brevemente acerca de Maxine que es una implementación de JVM de código abierto escrita en Java. Esto me suena circular. Si Java requiere que se ejecute una máquina virtual, ¿cómo puede escribirse la máquina virtual en Java (el código de la VM no necesita una VM para ejecutarse, etc.?).Cómo se puede escribir una JVM en Java

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 se explica cómo se puede escribir un compilador LISP en LISP? ¿O debería ser esta una pregunta nueva por completo?

+1

¿No fue el primer compilador de C++ escrito por Bjarne Stroustroup en C++ (cuando aún se llamaba "C With Classes")? Lo que consideraría aún más impresionante, ya que C++ no es un lenguaje interpretado sino que requiere un compilador. – Matthias

+1

Que es precisamente lo que no entiendo :) – kji

+5

El Nuevo Libro del Dragón, Primera Edición (aléjate de la segunda edición cargada de errores) explica el arranque del compilador. –

Respuesta

14

Supongo que Java requiere una máquina virtual is incorrect to begin with.

+1

El * idioma * java puede no requerir una máquina virtual, pero el término "java" abarca más que solo el idioma, sino que también incluye la máquina virtual. – skaffman

+0

Y Maxine al menos parece necesitar una JVK1.6 JVM para funcionar encima. – Thilo

+0

@kji: Creo que estaba equivocado. Parece que Maxine compila a un ejecutable nativo, por lo que no es necesario JDK JVM después de construir Maxine initally (todavía necesita una biblioteca de clases, creo). – Thilo

1

El código de Java se puede compilar directamente en código de máquina para que no se necesite una máquina virtual.

0

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

6

La JVM que necesita para arrancar una JVM escrita en Java probablemente no necesita muchas funciones (como recolección de basura y JIT), podría ser muy simple. Todas las características más avanzadas podrían implementarse en Java (que parece ser exactamente el punto de Maxine, para experimentar con nuevas ideas en tecnología JVM).

Además, Maxine contiene código C, lo que supongo que constituye un entorno de tiempo de ejecución mínimo que se utiliza para hacer funcionar el resto de Maxine. Considero que los bits interesantes (compilador JIT, recolección de basura) se implementan completamente en Java.

+0

buena explicación, gracias – kji

+0

No. El código C en Maxine se usa más como un lenguaje de definición de datos, en realidad no implementa nada interesante. El sistema operativo espera que ciertas estructuras se distribuyan de cierta manera específica en la memoria, y el compilador de C sabe cómo hacerlo, por lo que Maxine usa C para obtener estas estructuras distribuidas correctamente. Pero hay pocos lugares que usan C: un iniciador mínimo, que carga la imagen de VM en la memoria, escribe la dirección de carga en una ubicación específica dentro de la imagen y luego salta a otra ubicación específica. El depurador, porque Maxine usa las instalaciones de depuración de C del sistema operativo. –

+0

La parte de bajo nivel de JNI, porque bien, todo el punto de JNI es la integración con C. Y la parte de bajo nivel de enhebrar, porque Maxine usa hilos nativos que son muy diferentes de un sistema a otro. –

0

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 comienzan como auto-hosting - Comienzan la vida de haber sido construida sobre una plataforma existente: en un cierto punto se vuelven lo suficientemente funcionales como para permitir que se escriban programas que entiendan la sintaxis en la que está escrito.

Hay un gran ejemplo en el clásico libro AWK, que presenta un programa AWK que puede analizar (una versión reducida, como ocurre) otros programas AWK: ver el enlace a continuación.

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

Creo que es importante recordar esto: si tiene (por ejemplo) una JVM escrita en Java que pueda ejecutar código Java Byte: la JVM que ejecuta Java JVM tiene que ser alojada de forma nativa (quizás esta JVM era escrito en 'C' y luego compilado en código máquina): esto es cierto en cualquier caso de un programa de autohospedaje eventualmente - en algún lugar a lo largo de la línea.

Por lo tanto, se elimina el misterio, porque en algún punto, hay un programa nativo de código máquina funcionando debajo de todo.

Es un poco equivalente de ser capaz de describir el idioma inglés (etc) usando el idioma inglés en sí ... quizás ...

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

2

tuve un vistazo a Maxine la semana pasada y se preguntaba lo mismo :)

Desde el Maxine documentation:

1 Construyendo el imagen de inicio

Ahora construyamos una [imagen de arranque]. En este paso, Maxine se ejecuta en un host JVM para configurar un prototipo, entonces compila su propio código y datos a crear un programa ejecutable para la plataforma objetivo.

2 Ejecución de Maxine

Ahora que Maxine ha compilado en sí, que puede funcionar como un estándar de Java VM. El comando max vm maneja los detalles de las rutas de clase y biblioteca y proporciona una interfaz similar al comando java launcher.

0

Sé que esta publicación es antigua, pero pensé que podría agregar un poco a la discusión, ya que son puntos que se han perdido. Entonces, los futuros lectores pueden encontrar esto útil.

Me pregunto si a todos les falta el punto aquí. Puede escribir casi cualquier tipo de compilador, intérprete o máquina virtual en casi cualquier idioma. Cuando se usa C para escribir un compilador de C, se necesita un compilador de C para compilar el nuevo compilador. Sin embargo, el resultado es un código nativo que se ejecuta en la plataforma designada. El hecho de que la JVM esté escrita en el lenguaje que se ejecuta en la JVM no significa que la salida deba generar código que se ejecute en la JVM. Por ejemplo, puede escribir C, Basic, Pascal Compilers o incluso ensambladores en Java. En este caso, necesitará la JVM para crear el compilador o el ensamblador, pero una vez creado, es posible que ya no necesite la JVM si el código inicial dio como resultado un código nativo. Otro enfoque es escribir un traductor que toma un idioma de entrada y lo convierte a un lenguaje de máquina nativo para que pueda escribir su programa en el lenguaje A que compila en el lenguaje B que luego se compila en código máquina. En el mundo del microcontrolador ves esto mucho. Alguien quiere escribir programas en Basic o Java, por lo que escribe el compilador Basic/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 compilador nativo de Basic/Java. Este enfoque generalmente es más fácil que escribir el compilador de Basic/Java directamente en código de máquina.

Hace muchos años escribí programas BasicA y GWBasic que producían código de ensamblaje para micros 6800 y Z80. Mi punto es que la salida no tiene que ser del mismo estilo que la entrada o el objetivo. ES DECIR. El hecho de que esté escribiendo una JVM en Java no significa que el resultado final deba ejecutarse bajo una Java JVM.

Cuestiones relacionadas