Imprimir
Categoría: Java
Visto: 4570

En PC Resumen hablaremos del lenguaje Java, un lenguaje de programación estructurada.

El origen del lenguaje

Hay diferentes versiones del origen del lenguaje Java, pero la más difundida es la siguiente:

En 1991 James Goslingn el creador de Java, llamó este lenguaje OAK porque un gran roble (oak, en inglés) era lo que veía desde la ventana de su oficina de Sun Microsystems.

Más tarde, el equipo de desarrollo de Java descubrió que Oak era el nombre de otro lenguaje de programación y que, por tanto, había que encontrar otro. Mientras estaban en una cafetería les ocurrió llamarlo Java, que es una manera coloquial de referirse al café en Estados Unidos. Esta es la explicación del símbolo de Java: "Una taza de café humeante".

Java, nació en mayo de 1995.

Es, por un lado, un nuevo lenguaje simplificado de Sun basado en objetos y sistemas abiertos, con la que los desarrolladores de software pueden crear aplicaciones que se pueden distribuir en Internet mediante la web (o con otros medios) y, por otro, un ordenador virtual (llamado técnicamente máquina virtual Java) que permitirá que las aplicaciones basadas en Java sean omnipresentes, que se puedan ejecutar en cualquier ordenador independientemente de su hardware y su sistema operativo.

A día de hoy, el lenguaje de programación forma parte de la empresa Oracle, que absorbió a Sun Microsystems.

Características del lenguaje

La sintaxis del lenguaje de programación Java es similar a la sintaxis de C++, y la semántica es similar a la de SmallTalk. El lenguaje de programación Java se puede utilizar para desarrollar cualquier tipo de aplicación, tanto applets como aplicaciones.

Los applets son programas escritos en Java, el código de las cuales reside en los servidores web. Se descargan mediante un navegador en el sistema cliente y son ejecutados por el navegador. Las mini aplicaciones suelen ser de pequeño tamaño para minimizar el tiempo de descarga y se llaman a partir de páginas HTML (Hyper Text Markup Language).

Las aplicaciones Java son programas independientes que no necesitan ningún navegador para ejecutarse. Son programas de propósito general que se pueden ejecutar en cualquier máquina que tenga un entorno de ejecución de Java instalado.

Los principales objetivos del lenguaje de programación Java, como describe el manual oficial, son los siguientes:

Para solucionar el problema que puede representar el hecho de que cada ordenador entienda el código máquina de un modo diferente, Java introduce un nivel entre el programa ejecutable y el código máquina. Para hacerlo, introduce los conceptos de bytecodes y máquina virtual Java, que estudiaremos a continuación.

La máquina virtual Java (JVM)

Es una máquina imaginaria implementada mediante la emulación por software en una máquina real. El código para la JVM se almacena en archivos .class, cada uno de los cuales contiene, al menos, el código para una clase pública. Proporciona las especificaciones de hardware necesarias para la tecnología Java. Esta especificación permite que el software en Java sea independiente de la plataforma ya que la compilación se hace para una máquina genérica conocida como JVM.

A partir del código fuente, el compilador genera bytecodes, instrucciones binarias, muy parecidos al código máquina, que representan operaciones que tiene que hacer un ordenador que no existe: la máquina virtual Java. Los bytecodes, al no ser el código máquina de ningún ordenador concreto, sirven para cualquier arquitectura de hardware.

La máquina virtual Java es un programa que coge los ceros y unos representados en bytecodes, los traduce a código máquina y los ejecuta en un ordenador determinado. La JVM depende del tipo de ordenador; por tanto, hay una para cada tipo de ordenador y no son compatibles entre ellas.

La Java Virtual Machine Specification proporciona definiciones muy concretas para la implementación de lo siguiente:

Cualquier intérprete que sea compatible con la tecnología Java debe ser capaz de ejecutar cualquier programa con archivos de clases que respeten el formato de archivo de clase definido en la Java Virtual Machine Specification.

No se debe confundir la JVM con un intérprete de un lenguaje de alto nivel: la entrada de la máquina virtual son bytecodes y la salida, código máquina; la entrada de un intérprete son instrucciones del lenguaje y la salida, código máquina.

La JVM es una pequeña CPU emulada que toma los bytecodes compilados en Java y los transforma en código máquina: es un ordenador dentro de nuestro ordenador (de ahí su nombre). Esto conlleva unas ventajas evidentes: los programas son totalmente portables, el riesgo de que el ordenador quede colgado es nulo y el ordenador no puede ser infectado por un virus, ya que de la JVM, no puede salir nada que perjudique el sistema.

