Qué es Java

Artículo en construcción!

Java es una máquina virtual y un lenguaje asociado.

¿Qué es una máquina virtual?

Es divertido ver uno de esos programas para correr jueguitos de antaño. El MAME, por ejemplo, está muy bueno... muchos juegos andan muy bien y es como que los juegos no saben que están corrriendo en MAME, y esperan que uno les ponga las fichas. También estan los emuladres de Commodore 64, en los que uno se puede sentar y programar algo en el viejo BASIC de Commodore 64.

Ahora, estos emuladores corren en varias plataformas. Corren en PC, Mac, en Unix, hasta quizá en celulares elegantes! Es decir que una manera de crear un programa que pueda correr en Mac y en Windows es... hacerlo para Commodore 64! El programa estará creado para una máquina, una plataforma que ya no existe, pero que será posible emularla en cada máquina real.

Pero si esta idea es buena, ¿por qué no crear una plataforma especialmente diseñada para "sostener" programas multiplataforma? Una plataforma que nunca haya existido, pero que existe en emuladores que pueden correr en cada una de las plataformas reales, físicas.

La máquina virtual Java es, entonces, una computadora inconstruíble, con un assembler, con capacidades. Esta computadora virtual ejecuta "código máquina", con un lenguaje ensamblador. Similar al "assembler" de un procesador real, un Pentium, un Core 2 Duo. Al código máquina en Java se le llama "bytecode". La diferencia con el código máquina de procesadores reales es que en Java, el assembler es de alto nivel. Es un assembler que manipula objetos, que tiene primitivas de sincronización entre threads, y que no debe preocuparse de la memoria.

¿Qué es el lenguaje Java?

La manera principal de crear el "bytecode" que la máquina virtual interpretará es escribiendo en un lenguaje particular, expresamente inventado para esta máquina virtual. Cuando se dice Java a secas, muchas veces se habla solamente de este lenguaje, y ciertamente es a lo que uno se refiere cuando dice "hey! aprendí Java!".

Características de la maquina virtual Java

Velocidad

La técnica clásica con la que se implementa una máquina virtual es conocida como "interpretación". Esta técnica es simplemente que la máquina virtual, como aplicación, trabaja como un CPU pero a nivel de software. Es decir, va recorriendo el "bytecode" de la aplicación que ejecuta decidiendo qué hacer. Esto es exactamente lo que hace un CPU real. Pero que mientras un CPU real trabaja a nivel de la electrónica de la computadora y tiene cientos de optimizaciones físicas, un programa que "simula ser" un CPU es sólo una aplicación más. A los programas que usan esta técnica se los llama "intérpretes". Un intérprete es, entonces, un CPU que está implementado en términos de otro CPU.

La primera generación de Java era un intérprete puro. Un intérprete será, típicamente, 20 veces más lento que un programa normal (como los que se hacen en C). Si bien siempre hubo muchos lenguajes interpretados exitosos (como Visual Basic o PHP) los creadores de Java querían competir con C y desarrollaron técnicas para acelerar la ejecución.

La primera técnica utilizada para acelerar Java fue transcribir el "bytecode" de Java a código máquina real de la computadora física. Es decir, en el momento de cargarse bytecode Java en memoria, se invoca a un "compilador" que compila desde bytecode a código máquina.

Actualmente la máquina virtual usa técnicas más sofisticadas para hacer lo anterior. En vez de compilar toda la aplicación como un paso en la carga, Java ahora empieza interpretando. A medida que el programa desarrolla su actividad, Java le va tomando los tiempos y va decidiendo en qué lugares es conveniente compilar. Es decir que Java va a haciendo un "profiling" dinámico de la aplicación y va modificándola "al vuelo" para obtener mayor rendimiento.

Memoria

Java no tiene memoria. En C o C++ uno pide bloques de memoria pura, al por mayor (¿al mayoreo diría un español?). Memoria pura, basta, indiferenciada.

Un programa de computación opera sobre datos, no sobre memoria. Manipula enteros, fechas, objetos, etc. Java no permite acceder a la memoria, sólo a datos (que no son otra cosa que formas inteligentes de ver la memoria).

En Java entonces no hay punteros a memoria, ni hay ambigüedades de tipos, de accesos. Tampoco hay necesidad de "liberar memoria" o el peligro de pasarse y usar memoria que estaba destinada a otra cosa.

A nivel de rendimiento, esto le permite a la máquina virtual hacer optimizaciones interesantes. Por ejemplo, dentro de una clase, tiene la libertad de reordenar los miembros para optimizar.


Vea mis otros artículos sobre programación en Java, por ejemplo uno de nivel híper básico sobre collections, u otro en el que trato de enumerar las cosas más importantes del mundo Java.


Me encantaría recibir cualquier tipo de comentarios sobre esta página. ¿Qué pongo? ¿Qué saco? Hecho por Nicolás Lichtmaier.

HTML 4.01 estricto válido

Creative Commons License
Licenciado bajo la licencia Creative Commons Attribution 3.0.