A lo largo de los años he programado ordenadores en muchos lenguajes, desde los más cercanos al código máquina como el
, etc. Pero de entre todos ellos hay uno al que le tengo especial aprecio, tal vez porque ha sido el que más he utilizado en los últimos años, o tal vez porque para mí supuso un gran salto en productividad y simplicidad a la hora de desarrollar aplicaciones:
. Es por eso que me he animado a escribir este artículo sobre las bondades de este lenguaje de programación, que descubrí en la facultad allá por el año 1998. Por aquel entonces yo llevaba bastantes años disfrutando de la programación en lenguaje
, y el aprendizaje de Java me hizo darme cuenta de algunas cosas que, hechas de otra forma, se podían realizar de forma más fácil y/o eficiente.
A continuación expongo diez de los motivos que a mi entender hacen de Java uno de los mejores lenguajes de programación que se hayan inventado. He intentado no utilizar términos muy técnicos, aunque en ocasiones no he podido evitarlo ya que eran necesarios para la correcta explicación del motivo.
La principal característica de Java es que es independiente de la plataforma. Esto significa que cuando estás programando en Java, no necesitas conocer a priori el tipo de ordenador o el sistema operativo para el que estás programando. Puedes ejecutar el mismo programa en un PC con Windows, otro con Linux, en un Servidor SUN con sistema operativo Solaris, o en un teléfono móvil de última generación. Esta es una ventaja muy significativa, sobre todo teniendo en cuenta que en la actualidad millones de ordenadores heterogéneos están interconectados entre sí a través de Internet… ¡y todos ellos pueden ejecutar el mismo código escrito en Java!
La independencia de la plataforma fue un reto perseguido por anteriores lenguajes de programación como el lenguaje C, pero no fue hasta la llegada de Java cuando se consiguió en su totalidad. ¿Cómo se consigue hacer un lenguaje que no dependa de la máquina en la que se ejecuta? James Gosling y el resto de creadores de Java se inventaron una máquina ficticia, llamada Máquina Virtual Java (JVM). De este modo, cuando tú estás haciendo un programa en Java, lo estás programando para que funcione en esta máquina virtual (que no existe realmente). Lo único que falta es hacer un simulador de esta máquina virtual para el entorno en concreto donde necesitas ejecutar tu programa, y será este simulador el que ejecute el código. Así, cuando se ejecuta un programa escrito en Java, en realidad lo que estamos ejecutando es un simulador de esta máquina virtual, y este simulador es el que realmente ejecuta el código. Por eso se dice que Java es un lenguaje Compilado e Interpretado a la vez, porque el código se compila a un lenguaje intermedio de una máquina que no existe (lenguaje ByteCode), y cuando queremos ejecutarlo, es un simulador (intérprete) el que lo hace.
Motivo 2: Orientado a Objetos
Otro de los grandes avances frente a lenguajes como C es que el lenguaje Java es orientado a objetos. El paradigma de programación orientada a objetos supuso un gran avance en el desarrollo de aplicaciones, ya que es capaz de acercar la forma de programar a la forma de pensar del ser humano. Así, al igual que pensamos en objetos como una silla, una mesa o un coche, cuando programamos en un lenguaje orientado a objetos también tenemos trabajamos con conceptos similares.
Hay que destacar que Java no fue el primer lenguaje orientado a objetos, ya existían otros lenguajes como Smalltalk o C++ (evolución de C con características de orientación a objetos).
Figura 2: Un simple programa escrito en Java
Motivo 3: Gestión de Memoria
Cuando estamos programando y necesitamos cierta cantidad de memoria RAM para albergar datos, es necesario que el programa solicite esa memoria al sistema operativo. En lenguaje C, cuando el programa no necesita utilizar más esa memoria, es necesario que explícitamente la devuelva al sistema. Uno de los motivos que más quebraderos de cabeza ha traído a los programadores en lenguaje C es la correcta liberación de la memoria. Si se te olvida liberar algo de memoria, cuando el programa termina esa memoria se queda ocupada (aunque el programa ya no siga ejecutándose), son los famosos “Memory Leaks”.
En Java decidieron romper con el sistema tradicional de liberación de memoria, haciendo que el programador ya no fuese el responsable de esa tarea. Así, lo único que necesita hacer el programador es solicitar la memoria al sistema. Existe un proceso independiente denominado “Garbage Collector” que se encarga de liberar automáticamente toda la memoria que ya no se utiliza, de manera que la liberación de memoria se hace de manera trasparente al programador.
Motivo 4: Facilidad de Aprendizaje
El lenguaje Java es relativamente fácil de aprender comparado con otros. Si se conoce algún lenguaje de programación como Pascal o C, la transición a Java no es muy costosa, ya que la sintaxis es muy parecida. Si no se conocen otros lenguajes, Java tiene algunas ventajas en cuanto a facilidad de aprendizaje, como la no existencia de los denominados punteros (que al principio suele costar bastante asimilar al aprender a programar en C), o la ya mencionada gestión automática de memoria gracias al Garbage Collector. Además, el aprendizaje de Java se puede realizar de manera gradual, según intentamos hacer en la asignatura de introducción a la programación del primer curso del grado en informática de la UC3M. Así, primero se explican las características del lenguaje puramente imperativo (variables, bucles, condicionales y métodos/funciones), y una vez asimilados estos conceptos, se introducen los de la programación orientada a objetos.
Motivo 5: Librerías Estándar
Una de las características que más potencia aporta al lenguaje Java es que viene acompañado de una serie de librerías estándar para realizar multitud de operaciones comunes a la hora de programar. Es el llamado Java API, que incluye tres bloques básicos:
Java Standard Edition (
JSE),
Java Enterprise Edition (
JEE) y
Java Micro Edition (
JME). La versión Standard cubre el desarrollo de aplicaciones de propósito general, y es la base sobre la que se apoyan las otras dos. La versión Enterprise proporciona librerías para el desarrollo de aplicaciones empresariales multicapa (ofrece los estándares para el desarrollo de aplicaciones en Servidor). La versión Micro está especialmente orientada a dispositivos embebidos como teléfonos móviles, PDA’s, etc.
Figura 3: El API de J2SE
Motivo 6: Comunidad Open Source
Otro de los motivos que aporta gran potencia al lenguaje es la gran comunidad de desarrolladores existente. De esta comunidad han surgido multitud de librerías de código abierto que se han convertido en estándares de-facto. Un ejemplo de comunidad de desarrolladores es la
Asociación JavaHispano, que en su web ofrece todo tipo de información relativa a Java en castellano. Otro gran ejemplo de comunidad es el Proyecto
Jackarta Jakarta de la Fundación
Apache, que alberga y da soporte a multitud de librerías comúnmente utilizadas en el mundo del desarrollo Java. A esta lista se podrían añadir multitud de proyectos Open Source que sirven de punto de partida para muchos desarrollos.
Motivo 7: Entornos de Desarrollo
Cuando empecé a programar en Java, era muy común entre desarrolladores utilizar editores de texto para programar (como
NotePad o cualquier editor común en Windows, o
Vi en Linux). El desarrollo con estos editores era bastante lento, porque aportaban muy pocas funcionalidades específicas del lenguaje (básicamente iluminación de sintaxis). Sin embargo, hoy en día existen excelentes editores (IDEs) que aportan multitud de ayudas a la programación, haciendo que el desarrollo sea más fluido y cómodo. Ejemplos de excelentes IDEs son
Eclipse,
NetBeans o el excelente
IntelliJ Idea.
Motivo 8: Frameworks para desarrollo Web
Por encima de los estándares que ofrece JEE para el desarrollo de aplicaciones Java en el servidor (Servlets, JSP’s, etc.), existen multitud de frameworks y librerías que ofrecen capas para el desarrollo de aplicaciones Web de manera más ágil, organizada y escalable. Así, para la persistencia en base de datos podemos utilizar librerías como
Hibernate. Como framework Modelo-Vista-Controlador existen alternativas como
Struts,
Spring, JavaServer Faces (
JSF), etc. Estos frameworks facilitan y agilizan el desarrollo de aplicaciones en la parte Servidor.
Motivo 9: Gestión de Errores
Otra de las soluciones más elegantes propuestas por el lenguaje Java a uno de los problemas recurrentes en otros lenguajes de programación es la gestión de errores a través de excepciones. En Pascal, C o C++ no existe un mecanismo específico para la gestión de los errores que puedan producirse en el código. El programador tiene que analizar cada caso concreto e idear la mejor forma de resolverlo. Sin embargo, con Java se introdujo un mecanismo común para la gestión de errores, a través de las denominadas Excepciones. Cuando se produce un evento excepcional, se altera el flujo normal de ejecución del programa y se gestiona un flujo alternativo de control de este tipo de errores.
Motivo 10: Mutithreading y Sincronización
Cuando se estudia el funcionamiento de los sistemas operativos en ingeniería informática, existen diversas formas de abordar la gestión de múltiples hilos de ejecución paralelos (threads). Asimismo, hay diversos mecanismos para poner de acuerdo a los hilos en el acceso a los recursos del sistema, de manera que dos hilos no puedan acceder a la vez al mismo recurso (imagina que dos procesos quieren imprimir a la vez por la impresora, hay que ponerlos de acuerdo para que primero lo haga uno y luego el otro).
No quiero profundizar demasiado en temas técnicos, tan sólo mencionar que la solución que aporta Java para la gestión multi-hilo y para la orquestación de procesos (basada en bloques sincronizados) me parece de las más elegantes y fáciles de utilizar que he visto.
Algunas desventajas
No quería terminar el artículo sin dejar claro que no todo son ventajas en Java. Se trata de un lenguaje con muchas cualidades, pero también tiene sus puntos flojos. Así, al tratarse de un lenguaje interpretado, el rendimiento en la ejecución de programas suele ser un poco menor (aunque este efecto se palió bastante con los compiladores
Just-In-Time). Además, al contrario que los programas compilados a código nativo, sólo podemos ejecutar un programa en Java si disponemos de una máquina virtual (JVM), sin este simulador no podremos ejecutar ningún programa escrito en Java. Existen también puntos mejorables en algunos ámbitos como la gestión de Excepciones, políticas del Garbage Collector, polimorfismo, etc., que supongo irán mejorando con el tiempo.
Referencias