The garbage collection (Gestión alternativa de memoria)

Gran parte de los lenguajes de programación permiten la reserva de memoria en tiempo de ejecución. El proceso de reserva de memoria varía según la sintaxis del lenguaje, pero siempre involucra el regreso de un puntero al inicio del bloque de memoria reservado. Una vez la memoria reservada se deja de necesitar, el programa o el entorno de ejecución será liberar. En C, C++, y otros lenguajes, el programador es responsable de la gestión de liberación de memoria. Esta es una tarea compleja a veces, porque no siempre se sabe a priori cuando se puede liberar la memoria. Los programas que no liberan la memoria no utilizada pueden generar errores de ejecución cuando ya no queda memoria disponible en el sistema. Se dice que estos programas tienen pérdidas de memoria (memory-leaks).

El lenguaje de programación Java libera el programador de la responsabilidad de liberar memoria. El lenguaje Java proporciona un proceso en ejecución, en el ámbito de sistema, que rastrea las operaciones de reserva de memoria. Durante los ciclos muertos de la máquina virtual Java, el proceso de garbage collection verifica qué memoria se puede liberar y la libera.

El proceso de garbage collection se hace automáticamente durante el ciclo de vida de un programa en Java, elimina la necesidad de liberar memoria y evita pérdidas.

Seguridad en el código

La figura muestra el entorno de ejecución de la tecnología Java y como este entorno fuerza la seguridad del código ejecutado:

Entorno de ejecución de la tecnología Java

Los archivos de código fuente en Java se compilan, se convierten en un conjunto de bytecodes a partir de los archivos de texto escritos por el programador. El resultado de la compilación se guarda en archivos con extensión .class.

En el momento de la ejecución, los diferentes archivos de bytecodes que componen el programa a ejecutar se cargan, se verifican y se ejecutan en el intérprete. La función del intérprete es doble: ejecuta los bytecodes y gestiona las llamadas al hardware del sistema.

En algunos entornos de ejecución Java, una parte de los bytecodes verificados se compila a código máquina nativo y se ejecuta directamente en el hardware. Esto permite que el software escrito en Java alcance velocidades de ejecución similares a la de los lenguajes C o C++, aunque siempre habrá que tener en cuenta el pequeño retraso que provocará la etapa de compilación en el momento de cargar la aplicación.

La seguridad de un sistema mide la posibilidad de que errores en el diseño de aplicaciones, o diseños malintencionados -virus-, el dañen. Además de controlar los virus, también hay que controlar los errores involuntarios que puedan perjudicar el sistema.

La base de la seguridad en Java es que las aplicaciones se ejecutan en la máquina virtual Java y no acceden a otros recursos del ordenador. Para conseguirlo, hay cuatro niveles de seguridad establecidos:

Ejemplo:

  • No se convierten enteros a referencias a objetos.
  • Los tipos de los parámetros para todo el código es correcto y no se modificará durante la ejecución.
  • No hay conversiones ilegales de datos.
  • Los accesos a los campos de los objetos están autorizados.

Aunque es muy difícil, es posible desarrollar un compilador para generar bytecodes que se puedan saltar las especificaciones de seguridad introducidas en el ámbito del lenguaje. Podría, entonces, lanzar un conjunto de bytecodes que enmascara operaciones peligrosas para el sistema. Para evitar esto, la JVM verifica los bytecodes antes de ejecutarlos: analiza el formato y comprueba la no existencia de punteros y el acceso a los recursos del sistema mediante los objetos de Java, entre otros.

Este proceso de verificación hace que la ejecución sea más lenta, pero una vez garantizados los puntos anteriores, la JVM funciona mucho más rápidamente.

Antes de hablar de Java como lenguaje seguro, se debe tener en cuenta que la seguridad de un sistema es inversamente proporcional al grado de apertura que tenga: no puede haber un sistema completamente seguro y abierto a todos. Java es un lenguaje abierto a todo el mundo que permite la ejecución de programas muy diversos con la incorporación -mediante Internet- de clases que se pueden encontrar en miles de kilómetros de distancia y de las que no conocemos el autor. La seguridad que proporciona Java radica en que ejecuta los programas en la JVM, de la que es muy difícil salir.