IEDGE – Lenguajes de programación, Java


Sun Microsystems, líder en servidores para Internet, uno de cuyos lemas desde hace mucho tiempo es «the network is the computer», es quien ha desarrollado el lenguaje Java, en un intento de resolver simultáneamente todos los problemas que se le plantean a los desarrolladores de software por la proliferación de arquitecturas incompatibles, tanto entre las diferentes máquinas como entre los diversos sistemas operativos y sistemas de ventanas que funcionaban sobre una misma máquina, añadiendo la dificultad de crear aplicaciones distribuidas en una red como Internet.

La característica más destacada de Java, es que se ejecuta sobre una máquina virtual, de la que existen versiones para los sistemas operativos más utilizados del mercado. Esto conlleva que un programa realizado en Java, pueda ejecutarse sobre cualquier tipo de ordenador y sistema operativo para el que exista una implementación de la Máquina Virtual Java.

En la actualidad existe de facto un standard en el mercado desarrollado por Sun y que es el que implementan la mayoría de los compiladores de Java que existen en el mercado.

Uno de los temas importantes que tenemos que tener en cuenta a la hora de seleccionar  una herramienta Java u otra es la máquina virtual que utiliza. Hemos comentado brevemente que uno de los éxitos de Java esta basado en la posibilidad de distribuir la misma aplicación entre distintas máquinas con distintos sistemas operativos. Esto nos indica que el rendimiento que nos pueda ofrecer la máquina virtual (VM) es uno de los factores claves en el rendimiento de nuestras aplicaciones aparte de otras consideraciones de tipo hardware. Para medir el rendimiento de las máquinas virtuales podemos encontrar en el mercado algunas herramientas que nos pueden dar alguna idea de la bondad de las máquinas virtuales.

http://www.youtube.com/watch?v=4C1VZfvR0SM

1.- Características de Java

Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos. C++ es un lenguaje que adolece de falta de seguridad, pero dado que C y C++ estaban extensamente difundidos, el diseño de Java se ha basado en cierto modo en el de C++, permitiendo un reciclaje rápido y un fácil aprendizaje del lenguaje para aquellos programadores que ya hayan trabajado con C++.

