14.3. Programar para la RED

14.3.4. JAVA

Toda la prensa especializada en informática (impresa y electrónica) y, sobre todo, la directamente relacionada con Internet, dedica cada vez mas espacio a Java puesto que es el principal fenómeno actual del World Wide Web.

Esta apreciación respecto al presente y futuro de Java no es fortuita ni caprichosa, sino que tiene relación con las características propias del lenguaje y, especialmente con las prestaciones para el desarrollo de aplicaciones interactivas con sonido y animación en línea.

Se prevé una influencia determinante de este lenguaje en la forma de distribuir y comercializar las aplicaciones informáticas. Según Scott McNealy, CEO de Sun Microsystems, empresa creadora de Java, este lenguaje permitirá distribuir software gratuíto a través de Internet. Gracias a esto, millones de usuarios dejarán de pagar por las tradicionales aplicaciones comerciales, es decir sólo pagarán por lo que usen, lo que implicará un cambio notorio respecto a los actuales mecanismos y estructuras de comercialización de las aplicaciones comerciales y, con ello, en la estructura ocupacional del sector informático. 

¿Qué es Java?

Java nació en 1990 en las instalaciones de Sun Microsystems, empresa que invirtió más de 5 años en su desarrollo, como un lenguaje para programar los chips de los artículos electrónicos de amplio consumo (tipo VCR, TV, etc.).

En un principio, pretendieron programar los chips con C++ pero, dado el complicado entorno tecnológico en el que se desarrollaba, fueron surgiendo una serie de problemas de programación con dicho lenguaje los que, al ser solucionados por el personal de Sun, posibilitaron la creación, a partir de C++, de un nuevo lenguaje de programación llamado Java.

El anuncio público de la existencia de Java se realizó en mayo de 1995, en la conferencia World en San Francisco, EE.UU. Oportunidad esta, en que Marc Andressen, Vicepresidente de Netscape, hizo público, que Netscape v.2.0 soportaría Java, lo que fue seguido por Microsoft, Oracle y otras empresas.

