Máquinas Virtuales Universidad Nacional Autónoma de México Facultad de Ingeniería

Todo lo que siempre quiso saber sobre Máquinas Virtuales pero nunca se atrevió a preguntar

Estructura y Programación de Computadoras. Profesora Gloria Ramírez R.

uye n Incl ón e ersi n v ! co PDF CD ato form

Héctor Zárate Rea

Máquinas Virtuales Índice

Introducción Definición Java Virtual Machine Instrucciones Básicas Common Language Infrastructure Conclusiones Bibliografía

3 3 3 4 5 6 7

Héctor Zárate - Máquinas Virtuales

2

Máquinas Virtuales Introducción
Basado en el temario de la asignatura, y apegándose a los puntos que este mismo sugiere, este trabajo aborda el tema de Máquinas Virtuales. No es un trabajo lleno de oscuras menciones técnicas producto del copy-paste, tampoco intenta develar los misterios más entrañables de las maquinas virtuales, pero sí tiene el propósito de exponer el concepto de una forma clara.

Definición
Una máquina virtual es simplemente una computadora abstracta, una computadora o máquina emulada a partir de software. Una idea para nada nueva y cuyo término acuño IBM en 1959. Existen varios tipos de ellas, con ciertas diferencias entre si, pero a grandes rasgos todas son muy parecidas al siguiente diagrama:

Más software Software (Máquina Virtual) Hardware

Una máquina virtual es como una capa intermedia entre el hardware de la computadora y algún software y puede encargarse de funciones como traducir instrucciones o simular el funcionamiento de una computadora específica. Hay desde las más complejas que emulan una computadora en su totalidad (Incluyendo tarjetas de video, discos duros, etc.), hasta otras más sencillas y especializadas que brindan solo una capa de abstracción entre plataformas de hardware y software muy específico. En este trabajo analizaremos dos de las maquinas virtuales más populares.

Java Virtual Machine
Bien, tenemos ya una idea general de lo que es una maquina virtual. Ahora revisemos una de las máquinas virtuales más empleadas y populares: Java Virtual Machine. Java Virtual Machine es, sin duda, la parte nuclear del lenguaje de programación Java. De hecho, es imposible correr una aplicación en Java sin algún tipo de Maquina Virtual de Java de por medio. Al ejecutar algún programa en este lenguaje, las instrucciones de este no son ejecutadas directamente por el procesador ni por el hardware de la computadora. Son ejecutadas por un software (Sí, una máquina virtual) que las interpreta y lleva a cabo una acción sobre el hardware a partir de estas. De cierta manera, un programa en Java no es ejecutado por el procesador de la computadora, sino que es ejecutado por un procesador ‘virtual’. Y es precisamente esto lo que dota al lenguaje Java de su virtud más grande: Portatilidad. La portatilidad es la capacidad de un software de compilarse o ejecutarse en varios ambientes (Sistemas Operativos) sin necesidad de modificaciones sustantivas en su código.

Héctor Zárate - Máquinas Virtuales

3

Máquinas Virtuales
Al tener una aplicación hecha en Java es posible ejecutarla en cualquier computadora que cuente con una maquina virtual de Java, sin importar si es una computadora personal con Windows, Mac OS (Yey!) o FreeBSD, un teléfono con una curiosa distribución de Linux, la computadora de un avión o hasta el mismo Mars Rover que justo ahora esta en Marte fotografiando marcianos 1. Y si requerimos ejecutar la aplicación en otra plataforma (Donde no haya una maquina virtual de Java aún) no tenemos que re-escribir la aplicación, sino simplemente, escribir una nueva maquina virtual que brindará compatibilidad entre la nueva plataforma y cualquier aplicación hecha en Java.

Instrucciones Básicas
Los procesadores virtuales de las maquinas virtuales hacen uso de instrucciones muy primitivas al igual que un procesador de verdad, esto incluye instrucciones para operaciones aritméticas, control de flujo, etc. Haré algunas comparaciones de instrucciones de un procesador 80x86 con su equivalente en el procesador de la Maquina Virtual de Java. El siguiente ejemplo guarda un número entero (El número 10) en un registro para un procesador 80x86:
mov AX, 10 ; mover 10 al registro AX

Su equivalente en Java:
bipush 10 istore_1 ; mover 10 al stack ; guardar el 10 del stack en la variable local 1

Un segundo ejemplo: Vamos a guardar dos números, el 5 y el 10, y después sumarlos. :P La versión para el famosísimo 80x86:
mov AX, 5 mov BX, 10 add AX, BX ; Guardar el 5 en AX ; Guardar el 10 en BX ; Sumar!

La versión para Java:
bipush 5 bipush 10 iadd istore_1 ; mover 5 al stack ; mover 10 al stack ; sumar los dos últimos registros del stack ; sacar el registro del stack y guardarlo en la va- riable 1

Como es evidente, el procesador de la Maquina Virtual de Java utiliza un stack y variables numeradas en lugar de registros. Sin embargo, el funcionamiento es muy parecido al de un procesador común y corriente (Léase 80x86).

