A continuación se explicará las fases por las que pasa un programa en java, desde la cabeza del programador, hasta la ejecución en un sistema. Esta explicación estará basada en un ejemplo similar que propone Deitel en su libro “How to program in Java”.
Las fases de un programa en java son las siguientes:
- Fase de Creación o
Edición
- Fase de Compilación
- Fase de Carga del programa en memoria
- Fase de Verificación de Bytecodes
- Fase de Ejecución
1. Fase de creación o edición
Lo primero que hace un programador una vez que ya tiene en
mente la aplicación que desea desarrollar es empezar a escribir el código. Esto
es lo que se conoce como fase de edición y el resultado de la misma es el
código fuente.
Podemos escribir un programa en java usando algo tan simple
como el editor de texto en Windows; vi, vim o gedit en GNU/linux; o bien podemos
usar una herramienta más orientada al desarrollo, o sea una IDE, como puede ser Eclipse, Netbeans, Sublime, entre
otras.
El archivo que contiene el código fuente de un programa en
java tendrá la extensión .java.
Un ejemplo simple de una aplicación que imprima algo en
consola es la siguiente:
El nombre del archivo .java debe coincidir con el nombre de
la clase (class), en este caso Holamundo.java
2. Fase de compilación
Una vez el programador baja su idea a un código fuente, es hora de compilar el mismo. Este proceso convierte nuestro código fuente en códigos de bytes que más tarde serán interpretados por la JVM.
A diferencia de muchos otros lenguajes, los códigos de
bytes compilados, pueden ejecutarse en cualquier sistema (Linux, Windows,
MacOS, etc) que tenga la JVM correspondiente. Esto les da la característica de
portabilidad a los mismos, lo cual es uno de los puntos fuertes de java.
Para compilar el código fuente, puede hacerse a través de
IDE o por consola, con el comando javac (java compiler). Para el ejemplo sería:
javac Holamundo.java
Si todo va bien, la salida de esto es un archivo Holamundo.class,
el cual contiene los bytecodes de la aplicación.
3. Fase de Carga del programa en memoria
Cuando se ejecuta el programa en java con el comando java,
entra en juego un componente llamado cargador de clases. Este, carga las clases
dinámicamente en la JVM. Cabe recordar que la JVM es como una especie de
computadora virtual. Lo primero que hará el cargador de clases es intentar
cargar nuestro .class en memoria e ir cargando todos los .class a los que el
programa (en el ejemplo Holamundo.class) haga referencia. Las clases a las que
la aplicación haga referencia pueden encontrarse localmente en el disco duro o
bien remotamente.
Todas las JVMs incluyen un cargador de clases, el cual es
conocido como cargador de clases primordial.
4. Fase de Verificación de Bytecodes
A fin de asegurar que no se violan restricciones de
seguridad, a medida que se van cargando las clases en memoria, el verificador
de bytecodes examina los bytecodes para asegurar que sean válidos. Esto se
realiza por que el sistema Java run-time no confía en el código que se está
cargando.
Se realizan pruebas tales como que el formato del fragmento
de código sea el correcto, así como también:
- Que no se forjen punteros
- Que no haya violaciones de acceso a la memoria
- Que los objetos sean accedidos por lo que son (Por ejemplo, que un objeto System siempre sea usado como System y nada más)
5. Fase de Ejecución
Esta es la fase donde la JVM ejecuta las acciones
especificadas por los bytecodes cargados en su memoria.
Los archivos .class se cargan en la memoria virtual y es la
máquina virtual la que se encarga de traducir estas instrucciones que ella
puede entender a instrucciones que entiende el Sistema Operativo y hardware
subyacente.
Como se observa en la imagen, la JVM actúa como una capa
intermedia entre su lenguaje “máquina” (entendible por la JVM) y el sistema
subyacente. Esto hace que el código compilado sea independiente de la plataforma
en la cual se va a ejecutar.
A fin de ganar eficiencia en el proceso de interpretar el
código que la JVM puede entender a código que sea entendible por la
computadora, las JVMs actuales utilizan una técnica conocida como compilación
Just in Time o JIT (También se lo conoce como HotSpot compiler). Cuando se
detecta que hay bytecodes que se ejecutan con frecuencia el compilador JIT los
traduce a lenguaje de máquina, con lo cual la próxima vez que la JVM encuentre
estos bytecodes los ejecutará directamente sin necesidad de pasar por el
proceso de interpretación, sumando eficiencia a la ejecución del programa en
java.
Referencias
Deitel, H. M. (2005). Java How to Program in Java. Prentice-Hall.
Osorio, V. (23 de Agosto de 2010). Lo Que Andabas Buscando. Recuperado el 15 de Julio de 2020, de http://virginia-ingsystem10.blogspot.com/2010/08/proceso-de-compilacion-en-java.html
SITEOWNER. (18 de Julio de 2015). KNOW DIMENSION. Recuperado el 16 de Julio de 2020, de http://knowdimension.com/blog/lenguajes/programando-en-java-de-la-escritura-a-la-ejecucion/#:~:text=Las%20fases%20de%20un%20programa,Carga%20del%20programa%20en%20memoria
Un Aprendiz De Programación. (2012). Obtenido de http://unaprendizprogramacion.blogspot.com/2015/08/fases-de-un-programa-en-java.html