|
| índice |
A finales de los años ochenta Sun Microsystems decide introducirse en el mercado de la electrónica de consumo y más concretamente en los equipos domésticos, incluyendo la televisión interactiva.
Java, nace como un lenguaje ideado en sus comienzos para programar electrodomésticos.
Requerimientos de ese lenguaje deseado:
Con esta idea en mente comenzó a trabajar James Gosling en 1990 liderando un pequeño grupo de desarrollo. Gosling decidió que las ventajas de eficiencia de C++ no compensaban el gran coste de pruebas y depuración. Por otro lado, lenguajes como C y C++ deben ser compilados para un chip, y si se cambia el chip, todo el software debe compilarse de nuevo. Este era un problema clave en el campo de la electrónica de consumo. Gosling decide crear un nuevo lenguaje de programación más apropiado. Ese lenguaje llegaría a convertirse en lo que hoy día se conoce como JAVA.
Gosling había estado trabajando en un lenguaje
denominado OAK, el cual partía de C++ e intentaba remediar
las deficiencias que había apreciado.
Java no sería un lenguaje totalmente nuevo, se parecería
a lo que conocemos como C++, así que no le sería tan complicado
recalar en los programadores excépticos.
Un lenguaje es orientado a objetos si ofrece facilidades para definir y manipular objetos : entidades autocontenidas que tienen un estado y a las que se pueden enviar mensajes.
Un lenguaje de programación orientado a objetos tiene dos grandes ventajas :
Para que un lenguaje pueda considerarse orientado a objetos debe soportar como mínimo las características de:
Uno de los problemas más comunes en los lenguajes
de programación es la posibilidad de escribir programas
que pueden bloquear el sistema. Algunas veces este bloqueo puede
ser inmediato, pero en otras ocasiones llega a aparecer inesperadamente
porque, por ejemplo, la aplicación accede a zonas de memoria
que no estaban siendo ocupadas por otros programas hasta ese momento.
Un ejemplo claro de lenguaje no robusto es C. Al escribir código
en C o C++ el programador debe hacerse cargo de la gestión
de memoria de una forma explícita, solicitando la asignación
de bloques a punteros y liberándolos cuando ya no son
necesarios. En Java, los punteros, la aritmética de punteros
y las funciones de asignación y liberación de memoria
(malloc( ) y free( ) ) no existen. En lugar de los punteros se emplean
referencias a objetos, los cuales son identificadores simbólicos.
El gestor de memoria de Java lleva una contabilidad de las referencias
a los objetos. Cuando no existe una referencia a un objeto, éste
se convierte en candidato para la recogida de residuos (garbage
collection).
Una de las características del lenguaje es
que soporta la concurrencia a través de threads. En ocasiones
puede interesarnos dividir una aplicación en varios flujos
de control independientes, cada uno de los cuales lleva a cabo
sus funciones de manera concurrente. Cuando los distintos flujos
de control comparten un mismo espacio lógico de direcciones,
se denominan threads. Si estamos trabajando en un Sistema Operativo
que soporta sus propios threads, se realiza un mapeo de los de
Java sobre éstos.
El principal objetivo de los diseñadores
de Java, y dado el gran crecimiento de las redes en los últimos
años, fue el de desarrollar un lenguaje cuyas aplicaciones
una vez compiladas pudiesen ser inmediatamente ejecutables en
cualquier máquina y sobre cualquier sistema operativo.
Por ejemplo, un programa desarrollado en Java en una estación
de trabajo Sun que emplea el sistema operativo Solaris, debería
poderse llevar a un PC que utilize sistema operativo Windows
NT.
Los efectos que aparecen cuando los lenguajes se
sobrecargan de características son los siguientes :
primero, son, a menudo, costosos de compilar y su soporte en tiempo
de ejecución es tan grande que incluso en pequeño
programa ocupa un gran espacio de memoria ; segundo, la curva
de aprendizaje de esos programas es larga y de pendiente pronunciada ;
y tercero, el tiempo de compilación es elevado. Los diseñadores
de Java trataron de mantener las facilidades básicas del
lenguaje en un mínimo y proporcionar un gran número
de extras con las librerias.
Se pretendía construir un lenguaje de programación
que fuese seguro, ésto es, que no pudiera acceder a los recursos
del sistema de manera incontrolada. Por este motivo se eliminó
la posibilidad de manipular la memoria mediante el uso de punteros
y la capacidad de transformación de números en direcciones
de memoria ( tal y como se hace en C ) evitando así todo
acceso ilegal a la memoria. Esto se asegura porque el compilador
Java efectúa una verificación sistemática
de conversiones.
La gran novedad que aporta Java dentro de las nuevas generaciones de navegadores es la capacidad de desplazar el control de la interactividad de los servidores hacia las máquinas de los usuarios que se utilizan para recorrer Internet. Por la misma estructura del lenguaje, los nuevos navegadores permiten la telecarga de "applets", pequeños fragmentos de programas compactos, precompilados, que pueden entonces interpretar de modo distinto los datos telecargados para producir por ejemplo animaciones, sonido y especialmente la verdadera interactividad fabricando un diálogo hombre-máquina imposible de otro modo.
El lenguaje Java, visto desde un navegador de Internet, es pues un lenguaje que no es ni totalmente interpretado, ni totalmente compilado. El lenguaje se transforma en un código elemental parecido al ensamblador, llamado también p-code o byte-code. Posee la particularidad de ser compacto y por tanto puede ser compilado (traducido a lenguaje máquina) muy rápidamente, en el transcurso de la propia ejecución del programa. El p-code constituye una capa intermedia que facilita enormemente la portabilidad de un entorno o de una máquina a otra. La facilita hasta el punto de lograrla desaparecer. Aparece entonces la "máquina virtual".
Una máquina virtual es una capa lógica que hace creer al programa Java que se ejecuta en un ordenador real (con registros, memoria y procesador), cuando en realidad sólo ve una reconstrucción lógica de un ordenador.
Para ejecutar un programa Java compilado (que está
en p-code), es preciso también que cuente con una implementación
de la máquina virtual específica donde se desea
ejecutar, la cual efectúa la transformación del
p-code en un programa comprensible para la máquina.