Usuario:Aviguille/Máquina virtual de Java

De Wikipedia, la enciclopedia libre

La primera máquina virtual de Java (JVM o Java Virtual Machine), desarrollada por Sun Microsystems, es una máquina virtual que ejecuta el código resultante de la compilación de un programa escrito mediante el lenguaje de programación Java, conocido como bytecode de Java. Aunque copiladores de otros lenguajes pueden dar lugar a bytecode ejecutable sobre la JVM.

La JVM es un componente crucial de la plataforma Java. La disponibilidad de gran cantidad de tipos de hardware y plataformas software hacen que Java pueda funcionar tanto como un software intermediario entre aplicaciones (middleware), y como una plataforma en si misma. De ahí la expresión “Write once, run anywhere” (escribir una vez, ejecutar en cualquier parte).

A partir de J2SE 5.0, los cambios en la especificación de la JVM han sido desarrollados bajo el organismo Java Community Process en forma de la JSR (Java Specification Request) 924[1]​. Desde el año 2006, los cambios en la especificación para recoger los cambios propuestos al formato de ficheros de clase (JSR 202[2]​) se están realizando como parte del mantenimiento de la JSR 924. La especificación de la JVM se encuentra publicada en forma de libro[3]​, conocido como el “libro azul”. El prefacio reza así:

“Pretendemos que esta especificación documente suficientemente la Máquina Virtual de Java para hacer posibles implementaciones compatibles de entornos de confianza. Sun ofrece mecanismos para verificar una correcta operación de las implementaciones de la Máquina Virtual de Java.”

Kaffe es un ejemplo de una de estas implementaciones “limpias” de Java. Sun mantiene el control sobre la marca registrada “Java”, que usa para certificar aquellas implementaciones que se son perfectamente compatibles con las especificaciones de Sun.

Entorno de ejecución[editar]

Un programa escrito en Java, debe pasar por un proceso que se llama compilación. Si este término es generalmente usado para el mecanismo encargado de convertir código fuente a código nativo de la plataforma sobre la que pretende ejecutarse, en Java, la compilación produce un código intermedio (el bytecode) destinado a ser ejecutado por la máquina virtual de Java. Este bytecode toma la forma de un fichero con extensión “.class”. Todo programa en Java está compuesto por una o varias clases, y cada clase estará en un archivo diferente, tanto antes como después de la compilación.

Para facilitar la distribución de grandes aplicaciones, las clases que lo forman pueden ser empaquetadas juntas, tras su compilación, en un único archivo (con extensión “.jar”). Este archivo puede entonces ser ejecutado por la JVM de dos formas distintas. La forma original era mediante un proceso conocido como interpretación, por el cual se lleva a cabo la emulación del conjunto de instrucciones de la JVM, y las instrucciones se ejecutan secuencialmente. Este proceso, como suele serlo generalmente la ejecución de programas mediante la interpretación suele ser lento, por lo que más modernamente se lleva a cabo un proceso conocido como compilación JIT (Just In Time, o “al momento”). Esta compilación se aplica sobre el bytecode generado tras la primera compilación al inicio de la aplicación, y da como resultado una ejecución mucho más eficiente, aunque con la penalización en tiempo que conlleva esta segunda compilación. Un ejemplo de este tipo de compilador es el HotSpot de Sun.


Verificación del bytecode[editar]

La máquina virtual de Java “verifica” todo el bytecode antes de su ejecución. Esto significa que sólo una parte de éste puede dar lugar a código ejecutable. Por ejemplo, una instrucción JUMP (de salto) sólo puede dirigirse a una instrucción dentro de la misma función. Por esta razón, el hecho de que la JVM sea una arquitectura basada en pila no implica una penalización en tiempo cuando se emula sobre una arquitectura basada en registros, al usar un compilador JIT. La verificación de código asegura que no se pueda acceder a zonas de memoria restringidas. Por tanto, la protección de memoria la lleva a cabo la propia JVM sin necesidad de una unidad explícita para la gestión de memoria o MMU (Memory Management Unit), siendo útil en sistemas que no cuentan con este tipo de hardware.

El bytecode de Java[editar]

La máquina virtual de Java (JVM) soporta instrucciones para los siguientes grupos de tareas

  • Carga y almacenamiento
  • Aritméticas
  • Conversión de tipos
  • Creación de objetos y su manipulación
  • Gestión de la pila (push / pop, meter / sacar)
  • Saltos
  • Llamada a métodos y salida de estos
  • Generación de excepciones

El objetivo es la compatibilidad. Cada sistema operativo y arquitectura en que tenga que ejecutarse una aplicación Java debe tener su propia implementación de la JVM. Estas máquinas virtuales interpretan el bytecode de igual forma desde el punto de vista semántico, pero cada implementación puede ser distinta. Mas complicado que la emulación del bytecode es la implementación completa y eficiente de la API de Java, en cada plataforma destino.

Ejecución segura de código remoto[editar]

La arquitectura de las máquinas virtuales proporciona un gran control sobre las acciones que se pueden ejecutar sobre el sistema. Esta es la premisa que se tuvo en mente para permitir la ejecución de código inseguro procedente de fuentes remotas, el ejemplo más claro es el de las applets de Java. Un applet es ejecutada en el marco de la JVM dentro de un navegador Web, y ejecuta código procedente de un servidor remoto. Este código es ejecutado dentro de un entorno de alta seguridad, diseñado para proteger al usuario de código malicioso o pernicioso. Empresas que lo deseen y dispongan de activo para ello, pueden “firmar” sus applets como “seguras”, dándoles permiso para salir de esa caja de seguridad y acceder al sistema de ficheros o a funciones de red, presumiblemente bajo el control y permiso del usuario.

Referencias[editar]

  1. JSR 924 – recoge cambios en la especificación de la JVM comenzando con J2SE 5.0
  2. JSR 202 – especifica una serie de cambios en el formato de ficheros de clase
  3. The Java Virtual Machine Specification (la primera y la segunda edición se encuentran disponibles en la Web)
  1. Clarificación y correcciones a la especificación de la Máquina Virtual de Java, Segunda Edición incluye los cambios a realizar para soportar J2SE 5.0 y JSR 45
  2. JSR 45 – Especificación de cambios al formato de ficheros de clase para el soporte de depuración a nivel de fuente de lenguajes como JSP y SQLJ, que son portados a Java


Enlaces externos[editar]

es:Máquina virtual Java