Conceptos Básicos

El nacimiento de Java se remonta al año de 1994 en los laboratorios de Sun Microsystems. Fue desarrollado por Patrick Naughton, Mike Sheridan y James Gosling. Podemos decir que Java es:

  • Un Lenguaje de Programación
  • Un ambiente de desarrollo

Java es el resultado de la b˙squeda de un lenguaje de programaciÛn que tuviera el poder de C++ y la seguridad de un lenguaje como Smalltalk. Java es un lenguaje Orientado a Objetos que tiene una sintaxis similar a la de C. Los diseÒadores de Java se esforzaron por hacer de Java un lenguaje poderoso pero, a su vez, trataron de evitar las caracterÌstias complejas que poseen algunos de los lenguajes Orientados a Objetos, como C++.

Los objetivos principales que se tomaron en cuenta al desarrollar Java fueron los siguientes:

  • Crear un lenguaje Orientado a Objetos
  • Crear un ambiente de desarrollo interpretado por dos razones:
    • Velocidad de desarrollo: Eliminando el ciclo compila - encadena - carga - prueba
    • Portabilidad del cÛdigo
  • Eliminar la aritmÈtica de apuntadores y la asignaciÛn de memoria
  • Crear programas que permitan realizar m·s de una tarea a la vez (multithreading).
  • Proveer un medio para la creaciÛn de aplicaciones seguras y robustas

Para lograr estos objetivos Java cuenta con las siguientes características:
  • La máquina virtual de Java (Java Virtual Machina)
  • El colector de basura (Garbage Collector)
  • Seguridad en el cÛdigo

La máquina virtual de Java

La máquina virtual de Java o el Intérprete de Java, es una pieza crucial en cada una de las instalaciones de Java. Por diseño, los programas de Java son portables, sin embargo, sólo son portables a las plataformas a las cuales el intérprete de Java ha sido portado. Podemos definir a la m·quina virtual de Java como: Una m·quina imaginaria que es implementada por emulación en software sobre una máquina real. El código que interpreta la JVM es almacenado en archivos .class.

El Recolector de Basura (Garbage Collection)

Muchos lenguajes de programación permiten la asignación dinámica de memoria durante el tiempo de ejecución. La manera en la que se asigna memoria en cada lenguaje depende de la sintaxis del lenguaje pero sea cual sea ésta, siempre involucra el uso de un apuntador que guarda la dirección de la memoria que se asignó.

Una vez que la localidad de memoria no se necesita más, el programa debe liberar toda la memoria que no está siendo utilizada, de manera que no se corra el riesgo de quedarse sin memoria; en C y C++, el programador es el responsable de realizar la tarea anterior.

Java quita la responsabilidad al programador haciendo que la liberación de memoria sea provista por el sistema. El sistema rastrea cada asignación de memoria y mantiene un registro de las referencias a memoria. Cuando detecte que no hay m·s referencias a un ·rea de memoria, se marca dicha localidad de memoria para que el recolector de basura lo elimine; esto es realizado por la JVM mediante ciclos desocupados.

El recolector de basura realiza esta tarea durante el ciclo de vida del programa de Java y elimina la necesidad de liberar la memoria y de todos los problemas que Èsto trae.

Seguridad en el Código

Los programas de Java son "compilados" en el sentido de que son convertidos de un formato de texto en el que los programadores desarrollan el programa de Java en un byte code independiente. Durante el tiempo de ejecuciÛn el byte code que forma parte de un programa de Java es cargado, verificado y ejecutado en un intérprete. El intérprete tiene tres trabajos:

  • Cargar el programa: El código encadenado es "armado" de manera aleatoria, esto aumenta la seguridad al no conocerse las ·reas de memoria específica de las clases almacenadas. Una vez que las clases se cargan se determina la estructura de memoria y se asignan las referencias.
  • Verificar el código: Realiza cuatro pruebas diferentes de seguridad antes de permitir la ejecución:
    • Revisa que el archivo ".class" se encuentre de acuerdo a las especificaciones de la MVJ.
    • Revisa que no haya violaciones a las restricciones de acceso (uso de recursos locales).
    • Revisa que no haya Overflows o underflows.
    • Revisa que no haya conversiÛn ilegal de datos, como la conversiÛn de enteros a apuntadores.