proyecto - hola mundo java
¿Cómo exactamente tiene lugar la compilación java? (9)
Confundido por el proceso de compilación java
De acuerdo, sé esto: escribimos el código fuente de Java, el compilador que es independiente de la plataforma lo traduce en bytecode, luego el jvm que depende de la plataforma lo traduce en código de máquina.
Entonces, 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? 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 código java? ¿Cómo puede un lenguaje en sí mismo compilar su propio código de idioma? Todo parece un problema de huevo y pollo para mí.
Ahora, ¿qué contiene exactamente el archivo .class? ¿Es un árbol de sintaxis abstracta en forma de texto, es información tabular, qué es?
¿Alguien puede decirme una manera clara y detallada sobre cómo se convierte mi código fuente de Java en código máquina?
¿No está el compilador de Java escrito en Java, entonces, ¿cómo es que hay un archivo .exe que lo ejecuta?
¿De dónde obtienes esta información? El ejecutable de javac
podría escribirse en cualquier lenguaje de programación, es irrelevante, todo lo que es importante es que es un ejecutable que convierte los archivos .class
en archivos .class
.
Para obtener detalles sobre la especificación binaria de un archivo .class, puede encontrar estos capítulos en la Especificación del lenguaje Java útiles (aunque posiblemente un poco técnicos):
También puede echar un vistazo a la especificación de máquina virtual que cubre:
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?
El compilador de Java (al menos el que viene con Sun / Oracle JDK) está escrito en Java. javac.exe
es solo un javac.exe
que procesa los argumentos de línea de comandos, algunos de los cuales se pasan a la JVM que ejecuta el compilador, y otros al 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 código java? ¿Cómo puede un lenguaje en sí mismo compilar su propio código de idioma? Todo parece un problema de huevo y pollo para mí.
Muchos (si no la mayoría) compiladores están escritos en el lenguaje que compilan. Obviamente, en una etapa temprana el compilador tuvo que ser compilado por otra cosa, pero después de ese "arranque", cualquier versión nueva del compilador puede ser compilada por una versión anterior.
Ahora, ¿qué contiene exactamente el archivo .class? ¿Es un árbol de sintaxis abstracta en forma de texto, es información tabular, qué es?
Los detalles del formato de archivo de clase se describen en la especificación de Java Virtual Machine .
OK, sé esto: escribimos el código fuente de Java, el compilador que es independiente de la plataforma lo traduce en bytecode,
En realidad, el 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.
entonces 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.
Entonces, 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. 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 código java?
Eso es exactamente lo que hace el código de envoltura.
¿Cómo puede un lenguaje en sí mismo compilar su propio código de idioma? Todo parece un problema de huevo y pollo para mí.
Es 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.
Ahora, ¿qué contiene exactamente el archivo .class? ¿Es un árbol de sintaxis abstracta en forma de texto, es información tabular, qué es?
No es el Árbol de sintaxis abstracta. AST solo lo usa el tokenizador y el compilador en el momento de la compilación para representar el código en la memoria. .class
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 a la del 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 eres realmente curioso, puedes profundizar en el archivo class usando la utilidad "javap". Aquí está la salida de muestra (ofuscada) 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
Entonces ya deberías tener una idea de lo que realmente es.
¿Alguien puede decirme una manera clara y detallada sobre cómo se convierte mi código fuente de Java en código máquina?
Creo que debería estar más claro en este momento, pero aquí hay un breve resumen:
Invoca
javac
apuntando a su archivo de código fuente. El lector interno (o tokenizador) 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 ejecutarlo. Invoca a
java
con el nombre de .classfile. Ahora la JVM comienza de nuevo, pero para interpretar Tu 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. Lo más común es que el código de acceso sea el primero en compilar de forma nativa.
Editar: sin javac
uno tendría que invocar el compilador usando algo similar a esto:
%JDK_HOME%/bin/java.exe -cp:myclasspath com.sun.tools.javac.Main fileToCompile
Como puede ver, está llamando a la API privada de Sun, por lo que está vinculada 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.
Entonces, la forma estándar es enviar javac
contenedor javac
con JDK.
- archivo .java
- compilador (JAVA BUILD)
- .class (bytecode)
- JVM (el software del sistema generalmente se compila con ''C'')
- PLATAFORMA DE OPERACIÓN
- PROCESADOR
Bueno, javac y el jvm son típicamente binarios nativos. Están escritos en C o lo que sea. Sin duda es posible escribirlos en Java, solo necesitas una versión nativa primero. Esto se llama "ajuste de arranque".
Dato curioso: la mayoría de los compiladores que compilan en código nativo están escritos en su propio idioma. Sin embargo, todos tenían que tener una versión nativa escrita en otro idioma primero (generalmente C). El primer compilador de C, en comparación, se escribió en Assembler. Supongo que el primer ensamblador fue escrito en código de máquina. (O, usando mariposas ;)
Los archivos .class son bytecode generados por javac. No son textuales, son códigos binarios similares al código máquina (pero con un conjunto de instrucciones y arquitectura diferentes).
El jvm, en tiempo de ejecución, tiene dos opciones: puede interpretar el código de bytes (pretendiendo ser una CPU), o puede JIT (just-in-time) compilarlo en código máquina nativo. Este último es más rápido, por supuesto, pero más complejo.
El archivo .class contiene un bytecode que es algo así como un ensamblado de muy alto nivel . El compilador podría estar escrito en Java, pero la JVM tendría que compilarse en código nativo para evitar el problema del huevo y la gallina. Creo que está escrito en C, al igual que los niveles inferiores de las bibliotecas estándar. Cuando se ejecuta JVM, realiza una compilación justo a tiempo para convertir ese bytecode en instrucciones nativas.
El compilador fue escrito originalmente en C con bits de C ++ y supongo que todavía lo es (¿por qué crees que el compilador también está escrito en Java?). javac.exe es solo el código C / C ++ que es el compilador.
Como punto adicional, podrías escribir el compilador en Java, pero tienes razón, debes evitar el problema del huevo y la gallina. Para hacer esto, normalmente escribiría una o más herramientas de arranque en algo como C para poder compilar el compilador.
El archivo .class contiene los códigos de byte, el resultado del proceso de compilación javac y estas son las instrucciones que le dicen a la JVM qué hacer. En tiempo de ejecución, estos códigos de bytes se han traducido a instrucciones de CPU nativas (código de máquina) para que puedan ejecutarse en el hardware específico bajo la JVM.
Para complicar esto un poco, la JVM también optimiza y almacena en caché el código de máquina producido a partir de los códigos de bytes para evitar traducirlos repetidamente. Esto se conoce como compilación JIT y ocurre cuando el programa se está ejecutando y se están interpretando bytecodes.
Windows no sabe cómo invocar los programas Java antes de instalar un tiempo de ejecución Java, y Sun eligió tener comandos nativos que recopilan argumentos y luego invocan la JVM en lugar de vincular el sufijo jar al motor Java.
Breve explicación
Escriba el código en un editor de texto, guárdelo en un formato que el compilador comprenda: la extensión de archivo ".java" , javac (compilador de Java) lo convierte en un archivo de formato ".class" (código de byte - archivo de clase). JVM ejecuta el archivo .class en el sistema operativo en el que se encuentra.
Larga explicación
Recuerde siempre que java no es el idioma base que reconoce el sistema operativo. El código fuente de Java es interpretado en el sistema operativo por un traductor llamado Java Virtual Machine (JVM) . JVM no puede entender el código que usted escribe en un editor, necesita un código compilado. Aquí es donde un compilador entra en la imagen.
Cada proceso de computadora se entrega a la manipulación de la memoria. No podemos simplemente escribir código en un editor de texto y compilarlo. Necesitamos ponerlo en la memoria de la computadora, es decir, guardarlo antes de compilar.
¿Cómo reconocerá javac (compilador java) el texto guardado como el que se va a compilar? - Tenemos un formato de texto separado que el compilador reconoce, es decir .java . Guarde el archivo en la extensión .java y el compilador lo reconocerá y compilará cuando se le solicite.
¿Qué ocurre durante la compilación? - El compilador es un segundo traductor (no un término técnico) involucrado en el proceso, traduce el lenguaje entendido por el usuario (java) en el lenguaje entendido por JVM (código de byte - formato .class).
¿Qué pasa después de compilar? - El compilador produce un archivo .class que JVM entiende. El programa se ejecuta, es decir, JVM ejecuta el archivo .class en el sistema operativo.
Hechos que debes saber
1) Java no es multiplataforma , es independiente de la plataforma .
2) JVM se desarrolla utilizando C / C ++ . Una de las razones por las que las personas llaman a Java un lenguaje más lento que C / C ++
3) El código de bytes Java (.class) se encuentra en "Lenguaje ensamblador" , el único idioma que entiende JVM. Cualquier código que produzca un archivo .class en compilación o código Byte generado se puede ejecutar en la JVM.