Para mantener reducidas las especificaciones del lenguaje, Java elimina muchas de las características de lenguajes como C++. Por ejemplo, no es necesario preocuparse de la liberación de memoria, ya que existe un reciclador que se encarga de ello. Reduce los errores más comunes de programación, dado que elimina la aritmética de punteros, no existen referencias, ni registros (struct), y se pasa por alto la definición de tipos (typedef) y macros (#define).

Java implementa la tecnología básica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos, y soporta las tres características propias del paradigma de la orientación a objetos: encapsulación, herencia y polimorfismo. Las plantillas de objetos son llamadas, del mismo modo que se hace en C++, clases, y sus copias, instancias. Las instancias necesitan de la misma forma la existencia de constructores y destructores que creen y destruyan los espacios de memoria.

Una de las características más interesantes que implementa Java es la interfaz RTTI (RunTime Type Identification) que define la interacción entre objetos excluyendo variables o implementación de método, algo que evita el tener que recompilar la aplicación cuando se retocan funciones que se encuentran dentro de DLL, como ocurre con C++.

2.- Arquitectura independiente y Java distribuido

Java ha sido diseñado con extensas capacidades de interconexión TCP/IP. Posee librerías para interactuar con protocolos http y ftp. Estas características permiten a los desarrolladores de aplicaciones Java, acceder a datos de la red tan fácilmente como lo harían en ficheros locales. No se puede decir que Java en sí sea distribuido, pero proporciona las librerías y herramientas necesarias para que sus aplicaciones sí lo sean; es decir, que puedan ejecutarse en varias máquinas e interactúen.

Para establecer Java como parte integral de la red, el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutará. Cualquier máquina que posea el sistema de ejecución (Máquina Virtual) puede ejecutar ese código objeto, sin importar en modo alguno la máquina en que ha sido generado.

El código fuente Java se «compila» a un código de bytes de bajo nivel independiente de la máquina. Este código (byte-codes) está diseñado para ejecutarse en una máquina virtual hipotética que es implementada por un sistema run-time, que sí es dependiente de la máquina.

En una representación en que tuviésemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genérica, obtendríamos una figura en la que se vería que lo único que tiene relación con el sistema es la Máquina Virtual Java (JVM) y los API y funciones de las librerías.

El intérprete Java (sistema run-time) puede ejecutar directamente el código objeto. Enlazar (linkar) un programa, consume menos recursos que compilarlo, con lo cual hay más tiempo para desarrollar, ya que no hay que esperar por culpa del ordenador. Sin embargo el código interpretado hace que el lenguaje sea más lento que otros lenguajes, como por ejemplo C++. En realidad, Java es verdaderamente compilado e interpretado, ya que compila código intermedio que es interpretado por el intérprete de Java.

3.- La robustez de un lenguaje

Para proporcionar robustez a las aplicaciones, Java realiza verificaciones en busca de problemas tanto en tiempo de compilación como en tiempo de ejecución. La comprobación de tipos en Java ayuda a detectar errores de manera prematura dentro del ciclo de desarrollo. Estas características y otras muchas, como el manejo de la memoria y comprobación de punteros, reducen drásticamente el tiempo de desarrollo de aplicaciones en Java.

El código Java pasa muchos tests antes de ejecutarse en una máquina. El código se pasa a través de un verificador de byte-codes que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal. Si los byte-codes son capaces de pasar la verificación sin generar ningún mensaje de error se asegura que:

  • El código no produce desbordamiento de operandos en la pila
  • El tipo de los parámetros de todos los códigos de operación son conocidos y correctos
  • No ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros en punteros
  • El acceso a los campos de un objeto se sabe que es legal: public, private, protected
  • No hay ningún intento de violar las reglas de acceso y seguridad establecidas

Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Resumiendo, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interacción de ciertos virus. Además, para evitar modificaciones por parte de los crackers de la red, implementa un método ultraseguro de autentificación por clave pública. El Cargador de Clases de Java es capaz de verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningún objeto se crea y almacena en memoria sin que se validen los privilegios de acceso de manera.

Dentro del mundo Java tenemos que familiarizarnos con dos conceptos que son importantes teniendo en cuenta que una buena parte de las aplicaciones desarrolladas con este lenguaje estan basadas en desarrollos web: Los dos conceptos son: applets y servlets.

De una manera sencilla diremos que un applet es una porción de código que se ejecuta en el navegador del cliente que ha solicitado los datos con la consiguiente demora en la carga del código y en la ejecución del mismo. En cambio un servlet es ejecutado por el servidor web al que estamos realizando la petición que es el que ejecuta el código java y que genera la respuesta al servidor.

¡Quedo a la espera de sus comentarios!

Francisco Pérez

Profesor de Dirección de Sistemas y Tecnologías de la Información

Nota: aprender de una forma práctica y rápida como poner en marcha, desarrollar y controlar planes de marketing interactivo, publicidad digital y comunicación online totalmente eficaces, les invitamos a que consulten la Especialidad Europea en Dirección de Sistemas y Tecnologías de la información.

* Los contenidos publicados en este post son responsabilidad exclusiva del Autor.

¡Pronto grandes sorpresas en Facebook, Twitter y Youtube!:

  • Síganos en Twitter
  • Hágase fan en Facebook (IEDGE – The European Business School es la Escuela de Negocios en español con mayor número de fans.. ¡Averigüe por qué!)
  • Acceda a nuestros videos en Youtube
Abrir Whatsapp
¿Cómo podemos ayudarte?
© IEDGE AI Business School
Soy Laura Rodríguez, del Dpto. de Admisiones de IEDGE AI Business School. ¿Cómo puedo ayudarte?