bien sé que esto: Escribimos código fuente de Java, el compilador, que es independiente de la plataforma que se traduce en bytecode,
En realidad, el propio compilador funciona como un ejecutable nativo (de ahí javac.exe) Y es cierto, transforma el archivo fuente en bytecode. El bytecode es independiente de la plataforma, ya que está dirigido a Java Virtual Machine.
luego el jvm que depende de la plataforma lo traduce en código máquina.
No siempre. En cuanto a la JVM de Sun, hay dos jvms: cliente y servidor. Ambos pueden, pero ciertamente no tienen que compilar a código nativo.
Así que desde el principio, escribimos el código fuente de Java. El compilador javac.exe es un archivo .exe. ¿Qué es exactamente este archivo .exe? ¿No está el compilador de Java escrito en Java, entonces, ¿cómo es que hay un archivo .exe que lo ejecuta?
Este archivo exe
es un bytecode envuelto de java. Es por conveniencia: para evitar secuencias de comandos complicadas por lotes. Inicia una JVM y ejecuta el compilador.
Si el código del compilador está escrito es java, entonces ¿cómo es que el código del compilador se ejecuta en la etapa de compilación, ya que es el trabajo de jvm ejecutar el código java.
Eso es exactamente lo que hace el código de envoltura.
¿Cómo puede un lenguaje compilar su propio código de idioma? Todo parece un problema de huevo y pollo para mí.
Cierto, confuso a primera vista. Sin embargo, no es solo la expresión idiomática de Java. El compilador de Ada también está escrito en Ada. Puede parecer un "problema de huevo y gallina", pero en realidad solo es un problema de arranque.
¿Qué contiene exactamente el archivo .class? ¿Es un árbol de sintaxis abstracta en forma de texto, es información tabular, qué es?
No es Resumen Sintaxis Árbol. AST solo lo usa el tokenizador y el compilador en el momento de la compilación para representar el código en la memoria. El archivo .class
es como un ensamblado, pero para JVM. JVM a su vez es una máquina abstracta que puede ejecutar un lenguaje de máquina especializado, dirigido solo a la máquina virtual. En su forma más simple, el archivo .class
tiene una estructura muy similar al ensamblaje normal. Al principio se declaran todas las variables estáticas, luego vienen algunas tablas de firmas de funciones externas y, por último, el código de máquina.
Si es realmente curioso Puede profundizar en el archivo de clase utilizando la utilidad "javap". A continuación se muestra (ofuscado) de salida de invocar javap -c Main
:
0: new #2; //class SomeObject
3: dup
4: invokespecial #3; //Method SomeObject."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4; //Method SomeObject.doSomething:()V
12: return
lo que debe tener una idea ya lo que realmente es.
nadie me puede decir de manera clara y detallada cómo se convierte mi código fuente de Java en código máquina.
creo que debería ser más clara en este momento, pero aquí es breve resumen:
se invoca javac
que apunta al archivo de código fuente. El lector interno (o tokenizer) de javac lee su archivo y crea un AST real a partir de él. Todos los errores de sintaxis provienen de esta etapa.
El javac
no ha terminado su trabajo todavía. Cuando tiene AST, la compilación verdadera puede comenzar. Utiliza el patrón de visitante para recorrer AST y resuelve dependencias externas para agregar significado (semántica) al código. El producto terminado se guarda como un archivo .class
que contiene bytecode.
Ahora es el momento de ejecutar la cosa. Invoque java
con el nombre de .classfile. Ahora la JVM comienza de nuevo, pero a interprete Su código. La JVM puede, o no puede compilar su código de bytes abstracto en ensamblado nativo. El compilador HotSpot de Sun junto con la compilación Just In Time pueden hacerlo si es necesario. El código de ejecución es constantemente perfilado por la JVM y recompilado al código nativo si se cumplen ciertas reglas. Más comúnmente, el código caliente es el primero en compilar de forma nativa.
Editar: Sin la javac
habría que invocar el compilador usando algo similar a esto:
%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompile
Como se puede ver que está llamando a la API privada de Sun por lo que ha obligado a la implementación de Sun JDK. Haría que los sistemas de construcción dependieran de ello. Si se cambia a cualquier otro JDK (el wiki lista 5 además del de Sun), entonces el código anterior debe actualizarse para reflejar el cambio (ya que es poco probable que el compilador resida en el paquete com.sun.tools.javac). Otros compiladores podrían escribirse en código nativo.
Así que la forma estándar es enviar el contenedor javac
con JDK.
Un idioma puede compilar fácilmente su propio código de idioma. Los compiladores C/C++ a menudo se escriben en C o C++, el compilador de lenguaje cobra está escrito en cobra, y hay muchos ejemplos de compiladores http://en.wikipedia.org/wiki/Self-hosting. – jcao219
El compilador no tiene que ser independiente de la plataforma, solo tiene que cumplir con las especificaciones que solo especifican entrada y salida. Podrías escribir un compilador en perl para todo el bytecode resultante. –
pregunta relacionada con stackoverflow: http://stackoverflow.com/questions/1220914/in-which-language-java-compiler-jvm-and-java-is-written – jvdneste