Las máquinas virtuales son programas o software que recrean o simulan una computadora funcionando dentro del sistema operativo de un computador real. Por lo tanto, usan su propio sistema operativo, que puede ser igual o totalmente diferente al del sistema anfitrión y aplican su propio conjunto de instrucciones, manejo de memoria y acceso a periféricos y pantallas.
Ejemplo de este tipo de software es la Máquina Virtual Java o JVM (Java Virtual Machine en inglés) o el CLR basado en la plataforma .NET Framework de la empresa Microsoft. En este artículo vamos a explicarte en qué consiste la Máquina Virtual Java
La Máquina Virtual Java es una máquina de proceso nativo, es decir, que es ejecutable en una plataforma específica, capaz de interpretar y ejecutar instrucciones expresadas en un código binario especial, en este caso el Byte Code, que es generado a su vez por el compilador del lenguaje de programación conocido como lenguaje Java.
La virtualización, clave del funcionamiento de la Máquina Virtual Java
Gracias a la capacidad de los procesadores modernos de virtualizar otras arquitecturas a través de la interpretación o traducción en tiempo real del “idioma” en que funcionan estas, es muy facil crear máquinas virtuales cuyo sistema operativo se ejecuta sin ninguna modificación en otras plataformas, ya sean x86, x86–64, ARM, etc.
Diagrama del funcionamiento de una Máquina Virtual JavaAdemás las máquinas virtuales se pueden crear con facilidad a través de varios programas disponibles hoy en día para diversos sistemas operativos, que cuentan con métodos sencillos para configurar la memoria, disco y otras características de las máquinas, tomando parte de los recursos del equipo donde se ejecutan.
Sin embargo, este tipo de programas consumen muchos más recursos que un simple emulador, ya que obligan al procesador del equipo anfitrión a procesar los datos binarios de su propio sistema operativo además del lenguaje del sistema operativo de la máquina que está virtualizando.
Otro problema es que un programa corriendo dentro de una máquina virtual tendrá menor rendimiento que si corriera en un equipo físico con el mismo sistema operativo, pues el procesador del anfitrión debe hacer una traducción del lenguaje entre ambos sistemas en tiempo real.
En los últimos años esto se ha solucionado en gran parte al incorporar un compilador en tiempo real (JIT o Just-in-Time Compiler) en la programación del software de virtualización.
El JIT se encarga de compilar a instrucciones nativas la funcionalidad de los programas escritos para la máquina virtual.
Igualmente, el acceso a los recursos nativos entre una máquina virtual y el equipo anfitirión no siempre es 100 por ciento instantánea, por lo que las primeras deben incorporar tecnologías que faciliten este tipo de funciones.
La Máquina Virtual Java funciona en base a programas escritos en lenguaje Java, de donde viene su nombre y que fue creado por la empresa Sun Microsystems en el año 1995.
El lenguaje Java es uno de los denominados “lenguajes de programación de alto nivel”, junto a C, C++, y Python. Esto se debe a que tienen un nivel de abstracción mucho mayor que otros, lo que les permite “hablarle” al equipo anfitrión de una manera muy directa y específica, con instrucciones que casi se acercan al lenguaje de máquina o ensamblador que usa el procesador.
Sin embargo, muchos consideran realmente que el código binario de Java no es un lenguaje de alto nivel, sino un verdadero código máquina de bajo nivel, viable incluso como lenguaje de entrada para un microprocesador físico.
El código compilado en Java es traducido en tiempo real en la JVM para que lo corra el procesador del equipo anfitrión
Para explicar esta ventaja, diremos que por norma el compilador de un lenguaje de alto nivel se encarga de traducir el lenguaje usado por el programador para hacer el software y convertirlo en un “idioma” de compilador, que es fácilmente utilizable por el equipo a través de su sistema operativo.
Por ejemplo si compilas un código en C, obtendrás un programa ejecutable para un sistema operativo X, el cual se podrá ejecutar directamente contra el procesador del equipo en que está instalado en un lenguaje de máquina que este entiende perfectamente.
En el caso de Java y los lenguajes de la plataforma .NET de Microsoft, los mismos establecen un punto intermedio entre el código de alto nivel en el que se escriben los programas o software y el lenguaje de bajo nivel en que estos se traducen al ser compilados.
De esta manera, al compilar un programa escrito en lenguaje Java este no queda hecho en lenguaje de máquina o ensamblador, sino en un lenguaje intermedio llamado Byte Code.
Entre el Byte Code y el sistema operativo se ubica entonces la máquina virtual, que es el que se encargará en realidad de ejecutar el código compilado.
La Java Virtual Machine (JVM) recibe el código Byte Code obtenido de la compiliación de una determinada aplicación Java y la recompila en tiempo real al código nativo de la plataforma en que se está ejecutando.
Este método tiene como ventaja que facilita el trabajo de los programadores, pues es muy fácil crear una aplicación en Java y que luego esta se ejecute en cualquier sistema operativo a través de su implementación propia de la JVM, aprovechando que todos los sistemas modernos cuentan con esta herramienta hoy en día.
La Máquina Virtual Java ejecuta los programas como lo haría cualquier computadora real, usando los mismos componentes del sistema operativo que utilizaría el procesador.
De hecho, la Máquina Virtual Java funciona como una máquina real capaz de entender el Byte Code creado por el compilador del lenguaje Java usado por el programador y traducirlo en tiempo real a instrucciones nativas que el sistema operativo del equipo anfitrión puede entender y ejecutar de inmediato.
Puntos claves para entender una Máquina Virtual Java
Resumiendo lo explicado anteriormente, podemos decir que la Máquina Virtual Java tiene las siguientes características que facilitan su comprensión:
- Los programas Java se compilan a un formato binario .class que contiene instrucciones en un lenguaje de bajo nivel especial independiente de la plataforma, llamado Byte Code.
- La JVM está presente (o se puede instalar fácilmente) en casi todos los sistemas operativos del mundo y debe usarse para poder correr programas en Byte Code y traducirlo al lenguaje de máquina usado por la arquitectura del equipo en el que se esté trabajando, sea ARM, x86, x64, etc.
- Debido a que la JVM debe hacer una traducción instantánea de un juego de instrucciones en Byte Code al juego de instrucciones de la máquina real, la ejecución de sus aplicaciones puede mostrar cierto retraso. Para esto la JVM utiliza un componente llamado Just-in Time Compiler (Compilador en Tiempo Real o JIT) que se encarga de compilar al código nativo de la máquina las partes del programa que requieren mayor desempeño o se utilizan con más frecuencia.
Como referencia, podemos mencionar que la JVM de la empresa Oracle, o JrockKit, usa un compilador JIT en segundo plano que analiza el uso del Byte Code y lo optimiza las partes del programa que sea necesario según el uso que se le esté dando. También reanaliza el código ya compilado para mejorarlo continuamente.
La plataforma Java está presente hoy en día en prácticamente todo tipo de equipo electrónico de uso comercial o para el hogar, incluyendo neveras inteligentes, impresoras de tinta, sistemas de control o monitoreo de vehículos, etc.
La facilidad de uso de la JVM ha llevado a incorporarlo en la casi totalidad de los sistemas operativos privativos y libres que existen hoy en día. De aquí nace la frase publicitaria que mejor identifica a Java, “write once, write everywhere” que significa “escribe una vez, ejecuta en todas partes”.
z35W7z4v9z8w
Si has encontrado la información de este artículo valiosa, te pido el favor que nos ayudes a compartirla en tus redes sociales. Y si tienes alguna duda, comentario o quieres que escribamos sobre algún tema escríbeme a echan@maquinavirtual.net