1. Antecedentes.
A lo largo de los años he
programado ordenadores en muchos lenguajes, desde los más cercanos al código
máquina como elEnsamblador, 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.
2. Bases Teóricas.
¿Dónde está el fallo se seguridad?
Obviamente los fallos de seguridad
dentro de toda la plataforma que comprende Java pueden
encontrarse en cualquier versión o sistema operativo, pero realmente donde
están los fallos de seguridad es en el navegador (en el complemento de Java de
cada navegador que permiten ejecutar los applets) y no en todos los
demás sitios (como por desgracia se está empando a creer).
¿Pero cuál es el fallo de seguridad?
Uno de los motivos por lo que los
navegadores son el principal foco de malware es por el gran
acceso que hay a Internet (como es lógico a través del navegador) y por la
facilidad que existe para hacer que cualquier persona entre a una web sin
conocerla (“¡Oh! mirar esto”… y si, lo normal que no haya nada, pero puede que
te encuentres con una página normal que ha conseguido infectarte a través de un
complemento del navegador).
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
(comoNotePad 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.
CONCLUSIONES
Nosotros como
desarrolladores sabemos cual es el problema, simplemente fallos de seguridad en
un navegador (usado de forma masiva), pero la gente que no tiene unos
conocimientos básicos de seguridad si nadie les previene acabarán con el malware de turno y se extenderá la creencia
que últimamente está dando que hablar: “Java es inseguro, no uses nada que
funcione con Java“, claramente, una
creencia errónea, usa el PC, todo lo que quieras, pero con cabeza o te dará
igual que sea Java u otro programa.
RECOMENDACIONES.
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
.