JVM: La Máquina Virtual Java
Desde muy temprano en la historia de la informática, los desarrolladores tienen disponibles los llamados lenguajes de programación de alto nivel.
Estos lenguajes, tales como Java, Python o C++ son utilizados para que el usuario pueda interactuar con la computadora en un lenguaje más humano.
Sin la participación de los lenguajes de programación en esta interacción, sería imposible para las personas comunicarse de manera sencilla con un dispositivo informático.
Como sabes, las computadoras y demás dispositivos utilizan internamente el llamado lenguaje máquina, el cual es inaccesible al entendimiento de los humanos.
Para poder utilizar un procesador, primero se escribe un programa, y luego se lo compila. Este procedimiento convierte al programa, escrito de un modo entendible a través de comandos y demás, en lenguaje máquina.
Este es utilizado directamente por el procesador a través de las órdenes que efectúa el sistema operativo.
En pocas palabras, cuando se compila un software, se obtiene un ejecutable, el cual puede ser utilizado sólo en las plataformas para la que fue escrito, es decir Windows, Unix u otras. Aquí es donde entra en juego la Máquina Virtual Java.
Qué vas a encontrar aquí: Qué es la Máquina Virtual Java. Cómo funciona la Máquina Virtual Java. Qué es el Bytecode JVM. Entorno de ejecución JVM. Las ventajas de JVM. Procesadores con Java como lenguaje de bajo nivel.
Qué es JVM o Máquina Virtual Java
Antes de comenzar a adentrarte de lleno con la máquina virtual Java o JVM “Java Virtual Machine”, en inglés, deberías primero conocer los conceptos más importantes.
Sin duda, el concepto más importante de la programación es el de la compilación.
Concretamente, el significado de “compilar” es el de traducir un código realizado en un lenguaje de programación en un lenguaje que pueda ser entendido por una computadora.
Así como el lenguaje de programación lo podemos entender las personas, el lenguaje que entienden las computadoras es inentendible para nosotros.
Al mismo se lo denomina “lenguaje máquina”, y para cualquier ser humano, sería imposible intentar trabajar directamente con el lenguaje que entienden los procesadores.
Es por este motivo que las personas necesitamos un lenguaje de programación para conseguir que las computadoras hagan lo que queremos.
Cabe destacar que este código puede ser realizado en cualquiera de los lenguajes de programación modernos.
Si quieres saber más sobre lenguajes de programación, en este post encontrarás todo lo que necesitas: Qué es un lenguaje de programación.
El proceso es bastante simple, por lo menos en lo teórico. El proceso sería en forma básica el siguiente:
- Escribes el código en Java, Fortran, C o cualquiera de los otros lenguajes de programación.
- Al finalizar, compilas el código que acabas de escribir.
- Obtienes tu ejecutable.
En este proceso el compilador se encarga, además de traducir tu código en lenguaje máquina, de asegurarte que tu código pueda ser ejecutado sin dificultades en una computadora.
Hasta aquí, en apariencia simple y claro como el agua. Sin embargo, el ejecutable que acabas de compilar no lo puedes ejecutar en cualquier tipo de computadora.
Si has escrito y compilado un ejecutable para Windows, no lo podrás usar en otra plataforma como Linux o Mac.
Aquí es donde Java entra en juego. Desde sus inicios, Java fue desarrollado con el objetivo de ser independiente de la plataforma y del tipo de hardware que se ejecuta en la computadora.
Esta JVM es capaz de ejecutar las instrucciones generadas por un compilador Java. Para asegurarse que se asilen correctamente las instrucciones que son parte de otra plataforma, se cuenta con el cargador de clases y el gestor de seguridad,
Asimismo, se puede limitar el acceso a los recursos del sistema. Esto significa que siempre las clases que se carguen estarán controladas con respecto a que recursos pueden usar y a cuales no.
¿Cómo se pudo lograr esto? Básicamente añadiendo un paso extra en la cadena de procesos.
¿Cómo funciona la JVM o Máquina Virtual Java?
La máquina virtual de Java es un entorno de tiempo de ejecución el cual es posible utilizar en diferentes escenarios, como por ejemplo desde un navegador web, empotrado en un dispositivo o un sistema operativo.
Los programas escritos en el lenguaje de programación Java funcionan de manera diferente a los ejecutables de otros lenguajes.
La diferencia fundamental entre ellos es que los programas escritos en Java no se ejecutan en el hardware real de tu computadora. Se ejecutan en una llamada “Máquina virtual”.
Esta máquina virtual es creada directamente por Java, simulando un sistema operativo y un hardware específico.
En pocas palabras, a la ejecución de un programa de Java se le añade un proceso más, quedando de este modo.
- Código fuente
- Bytecode, del cual hablaremos más adelante.
- Máquina Virtual Java, la cual interpreta el Bytecode.
- Traducción del código a la plataforma en que se ejecutará el programa.
- Ejecución del programa.
En pocas palabras, la máquina virtual Java es una abstracción de una máquina real, capaz de procesar el Bytecode creado por el compilador de Java y traducirlo al código nativo del sistema operativo en donde se ejecuta la aplicación.
Qué es el Bytecode de JVM
Al contrario que los lenguajes de programación convencionales, al momento en que compilas tu aplicación escrita en Java, no se compila directamente a lenguaje máquina
Este código se compila a un lenguaje intermedio, llamado Bytecode.
Para poder ejecutar estos programas de Bytecode de Java, se debe contar con la presencia de una máquina virtual, que es la que va a ejecutar el código.
En este punto es necesaria una aclaración muy importante. La máquina virtual Java nada tiene que ver con las máquinas virtuales como VMWare, VirtualBox, QEMU y Parallels.
Si quieres conocer más acerca de la virtualización, en este post encontrarás info realmente muy interesante: ¿Qué es virtualización?
Estas están más relacionadas con la virtualización de sistemas operativos completos, y están muy alejadas del concepto de la Máquina Virtual Java.
Cabe destacar que el concepto de la máquina virtual no es propiedad de Java. S mucho más viejo. Este concepto se puede rastrear directamente hasta la década de 1980, en implementaciones como el p-Code de Pascal o determinados compiladores del lenguaje Cobol.
Retomando, mencionamos que del código fuente, este pasa a Bytecode y se interpreta el Bytecode mediante la JVM.
A partir de este punto, falta un paso más, que es el de traducir el Bytecode al código nativo de la plataforma en la que se ejecutará este programa. Esto también es llevado a cabo por la Máquina Virtual Java.
¿Para qué todo este lío? Son varios los motivos por los cuales elegir este tipo de implementación. Para graficarlo mejor existe una frase muy importante:
“Write once, run everywhere”. Esto en español significa “Escribe una vez, ejecuta en todos lados”. Esto significa que puedes crear un solo código para todas las plataformas, como por ejemplo Windows, Linux, Mac o aún en Android.
Esta frase fue un slogan creado por Sun Microsystems precisamente para mostrar los espectaculares beneficios para la multiplataforma que poseía Java.
Obviamente que la más importante ventaja de Java es la posibilidad de crear un programa que se pueda ejecutar en cualquier plataforma, de manera muy sencilla y rápida.
Entorno de ejecución JVM
Como sabes, una máquina virtual Java es una máquina virtual de proceso nativo. Esto significa que se ejecuta en una plataforma específica.
Esta máquina es capaz de interpretar y ejecutar órdenes escritas en Bytecode, el código binario propio de Java. Este es generado por el compilador del lenguaje Java.
Ahora, este código binario de Java, el Bytecode, no es un lenguaje de alto nivel. Se trata en verdad de un código máquina de bajo nivel, el cual hasta incluso puede ser utilizado como lenguaje propio para un procesador físico.
Con el fin de ejecutar una app en una JVM, el programa deberá ser compilado teniendo en cuenta un formato binario portable estándar. Estos habitualmente son archivos con la extensión “class”.
En este sentido, una app puede estar compuesta de muchas clases distintas, todas las cuales deberán tener asociados sus propios archivos de tipo “class”.
Actualmente, y con el propósito de poder distribuir más fácilmente las aplicaciones, estos archivos “class” pueden empaquetarse juntos en una archivo con extensión “Jar”.
Este método de distribución data de cuando se estaban desarrollando los primeros applets de Java, cuando las aplicaciones debían descargar los archivos de clase que le eran necesarios en tiempo de ejecución.
Con el empaquetado en formato “Jar” se evitaba el problema de la sobrecarga de la red. Recuerda que la Internet de hace unos años no tenía la velocidad actual. Todo tardaba mucho más en descargarse.
Ejecución de código JVM
Podría decirse en pocas palabras que una máquina virtual de Java debería ser considerada como una especie de puente entre el Bytecode, que es el resultado de la compilación, y el sistema en donde será ejecutada la aplicación.
Los programas compilados son ejecutados por la máquina virtual Java. Esta máquina emula un conjunto de instrucciones específico. Esto se lleva a cabo de forma habitual mediante un compilador JIT (Just in Time).
Sin embargo, también se puede conseguir mediante un proceso de interpretación.
La opción de ejecución mediante un compilador Just in Time convertirá el Bytecode a código nativo directamente en la plataforma de destino.
Con esto se obtiene una ejecución del programa mucho más rápida. Sin embargo, el tiempo necesario para la compilación muchas veces complica la velocidad de ejecución.
Plataformas y JVM
Cuando se escribe una aplicación Java, es necesario orientar su desarrollo hacia el objetivo de que deberá ejecutarse en una Máquina Virtual Java específica.
Esto es así debido a la diversidad de plataformas en las cuales está presente JVM.
En este sentido, cada dispositivo cuenta con una JVM específica. Sea un dispositivo empotrado, una computadora con Linux, Windows o cualquier otro sistema operativo, o hasta incluso un teléfono celular.
En todos los casos mencionados, todas las máquinas virtuales Java son capaces de reconocer el conjunto de instrucciones de la plataforma destino.
En base a ello, traducirá el programa escrito en lenguaje Java, el cual es común para todas las plataformas, al código nativo propio de la plataforma de hardware en donde se instalará o ejecutará.
Las ventajas de JVM
Además de todas las ventajas relacionadas con la facilidad de aprendizaje y utilización de Java, su utilización tiene otras ventajas. Como por ejemplo la posibilidad de crear un solo programa y que este se pueda ejecutar en múltiples arquitecturas sin modificaciones.
Este hecho es muy apreciado en muchos ámbitos, en donde existen diferentes sistemas operativos o dispositivos en la misma estructura.
Con esto en mente, Sun Microsystems ha desarrollado múltiples máquinas virtuales Java para diferentes arquitecturas. Esto permite, por ejemplo, que un programa escrito en Java para Windows pueda ser ejecutado en Linux sin problemas, y viceversa.
Para que esto sea así, lo único que hace falta es que tener disponible una máquina virtual Java para todos estos sistemas.
¿Por qué no hay procesadores que usen Java?
Mencionamos más arriba que el Bytecode es un lenguaje de bajo nivel, que hasta puede ser interpretado como entrada para un procesador.
Imagina la facilidad de uso de un sistema compuesto por Java y un procesador entendiéndose juntos directamente. Para los programadores sería maravilloso.
Obvio que Sun, la compañía detrás de Java, lo ha intentado, pero todos los esfuerzos que ha hecho en este sentido no han dado resultados, lamentablemente.
Deja una respuesta