Bien, aún no hay declaraciones oficiales sobre los marcianos, pero sí muchas fotografías que fueron obtenidas gracias a la utilización de tecnologías de Java. Java Everywehere in action. Java. 2004.
1

Héctor Zárate - Máquinas Virtuales

4

Máquinas Virtuales
Me limitaré a mencionar estos dos ejemplos en lugar de insertar una tabla llena de instrucciones las cuales pueden ser revisadas con detenimiento en cualquier libro que cubra el tema2.

Common Language Infrastructure
Common Languaje Intrastructure es un estándar hecho para lograr que software programado en distintos lenguajes pueda ser ejecutado en distintos ambientes. Fue creado por la Asociación europea ECMA (European Computer Manufacturers Association) y la última publicación del estándar, la 4ta. edición, puede ser revisada en el sitio de la asociación. 3 Revisemos como funciona en la implementación realizada por Microsoft para su plataforma .NET (Yep, se trata de otra máquina virtual muy parecida a la de Java): Inicialmente, un compilador convierte el código fuente escrito en C#, Visual Basic, ASP Script, o cualquier lenguaje del estándar, en una especie de código ejecutable llamado MSIL (Microsoft’s Intermediate Language). Esta es una característica única que brinda independencia sobre el lenguaje en que el desarrollador trabaja. Ya que cada lenguaje se traduce a MSIL, el usuario que utilice la aplicación necesita de una sola máquina virtual: La Common Lenguage Runtime (CLR) y se evita así el problema de tener un runtime diferente para cada lenguaje.

Visual Basic, C# u otros

MSIL

EXE

Al iniciar el programa, ese código MSIL es compilado por la CLR a un código de bajo nivel correspondiente a la Voila! arquitectura de la computadora y finalmente es ejecutado. Este último paso es otra diferencia importante entre la Maquina Virtual de Java y CLR. En Java, la aplicación es interpretada línea por línea a medida que es necesario, mientras que la CLR compila todo el programa antes de ejecutarse. Y así finalmente, tenemos un estándar que nos permite desarrollar aplicaciones en distintos lenguajes (Cross-language también) y que nos permite llevarlos a distintas plataformas solucionando sin muchos de los problemas que esto representaba.

on L nguage Runtime o C mm a
A todos aquellos del fascinante oficio de las computadoras; diseñadores, analistas y programadores de sistemas. Olvídense del interminable conjunto de runtimes para
2

cada lenguaje, porque ya esta aquí venida de Europa, la plataforma unificadora repleta de ventajas para desarrolladores y usuarios finales!

Para Java, la guía más importante probablemente sea: The Java Virtual Machine Specification, Second Edition, editado por Sun. http://java.sun.com/docs/books/jvms/
3

http://www.ecma-international.org/publications/standards/Ecma-335.htm 5

Héctor Zárate - Máquinas Virtuales

Máquinas Virtuales Conclusiones
Actualmente hay muchos proyectos implementando el estándar ECMA-335, entre los que destacan Mono y la implementación de Microsoft que fue la que ya revisamos. Al respecto y en exclusiva, César Natarén, quien es un importante desarrollador en el proyecto Mono4, nos brinda una comentario experto5 acerca del estándar CLI.
El que el CLI sea una especificación pública ha permitido que implementaciones hechas por terceros puedan ser construidas sin problema alguno, como es el caso de la plataforma de desarrollo Mono. Que ha permitido que aplicaciones escritas para el sistema operativo creado por la compañía de Redmond se puedan utilizar en el sistema operativo Linux y otros sistemas operativos libres ademas de una gran variedad de arquitecturas de computadoras.

La utilización de máquinas virtuales implica muchas ventajas como la capacidad de escribir una sola aplicación en distintos lenguajes sin necesidad de preocuparse por las interfaces entre estos o la más importante que seguramente es la portatilidad. Pero bien, si las máquinas virtuales son una maravilla, ¿porqué no son utilizadas siempre? A cambio de estas ventajas, las aplicaciones son un poco más lentas debido a la capa intermedia de abstracción, pero la comparación es semejante a lo que pasó entre el ensamblador y los lenguajes de alto nivel: No cabe duda que un programa escrito en ensamblador será mas eficiente, pero las ventajas que tendría hacer lo mismo en un lenguaje de alto nivel son innumerables.

César López Natarén is mainly, the man behind the JavaScript compiler for the Mono project. www.mono-project.com
4 5

Desde su centro de operaciones a la 1:30 del Miércoles 6 de Junio de 2007. 6

Héctor Zárate - Máquinas Virtuales

Máquinas Virtuales Bibliografía
MEYER, Jon. JAVA Virtual Machine, O’Reilly, USA, 1997. ENGEL, Joshua. Programming for the Java Virtual Machine, Addison-Wesley, USA, 1999. WHITTINGTON, Jason. Shared Source CLI Provides Source Code for a FreeBSD Implementation of .NET, MSDN Magazine, Julio de 2002.

Héctor Zárate - Máquinas Virtuales

7

Sign up to vote on this title
UsefulNot useful