lunes, 13 de diciembre de 2010

Diez motivos para programar en Java

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 Ensamblador, hasta lenguajes funcionales como Haskell, pasando por lenguajes lógicos como PROLOG o imperativos como Basic, Pascal, C, C++, C#, 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: el lenguaje Java. 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 C, 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.

Motivo 1: Independiente de la Plataforma
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.

Figura 1: El código Java es Compilado y luego Interpretado

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

22 comentarios:

Anónimo dijo...

Hay que decir que el Garbage Collector tampoco es invento de Java (Lisp ya lo tenía).

Jose dijo...

Es más, ¿hay algo de esta lista que no estuviera en Smalltalk allá por los 80??? Vale, no en móviles, pero el móvil que sale en el Equipo A tampoco llevaba Java...

Manuel Pereira dijo...

Anónimo tienes razón, en realidad muchas de las cosas que menciono no se inventaron con Java, creo que el mayor mérito de Java fue la multiplataforma y poner todas estas cosas juntas en un mismo lenguaje.
Jose, no he programado mucho en Smalltalk, pero según recuerdo de mis tiempos de facultad, era bastante infierno (código ilegible, por no hablar del IDE de IBM). Y por supuesto no era multiplataforma (aunque si era orientado a objetos puro, lo cual dejaba una sintaxis muy limpia... pero insisto en que bastante ilegible).
En cualquier caso, para gustos los colores ;-)

Anónimo dijo...

Un motivo para no usarlo: Oracle.

Anónimo dijo...

Soy el primer anónimo, respecto al GC el alcance era porque en cuanto a OOP se hacía la salvedad que Java no era el primero.
Por otro lado, una ventaja del, digamos entorno Java que falta en el artículo, es que puedes no usar Java, pero si acceder a sus ventajas con lenguajes que compilan a bytecodes (por ejemplo: Scala).

Jose dijo...

Manuel, echa un vistazo a Pharo Smalltalk, por ejemplo...

En los noventa yo utilizaba Smalltalk Express, no el monstruo Visual Age, el de IBM, que seguramente es el que conociste, nada comparable.., el primero tenía hasta un editor visual de interfaces. Instantiation son los herederos de aquello..., y salían aplicaciones Windows 3 estupendas...

En mi comentario quería decir que las razones de java, no están mal, pero que todas ya estaban presentes en otros lenguajes que no han tenido tanta difusión.., la clave de java, posiblemente, el impulso por parte de unos pocos grandes, IBM, Sun, Oracle, frente a Microsoft...

Smalltalk llegó con 20 años de adelanto.., sólo para inspirar el interfaz de los Mac.

Y, por lo mismo, la razón por la que usas, y yo también, Java, para comer, es porque es lo que el mercado pide, como en su momento pedía Cobol o C++...

Manuel Pereira dijo...

Anónimo, gracias por la referencia a Scala, no lo conocía y tiene buena pinta, le echaré un vistazo en más detalle.
Jose, efectivamente mi ingrata experiencia fue con Visual Age for Smalltalk, guardo muy malos recuerdos de aquello. Es posible que tengas razón en que Java se ha hecho tan popular por el esfuerzo "comercial" de grandes empresas apoyándolo. De todas formas fue el primer lenguaje que conocí y utilicé totalmente independiente de la plataforma. ¿Esto también se había inventado antes?
Un saludo y gracias por comentar!

Anónimo dijo...

No estoy muy seguro de cuando se invento el java, y tampoco que este muy puesto, pero me da que la mayor parte de los lenguajes interpretados (python, perl, tcl, ...) comparten la multiplataformidad, si bien es cierto que su definicion de interpretado es diferente a la del java. Y ademas, esos lenguajes comparten bastantes otras de las "buenas" caracteristicas de java.

De las que bondades que mencionas, creo que la mas clara de todas es la existencia de buenos IDEs. Aunque bien mirado, eso no tiene nada que ver con el lenguaje.

Y en su lista de desventajas, yo habria incluido otra que en realidad tambien tiene poco que ver con el lenguaje, pero si con el motivo 8. Se utiliza casi exclusivamente para desarrollo web, por lo que casi se puede considerar un lenguaje de nicho, y la mayor parte de su "potencialidad" se queda en los manuales.

Anónimo dijo...

La parte de MultiPlataforma, no es tan transparente, pues en mi caso me a tocado configurar la misma aplicacion sobre distintos SO y pues si hay que hacer cambios. Estos cambios son pequeños, pero si hay que hacerlo.

Nando dijo...

El cobol siempre fue multiplataforma. Se compilaba a algo intermedio y se corría con un runtime (runcobol). Saludos!!!

Jeeba dijo...

