Sobre la máquina virtual de Java y el lenguaje C

5 views
Skip to first unread message

Minolo

unread,
Nov 6, 2009, 3:51:38 PM11/6/09
to CHAR
Buenas a tod@s.

Quería comentar algo para los que aún tengáis dudas sobre la
diferencia que existe entre la ejecución de código C y código Java,
poniendo ambos lenguajes en comparación con algo que quizá os resulte
más habitual. Antes de ello, voy a recordar lo que se ha explicado ya
sobre el tema.

Cuando tenemos un archivo de código Java, al compilarlo se genera un
archivo .class que contiene código que no es el que nosotros
escribimos, es una traducción del mismo a un lenguaje distinto que
comprende la máquina virtual de Java (JVM). Ese código no es el que
ejecuta el procesador de nuestro ordenador, ya que no conoce el
lenguaje en el que está escrito.

Para que nuestro programa pueda funcionar, la JVM traduce ese código a
instrucciones que sí comprende nuestro procesador. Es como un nuevo
proceso de compilación, realizado en la JVM mientras nuestro programa
se ejecuta, y que no genera un nuevo archivo de código.

De aquí viene la tan mencionada portabilidad del código Java. Un
ordenador y un teléfono móvil pueden ejecutar el mismo .class, aunque
obviamente son procesadores distintos, por lo que la JVM de cada uno
tendrá que traducir a lenguajes distintos.

Por otro lado, el lenguaje C se compila directamente a un lenguaje que
nuestro procesador entiende, eliminando la capa intermedia (la JVM).
Al eliminar esa capa eliminamos también la portabilidad que ofrece,
por lo que un código compilado para un ordenador no funcionará al
intentar meterlo en un móvil, o incluso en otro ordenador con otro
procesador distinto. Habría que volver a compilarlo para el procesador
en cuestión.

Ahora me gustaría exponer la similitud que existe con los emuladores
de consolas de juegos. Seguramente todos habréis jugado alguna vez a
un emulador de una consola como la Gameboy en vuestro ordenador. Pues
bien, ese emulador es algo muy parecido a la máquina virtual de Java.

En nuestros ordenadores no tenemos un procesador Z80, que es el que
tiene la Gameboy. Por lo tanto, los roms (los equivalentes en el
ejemplo a los .class de Java) no se pueden ejecutar directamente, ya
que contienen instrucciones del Z80 y nuestros ordenadores no saben
que hacer con ellas: tenemos que utilizar algo que les traduzca el
lenguaje del Z80. Esa es una de las tareas del emulador.

Imaginad ahora que tenemos el código fuente de ese rom, porque resulta
que es una aplicación que hemos hecho nosotros. Si, en vez de
compilarla para Z80, la compilamos para nuestros procesadores (lo que
seria equivalente a compilar un código en C con gcc por ejemplo), si
que podríamos ejecutarlo directamente.

En resumen, C se traduce al lenguaje de nuestro procesador y Java se
traduce al lenguaje de un procesador que no es el nuestro, y para
ejecutarlo hay que volver a traducir.

Espero que os haya servido el ejemplo y os haya aclarado alguna duda
si aún quedaba. En caso de que queden más o surjan nuevas, os invito a
preguntarme, haré lo que pueda :>.

Un saludo!!!!11111

Jesús "zNk" Sánchez

unread,
Nov 7, 2009, 5:50:53 AM11/7/09
to char-e...@googlegroups.com
Buen resumen minolo ;)

Pablo Iñigo Blasco

unread,
Nov 7, 2009, 10:58:10 AM11/7/09
to char-e...@googlegroups.com
Gracias Minolo! está muy bien aclarar esto y que quede escrito en la web. Además el miércoles no se habló nada sobre este tema, así pueden enterarse.

Saludos.

2009/11/7 Jesús "zNk" Sánchez <zanarka...@gmail.com>



--
Pablo Iñigo Blasco .
Computer Architecture Department. University of Seville (Spain)

Reply all
Reply to author
Forward
0 new messages