Máquina Virtual de Java
En palabras simples, la JVM emula un "Chip Java", el cuál permite ejecutar el conjunto de instrucciones de la máquina Java. Otro elemento importante son las clases base que requieren los programas en Java para ejecutar. Estas residen en el Ambiente de Ejecución (Java Runtime Environment) y son llevados al JVM cuando se necesitan. En la siguiente figura se ilustra cómo están organizadas estas áreas en el ambiente de ejecución.
La JVM fue diseñada para proveer ejecutables en un tipo de plataforma ejecutable estándar. Originalmente fue construida en una sola plataforma - hoy en día varios fabricantes ofrecen distintas construcciones de la JVM, ver enlaces al final - con lo cual sólo puede ofrecer un tipo de aplicaciones compiladas en un código nativo. Los beneficios aparecen en la cantidad de plataformas que ofrecen el ambiente de ejecución Java. Algunas de los ambientes de operación en los que la JVM y el ambiente de ejecución están disponibles hoy son:
AS/400
AIX
Amiga
FreeBSD
HP
Linux
Macintosh
MP-RAS
NeXT
OS/2
Solaris
Windows 95
Windows NT
Decir que la JVM es un intérprete que convierte el ByteCode compilado de Java en el código de máquina nativo en que debería ejecutarse no es totalmente falso, pero es más correcto decir que es un emulador de la ejecución de un código nativo. La tecnología de máquinas virtuales se ha distinguido de la tecnología de interpretación básicamente por el nivel en que se realiza la interpretación. Los intérpretes trasladan un "código de bit" nativo directamente a llamadas del sistema o instrucciones de máquina, pero la emulación consiste en permitir una arquitectura de máquina intermedia.
La arquitectura de la JVM se basa en el concepto de una implementación que no es específica de una máquina. Esto es, la arquitectura misma no asume nada acerca de la máquina o de las características físicas y de construcción sobre la cual es implementada. De esta manera, la JVM es una entidad autónoma e única que ejecuta los archivos de clases. La JVM se separa en cinco unidades de funcionalidad distintas, las que se dedican a la tarea de ejecutar los archivos de clases.
Para manejar la habilidad de implementar el trabajo en arquitecturas basadas en registros, la JVM define y utiliza los siguientes registros
Registro |
Tamaño |
Significado |
pc |
32 bits |
Contador de programa, lleva la secuencia de la ejecución del programa (similar al homónimo de las arquitecturas reales) |
optop |
32 bits |
Mantiene una referencia de memoria al tope de la pila |
frame |
32 bits |
Provee un puntero al marco actual de pila |
vars |
32 bits |
Provee el valor de desplazamiento para variables locales en relación al puntero a la pila |
La arquitectura trabaja en torno al recurso de pila de 32 bits. La diferencia fundamental del trabajo de este tipo de pila que usa el esquema FIFO de recuperación y almacenamiento es que esta es una pila particionada en tres regiones separadas:
Region de variable local: provee el acceso a las variables locales (en conjunto al registro vars) para acceder a este tipo de elementos. Si las variables ocupan 64 bits, se manejan dos áreas de esta región.
Región de ambiente de ejecución: Usada para proveer código de operación (opcode) para mantener los métodos del marco de pila. También mantiene punteros a variables locales, el marco de pila previo y el inicio y final de la región de operandos.
Región de operandos: Contiene los operandos para el método en ejecución.
"Montículo" de Colección de "desperdicios"
Permite una reusabilidad de los recursos que se han ido utilizando, sobre todo las áreas de memoria lo que permite hacer las colocaciones de memoria y la liberación de ésta.
Área de almacenamiento de métodos
Como su nombre lo indica ésta área es el dispositivo de almacenamiento de memoria primaria para todos los métodos en ejecución de las distintas clases del programa Java ejecutable. Equivalente a la memoria RAM.
Conjunto de Instrucciones de la JVM
Esta no es una región ni un área, sino que corresponde a las instrucciones que maneja la JVM. Como en las arquitecturas reales, el Conjunto de Instrucciones indica al procesador cómo realizar una acción. En la versión 1.1 este consiste en 160 instrucciones separadas en 17 diferentes categorías.
Tipos de datos, almacenamiento y operatoria
Una de las regiones en que se divide un archivo ejecutable de Java corresponde al espacio donde se definen los largos de las regiones de datos, constantes de diversos tipos, nombres de clases, nombres de campos y constantes referidas al cuerpo del código. Aquí se agrega una tabla con referencias a valores de tipos:
Tipo |
Largo |
Referencia |
Asciiz |
2 bytes |
Espacio para caracteres |
Unicode |
2 bytes |
Espacio para caracteres |
Integer |
4 bytes |
Espacio para enteros |
Float |
4 bytes |
Espacio para punto flotante |
Long |
4 - 4 bytes |
4 bytes de la parte alta y 4 de la parte baja |
Double |
4 - 4 bytes |
4 bytes de la parte alta y 4 de la parte baja |
Class |
2 bytes |
Indice a la sección donde está el nombre |
String |
2 bytes |
Maneja la dirección de comienzo del string |
Fieldref |
2 bytes |
Indice a la región de constantes |
Methodref |
2 bytes |
Indice a la región de constantes |
InterfaceMethodref |
2 bytes |
Indice a la región de constantes |
NamedType |
2 bytes |
Indice a la región de constantes |
Protección de la máquina virtual y del procesador real
La protección de la máquina virtual se realiza por medio del verificador de bytecode, el cual intenta asegurar el rechazo de aquellos programas en bytecode que no satisfagan las definiciones asumidas por la optimización de Java, sobre todo en cuanto a direccionamiento.
Asimismo, cuando se trata de proteger el procesador real, el sistema descansa en la posibilidad de traducción hecha directamente por el ambiente de ejecución de Java, donde se obtiene un código nativo bien definido para la máquina.
Visite la página Sun en la que muestran las especificaciones de
picoJava, el procesador para Java.En este gráfico se aprecia la máquina:
Desarrollado por Luis Bastías C.
Noviembre 1998.