Creo que el punto 4 no es del todo completo, y decir que C++ es mas dificl de aprender tan solo por sus punteros, es seguir con el cliche de la supuesta dificultad de C++. C++ de hecho es mas simple, puedes aprenderlo mas rapido que Java ya que puedes programar imperativamente desde un comienzo, en JAVA es nas dificil ( vamos que una pizca de dificil pero es mas dificil de comprender de que trata ese keyword class si no tienes idea de clases). Ademas puedes programar sin usar punteros al comienzo. De hecho recomendaria aprender C++ antes que Java, es un camino mas progresivo, de imperativo a objetos

Xavi Miró dijo...

Hola, Manuel.

Felicidades por esta excelente entrada de blog, coincido al 100% en las ventajas de Java que comentas.

Sólo quería comentarte una salvedad: C++ también tenía gestión de excepciones cuando apareció Java. Lo que sí hizo Java es implementar las excepciones con algunas diferencias respecto a C++ (como no poder lanzar/capturar un objeto cualquiera, sino sólo Throwable o sus subclases).

Un saludo,

Xavi

Manuel Pereira dijo...

Gracias Xavi!

sbuki dijo...

Programar en Java es muy seguro, es decir, que no hace falta ser muy buen programador para crear un código estable. Claro, aquí somos todos los genios de programación y nunca cometemos errores ;) pero es una ventaja que tiene Java.

Sergi dijo...

Programar en Java es muy seguro, es decir, que no hace falta ser muy buen programador para crear un código estable. Claro, aquí somos todos los genios de programación y nunca cometemos errores ;) pero es una ventaja que tiene Java.

Anónimo dijo...

Saludos, Manuel!

Te dejo aqui otro web framework de Java llamado Play! Framework, http://playframework.org . Para ser honesto, soy un novato todavia en Java aunque ya he entendido muchos de los conceptos, tenemos que mencionar que cuando se introduce Ant, Maven *aunque no es obligatorio, pero finalmente lo es para crear una aplicación grande* la primera vez que escuche de Ant me quede con muchas dudas de lo que era.

Lo unico que me molesto fue la introducción de los web frameworks en Java, no son faciles como se pintan, comparado con los lenguajes interpretados como PHP, Python, etc y sus web frameworks( Zend Framework, Django, RoR, etc). En Java, para aprenderlos tienes que usar demasiadas referencias solo para hacer algo simple.

Ahora que Play! Framework surge, creo que Java va convertirse el #1 para programar en la web.

deterioro dijo...

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”.

Me parece que has cometido un error. Lo que dices no tiene mucho sentido puesto que si el proceso termina, la memoria que haya reservado queda liberada; es absurdo que el SO guarde en caché memoria asociada a un proceso que ya no está en la cola de reparto de CPU.

Un "memory leak" o "fuga de memoria" significa que si dejamos memoria sin referenciar esa memoria seguirá estando ocupada aún que ya no sea accesible. Es decir, si hago:

char* p = (char*)malloc(sizeof(char));
p = NULL;

Habrá un byte de memoria derrefereniada pero no liberada, pero en cuanto finalice la ejecución del proceso esa memoria quedará libre.

deterioro dijo...

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”.

Me parece que has cometido un error. Lo que dices no tiene mucho sentido puesto que si el proceso termina, la memoria que haya reservado queda liberada; es absurdo que el SO guarde en caché memoria asociada a un proceso que ya no está en la cola de reparto de CPU.

Un "memory leak" o "fuga de memoria" significa que si dejamos memoria sin referenciar esa memoria seguirá estando ocupada aún que ya no sea accesible. Es decir, si hago:

char* p = (char*)malloc(sizeof(char));
p = NULL;

Habrá un byte de memoria derrefereniada pero no liberada, pero en cuanto finalice la ejecución del proceso esa memoria quedará libre.

deterioro dijo...

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”.

Me parece que has cometido un error. Lo que dices no tiene mucho sentido puesto que si el proceso termina, la memoria que haya reservado queda liberada; es absurdo que el SO guarde en caché memoria asociada a un proceso que ya no está en la cola de reparto de CPU.

Un "memory leak" o "fuga de memoria" significa que si dejamos memoria sin referenciar esa memoria seguirá estando ocupada aún que ya no sea accesible. Es decir, si hago:

char* p = (char*)malloc(sizeof(char));
p = NULL;

Habrá un byte de memoria derrefereniada pero no liberada, pero en cuanto finalice la ejecución del proceso esa memoria quedará libre.

felipe Quintero dijo...

agradezco tu aporte me sirvio de mucho.

Reactive Games dijo...

Muy buen aporte, muy interesante tu blog, te felicito por el trabajo realizado !!!

Joseph Lixco dijo...

Muy interesante la aportación que describes, sobretodo para novatos en el desarrollo.