G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
Tema 1: Introducción tema_siguiente
  1. Java, XML e Ingeniería del sofware.
  2. Origen y características de Java.
  3. La máquina virtual.
  4. Obtención e instalación del software.

1.3- La máquina virtual

Si bien Java se concibió con una serie de características que se han visto en el apartado anterior, se puso especial énfasis desde el punto de vista "publicitario" en el hecho de que se conseguía una "portabilidad" total. De ahí el eslógan utilizado por SUN en sus campañas:

"Write Once, Run Anywhere"

es decir, sólo es necesario escribir y compilar una vez un programa en Java para que funcione en cualquier "plataforma" (combinación de máquina y sistema operativo). Esto es cierto en función de que se entienda de determinado modo. En realidad para que esto suceda, toda "plataforma" debe ser "convertida" en una máquina virtual específica mediante un software simulador, y es sobre esta máquina virtual sobre la que se ejecutan las apliaciones Java. Este simulador se conoce como JVM: Java Virtual Machine Cada unidad de código escrito en Java se compila dando lugar a los "bytecodes", que no son otra cosa que instrucciones para la JVM.

Esta idea fue nueva en su momento pero no del todo. Años atras, una técnica parecida se aplicó a la generación de algunos compiladores: mediante la definición de un lenguaje intermedio entre el de la máquina y el de alto nivel se permitia una compilación en dos fases, donde la segunda era fija (del lenguaje intermedio al de la máquina) y la primera podía intercambiarse para admitir diversos lenguajes o versiones. Quizas el más conocido de estos lenguajes intermedios fue el denominado "p-code" que utilizaron algunos compiladores de Pascal.

La diferencia de este antiguo enfoque con el actual es importante: no se trata de un mero artificio para simplificar el proceso de generar código para una máquina a partir de diversas situaciones, sino que se trata de definir toda una máquina nueva con su arquitectura (en lo que afecta al modelo de programación) y sus mecanismos de ejecución. El hecho de que se trate de una máquina simulada permite explotar tres ventajas frente a una versión hardware:

  • se pueden incluir con facilidad técnicas que en un diseño hardware pueden resultar prohibitivas por su complejidad técnica,
  • la posibilidad de evolución es mucho más sencilla al no requerir cambios de hardware
  • permite utilizar las "plataformas" existentes sin implicar una ruptura con los sistemas actuales.

Respecto a este último punto, cabe mencionar que existe la Máquina Java no virtual, construida en torno a un microprocesador cuyo código máquina son los bytecodes, pero se trata de una máquina sin viabilidad comercial (al menos actualmente) al suponer una ruptura con la tecnología generalizada hoy en día (para utilizarla, los fabricantes de software deberían migrar todas sus aplicaciones actuales a Java o bien debería dotarse a esta máquina de un simulador de otras, lo que no aporta ninguna ventaja frente a la disponibilidad real de estas).

El exito de esta técnica reside por tanto en la disponibilidad de JVMs para todas las pataformas, y para ello SUN adoptó la estrategia de permitir que cualquier fabricante de software pudiera generar sus JVMs y someterlas a validación. Para ello publicó las especificaciones técnicas que debe complir toda JVM. Estas especificaciones siguen una pauta principal: el diseño es público y la "implementación" es privada. Esto quiere decir que la estructura y capacidades de la máquina son las mismas para toda JVM de modo que la "percepción" que se tiene de cualquier JVM desde "el exterior" es idéntica, mientras que el código del simulador de la máquina Java no debe obedecer a normas específicas: cada fabricante puede optar por las técnicas que estime oportunas (esto permite establecer distintos objetivos de optimización -p.ej. en cuanto a velocidad de ejecución, u ocupación de memoria-).

Esta libertad de "implementación" permite que encontremos JVMs con distintos comportamientos en cuanto a velocidad de ejecución de determinados tipos de aplicaciones o diferentes consumos de memoria. Un aspecto importante que determina el funcionamiento de la JVM es el modo en que simula al procesador: las primeras versiones fueron dotadas con interpretes de bytecodes, mientas que con posterioridad se han impuesto los compiladores JIT (Just In Time) [faq] que generan código para la máquina "real" en el momento en que es necesario, de modo que si se repite una determinada secuencia no es necesario reinterpretarla. En este sentido, la evolución de las técnicas relacionadas con los JITs es importante en los últimos años, lo que ha permitido una importante evolución en las JVMs (SUN asegura que en su última versión de JVM (dentro del Java Runtime Environment 1.4.1) ha "implementado" un JIT con tecnología -que denomina HotSpot- capaz de batir en muchas ocasiones a aplicaciones compiladas a codigo nativo de la máquina a partir de código en C).


Una vez compilado un programa en Java, los "bytecodes" pueden ser ejecutados en cualquier plataforma con una JVM. Cada JVM puede incluir internamente distinatas técnicas.

Siguiente punto: 1.4- Obtención e instalación del software


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.