A partir de ese momento se ha operado una meteórica evolución de Java como lenguaje para el desarrollo de aplicaciones para Internet. Gracias a elllo existen, actualmente, diferentes versiones del lenguaje, entre las que destacan: Café (http://www.symantec.com), Latté, RAD tecnology for Java (http://www.borland.com), Java Developer's Kit, JDK (http://java.sun.com) y Visual J++ (http://www.microsoft.com). También es elevado (y rápido) el grado de difusión de Java entre los desarrolladores de páginas web. Según una encuesta realizada en abril de 1996 por la Georgia Tech Research Corporation, GTR (http://www.cc.gatech.edu/gvu/user_surveys/survey-04-1996), a más de 11,700 cibernautas (de los cuales 3,218 son autores de páginas web), el 17,34% de los encuestados desarrollan actualmente, en mayor o menor medida, en Java (en los EE.UU. la cifra llegó al 17,39%, mientras que en Europa alcanzó un 20,97%).

¿Por qué ha sido reconocido y adoptado tan rápidamente por los principales proveedores de tecnologías para Internet y por los desarrolladores? Si quisiéramos brindar una respuesta concisa a esta pregunta podríamos limitarnos a decir que por sus características principales: es simple, pequeño, orientado a objetos, soporta conectividad, es robusto, seguro, con una arquitectura neutral, portable, interpretado, con una aceptable performance, multihilos y dinámico.

Pero, para un programador no basta con esta respuesta. Sobre todo si estas características son las que, a su vez, promueven la mayor polémica respecto a las virtudes de Java frente a otros lenguajes de programación. Por ello, y dado que las cualidades son múltiples y todas importantes, a riesgo de extendernos en aspectos específicos del lenguaje, consideramos prudente detenernos en lo fundamental de los rasgos distintivos de cada una de las características antes mencionadas.

El esquema de las características técnicas del lenguaje dado por su fabricante principal (Sun), es el siguiente: 

Simple:

Al observar el código de Java (fuente 1), rápidamente identificaremos muchos aspectos y sintaxis semejantes a las del lenguaje C/C++. Pero, si analizamos el mismo con un poco más de detenimiento, descubriremos que son lenguajes diferentes.

Java es más sencillo o simple, en cuanto que omite aquellos elementos de C++ que raramente son usados, que confunden a los programadores, o que son muy difíciles de comprender y dominar. Por ejemplo, Java no soporta sobrecarga de operadores (si soporta sobrecarga de métodos), herencia múltiple y algunos otros males.

Java dispone de un recolector automático de basura ( garbage collector) que se encarga de liberar periódicamente las partes de la memoria que no están siendo referenciadas. Esto es un sueño realizado para los programadores de C/C++,  que tienen que dedicarle atención a las operaciones típicas de gestión de la memoria dentro de sus programas, con lo que se eleva, sensiblemente, la complejidad de la programación y, con ello, las posibilidades de error. 

Pequeño:

Java está diseñado para crear aplicaciones que se ejecutarán en máquinas pequeñas y, principalmente, serán aplicaciones para ser cargadas desde la red y luego ejecutadas en las máquinas clientes. Por ello, el intérprete de Java, al igual que sus librerías, deberán ser muy optimizadas y pequeñas. 

Orientado a Objetos:

Desde hace ya unos años los lenguajes más potentes del mercado han demostrado la importancia de la programación orientada a objetos y la posibilidad que ésta ofrece a los desarrolladores de aplicaciones para crear nuevos componentes o usar los fabricados por otras empresas. C++, Pascal, Visual FoxPro, Delphi, Visual Objects, Visual Basic, son ejemplos de la adaptación, de la teoría OOP a la práctica, en productos y lenguajes comerciales de gran éxito en el mercado actual.

Java, al partir de C++, soporta las características de la implementación OOP en este lenguaje y también gran parte de su sintaxis. Por si esto fuera poco, Java posee una serie de extensiones OOP que lo hacen, en cierta forma similar a SmallTalk. Como resultado, la implementación de OOP en Java es muy robusta, capaz de satisfacer hasta los más rigurosos programadores OOP. 

Conectividad:

Realizar aplicaciones que manejen conexiones, transferencias de archivos, abrir y acceder a objetos dentro de la red, simplemente indicando su URL ( Uniform Resource Locator), de la misma forma en que accedemos a los archivos en el disco duro, es bastante más sencillo con Java, debido a que soporta los protocolos TCP/IP (como HTTP y FTP), bastante conocidos por los aficionados a Internet y a otras redes.

Esto convierte a Java en una de las mejores opciones actuales para el desarrollo de aplicaciones distribuidas (Internet/intranet) y, sin lugar a duda, en una de las causas más importantes del desarrollo que se operará en las redes a medio y corto plazo. 

Robusto:

Java hace un chequeo temprano y luego un chequeo dinámico para eliminar, hasta donde sea posible, las situaciones de error, lo que hace que las aplicaciones escritas en él sean muy robustas. Por ejemplo, una de las diferencias importantes a este respecto entre Java y C/C++ es que Java tiene un modelo de punteros que elimina la posibilidad de sobreescribir o corromper los datos en memoria. 

Seguro:

Java está diseñado para ser utilizado como lenguaje de uso general, apto para crear aplicaciones que funcionen eficientemente en entornos de red (distribuidos). Esto exige, por ejemplo, que existan formas de garantizar la producción y ejecución de software libre de virus.

Existe una relación muy importante entre la robustez y la seguridad de Java.

El modelo Java hace imposible que una aplicación acceda a estructuras o a los datos privados de los objetos para los que no tiene autorización (encapsulación). Esta característica es de gran importancia, ya que el ritmo de desarrollo y difusión de Internet en la actualidad depende, en gran medida, del grado de seguridad real que ésta le ofrezca a sus usuarios (programadores y usuarios finales) para el tratamiento de la información privada. 

Arquitectura Neutral

El lenguaje está diseñado para crear aplicaciones que puedan ser ejecutadas en diferentes plataformas de hardware y en diferentes sistemas operativos, pues esto es lo mas común dentro de una red de computadoras. Por lo que el compilador Java con el que se trabaje tendrá que ser capaz de generar código compilado ejecutable en varias plataformas, en las cuales deberá existir un sistema Java Runtime o una máquina virtual Java ( Java Virtual Machine).

Esto no sólo es positivo para la potencialidad y conectividad de las redes, sino también para los desarrolladores de software quienes, con Java, pueden ofrecer sus aplicaciones sin tener que preocuparse porque sus clientes sean usuarios de PCs o Apple Macintosh. Como bien es conocido por los lectores, en los lenguajes tradicionales el desarrollador está obligado a escribir una versión para cada plataforma de trabajo. En cambio con Java, gracias a su arquitectura, la misma versión del programa puede ser ejecutada en las dos plataformas sin que sea necesario realizarle ninguna modificación.

Java logra ésto a través de su compilador, el cual genera una serie de instrucciones (bytecode) que no dependen de una arquitectura determinada y que están especialmente pensadas para su fácil interpretación y, también, para realizar un concepto muy interesante: convertirlo en código nativo al vuelo ( compiling on the fly) por el Just in time Compiler (JIT)

Esto es posible gracias a que la máquina virtual (VM) de Java está asociada, por lo general, con un Browser, o sea, con un navegador de páginas de Internet/Intranet. El código Java (archivos .java), una vez compilado (archivos .class), es transmitido por la red hasta llegar al navegador y es éste el que interpretará los bytecodes de Java, ejecutando así el applet.

En el mejor de los casos se dispone de la implementación de un compilador JIT, lo cual mejorará notablemente la performance de ejecución.

Es de destacar que la máquina virtual no tiene por qué estar embebida dentro de un Browser, ya que puede formar parte del sistema operativo y así permitir la ejecución de una aplicación Java como una aplicación normal dentro del S.O. Por lo tanto, es evidente que esta característica de Java termina con los límites de los tradicionales S.O., abriendo nuevas perspectivas y posibilidades para el desarrollo de aplicaciones, tanto para los PCs, como para los Apple Macintosh, etc. 

Portable:

Al tener una arquitectura neutra, Java ya tiene mucho terreno ganado como portable. Pero portable significa un poco más que eso. Por ejemplo, si es portable tiene que garantizar que los tamaños y las reglas aritméticas de los tipos de datos primitivos sean siempre los mismos y que estos no varíen en función de la plataforma en la que se ejecute el programa.

Hoy en día ya existen librerías que definen las interfaces portables. Por ejemplo, existe una clase abstracta llamada Window que tiene implementaciones específicas para Windows NT/95, Macintosh y UNIX. Por supuesto, el futuro de la portabilidad de Java y toda la potencia que ello encierra dependerá (como lo ha sido hasta ahora), de la capacidad de los productores de llegar a acuerdos que estandaricen los elementos que definen el lenguaje. Esperemos que, más allá de las pretensiones de cada productor de sacar la máxima ventaja para su empresa, la portabilidad de Java no sea sacrificada. Y pensamos así porque creemos que, a partir de lo ya logrado con la portabilidad de Java, nada será igual en el mundo del desarrollo de aplicaciones. 

Interpretado:

Los bytecodes generados por el compilador de Java son convertidos en instrucciones nativas y ejecutadas, siendo almacenadas únicamente en memoria. Dentro de estos bytecodes de Java hay mucha información del proceso de compilación, la cual está disponible en tiempo de ejecución, por lo que permite una mas fácil depuración y varios controles sobre el código.

A este respecto es necesario destacar que, a pesar de la fuerte tendencia en el mercado Java de implementar y utilizar los cada vez más poderosos compiladores JIT, lo cierto es que esta característica también le brinda a Java las conocidas y no despreciables ventajas de los lenguajes interpretados, por lo que en este sentido el lenguaje brinda opciones para todos los gustos. 

Performance:

Según testeos, la velocidad actual de los programas Java es de 10 a 20 veces más lenta que la de las aplicaciones C++. Pero al analizar esta situación debemos también destacar que Java aún se encuentra en lo que podríamos definir como la etapa infantil de su desarrollo, por lo que el mismo aún está por mostrar una performance propia de un lenguaje maduro.

Como parte de las soluciones normales para este tipo de limitaciones en la programación, existen varias tecnologías, para mejorar este problema. Gracias a la posibilidad de que los bytecodes de Java pueden ser convertidos en el vuelo (en ejecución) en código nativo de la CPU donde se ejecute la aplicación, la performance del código Java puede ser mejorada notablemente (en general, de 2 a 10 veces e incluso la mejoría puede ser superior).

La velocidad de los programas Java es una de las limitaciones actuales más notorias de su performance y, por lo tanto, en breve debemos esperar algunas novedades tecnológicas para superar de forma más eficiente y definitiva la misma. 

Multithreaded (multihilos)

Las aplicaciones Java pueden tener múltiples hilos o varias vías de ejecución, es decir, varios procesos que se ejecutan al mismo tiempo, lo cual es muy importante para la realización de tareas típicas en las redes tales como, por ejemplo, la transferencia de archivos de forma más flexible.

La importancia de esta característica se manifiesta directamente en que, gracias a multithreaded, las aplicaciones Java pueden ser más interactivas. Esta peculiaridad del lenguaje permitirá sustituir con mayor facilidad, a corto plazo, el carácter estático de la inmensa mayoría de las páginas web por un carácter dinámico y, por si fuera poco, permitirá desarrollar aplicaciones que puedan ser ejecutadas en Internet. 

Dinámico:

Cada vez más, al desarrollar software utilizamos componentes de terceras partes o partes del sistema operativo todo lo cual, dada la velocidad de los cambios tecnológicos, nos hacen estar pendientes de las nuevas versiones y/o actualizaciones para poder poner a tono nuestras aplicaciones con el mercado. 

Conclusiones:

Java está muy lejos de ser la panacea que resuelva todos los problemas, complejidades y limitaciones de los tradicionales lenguajes de programación. No obstante opinamos que el lenguaje representa un nuevo hito en el desarrollo de las tecnologías de programación, capaz de responder a las exigencias tecnológicas y de comunicación del presente, gracias a lo cual las formas y métodos de programación sufrirán cambios importantes.

Si Java se difunde a nivel internacional de acuerdo a las proyecciones actuales, influirá notoriamente en el sector informático (y a partir de él en otros sectores), sacudiendo hasta los cimientos su estructura de producción (lo que afectará el lugar y papel de los desarrolladores), de distribución y de consumo.