Java es un lenguaje de programación orientado a objetos, desarrollado por Sun
Microsystems a principios de los años 90.
El lenguaje en sí mismo toma mucha de su sintaxis de C y C++, pero tiene
un modelo de objetos más simple y elimina herramientas de bajo nivel, que
suelen inducir a muchos errores, como la manipulación directa de punteros o memoria. Con respecto a la
memoria, su gestión no es un problema ya que ésta es gestionada por el propio
lenguaje y no por el programador.
Las aplicaciones
Java están típicamente compiladas
en un bytecode,
aunque la compilación en código máquina nativo también es posible. En el
tiempo de ejecución, el bytecode es
normalmente interpretado o compilado a código nativo
para la ejecución, aunque la ejecución directa por hardware
del bytecode por un procesador
Java también es posible.
La implementación original y de referencia del compilador,
la máquina virtual y las bibliotecas de clases de
Java fueron desarrolladas por Sun Microsystems en 1995. Desde entonces, Sun
ha controlado las especificaciones, el desarrollo y evolución del lenguaje a
través del Java Community Process, si bien otros han
desarrollado también implementaciones alternativas de estas tecnologías de Sun,
algunas incluso bajo licencias de software
libre.
Entre diciembre de 2006 y mayo de 2007, Sun Microsystems
liberó la mayor parte de sus tecnologías Java bajo la licencia GNU GPL,
de acuerdo con las especificaciones del Java Community Process, de tal forma
que prácticamente todo el Java de Sun es ahora software
libre (aunque la biblioteca de clases de Sun que se
requiere para ejecutar los programas Java aún no lo es).
Historia
Java se creó como una herramienta de programación para
ser usada en un proyecto de set-top-box en una pequeña operación denominada
the Green Project en Sun Microsystems en el año 1991. El equipo (Green
Team), compuesto por trece personas y dirigido por James Gosling,
trabajó durante 18 meses en Sand Hill Road en Menlo Park en su desarrollo.
El lenguaje se denominó inicialmente Oak (por
un roble que había fuera de la oficina de Gosling), luego pasó a denominarse Green
tras descubrir que Oak era ya una marca comercial registrada para
adaptadores de tarjetas gráficas y finalmente se renombró a Java.
El término Java fue acuñado en una cafetería
frecuentada por algunos de los miembros del equipo. Pero no está claro si es un
acrónimo o no, aunque algunas fuentes señalan que podría tratarse de las
iniciales de sus creadores: James Gosling, Arthur Van
Hoff, y Andy Bechtolsheim. Otros abogan por el siguiente acrónimo, Just
Another Vague Acronym ("sólo otro acrónimo
ambiguo más"). La hipótesis que más fuerza tiene es la que Java debe su
nombre a un tipo de café disponible en la cafetería cercana, de ahí que el
icono de java sea una taza de café caliente. Un pequeño signo que da fuerza a
esta teoría es que los 4 primeros bytes (el número mágico) de los
archivos .class que genera el compilador, son en hexadecimal, 0xCAFEBABE. A
pesar de todas estas teorías, el nombre fue sacado al parecer de una lista
aleatoria de palabras.
Los objetivos de Gosling eran implementar una máquina
virtual y un lenguaje con una estructura y sintaxis similar a C++. Entre
junio y julio de 1994, tras una sesión maratoniana de tres días entre John Gaga,
James Gosling, Patrick Naughton, Wayne Rosing y Eric Schmidt, el equipo
reorientó la plataforma hacia la Web. Sintieron que la llegada del navegador
web Mosaic,
propiciaría que Internet se convirtiese en un medio interactivo, como el que
pensaban era la televisión por cable. Naughton creó entonces un prototipo de
navegador, WebRunner, que más tarde sería conocido como HotJava.
En 1994, se les hizo una demostración de HotJava y la
plataforma Java a los ejecutivos de Sun. Java 1.0 a pudo descargarse por
primera vez en 1994, pero hubo que esperar al 23 de mayo de 1995, durante las
conferencias de SunWorld, a que vieran la luz pública Java y HotJava, el
navegador Web. El acontecimiento fue anunciado por John Gage, el Director
Científico de Sun Microsystems. El acto estuvo acompañado por una pequeña
sorpresa adicional, el anuncio por parte de Marc Andreessen, Vicepresidente
Ejecutivo de Netscape, de que Java sería soportado en sus navegadores. El 9 de
enero del año siguiente, 1996, Sun fundó el grupo empresarial JavaSoft para que
se encargase del desarrollo tecnológico. Dos semanas más tarde la primera
versión de Java fue publicada.
La promesa inicial de Gosling era Write Once, Run
Anywhere (Escríbelo una vez, ejecútalo en cualquier lugar), proporcionando
un lenguaje independiente de la plataforma y un entorno de ejecución (la JVM) ligero y gratuito para las
plataformas más populares de forma que los binarios (bytecode) de las
aplicaciones Java pudiesen ejecutarse en cualquier plataforma.
El entorno de ejecución era relativamente seguro y los
principales navegadores web pronto incorporaron la posibilidad de ejecutar applets Java
incrustadas en las páginas web.
Java ha experimentado numerosos cambios desde la
versión primigenia, JDK
1.0, así como un enorme incremento en el número de clases y paquetes que
componen la biblioteca estándar.
Filosofía
El lenguaje Java se creó con cinco objetivos
principales:
- Debería usar la metodología de la programación orientada a objetos.
- Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
- Debería incluir por defecto soporte para trabajo en red.
- Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
- Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.
Para conseguir la ejecución de código remoto y el
soporte de red, los programadores de Java a veces recurren a extensiones como CORBA (Common Object
Request Broker Architecture), Internet
Communications Engine o OSGi respectivamente.
Orientado a objetos
La primera característica, orientado a objetos (“OO”), se refiere a un
método de programación y al diseño del lenguaje. Aunque hay muchas
interpretaciones para OO, una primera idea es diseñar el software de forma que
los distintos tipos de datos que usen estén unidos a sus operaciones. Así, los
datos y el código (funciones o métodos) se combinan en entidades llamadas objetos. Un objeto puede
verse como un paquete que contiene el “comportamiento” (el código) y el
“estado” (datos). El principio es separar aquello que cambia de las cosas que
permanecen inalterables. Frecuentemente, cambiar una estructura de datos
implica un cambio en el código que opera sobre los mismos, o viceversa. Esta
separación en objetos coherentes e independientes ofrece una base más estable
para el diseño de un sistema software. El objetivo es hacer que grandes
proyectos sean fáciles de gestionar y manejar, mejorando como consecuencia su
calidad y reduciendo el número de proyectos fallidos. Otra de las grandes
promesas de la programación orientada a objetos es la creación de entidades más
genéricas (objetos) que permitan la reutilización del software entre proyectos,
una de las premisas fundamentales de la Ingeniería del Software. Un objeto
genérico “cliente”, por ejemplo, debería en teoría tener el mismo conjunto de
comportamiento en diferentes proyectos, sobre todo cuando estos coinciden en
cierta medida, algo que suele suceder en las grandes organizaciones. En este
sentido, los objetos podrían verse como piezas reutilizables que pueden
emplearse en múltiples proyectos distintos, posibilitando así a la industria
del software a construir proyectos de envergadura empleando componentes ya
existentes y de comprobada calidad; conduciendo esto finalmente a una reducción
drástica del tiempo de desarrollo. Podemos usar como ejemplo de objeto el
aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su
“comportamiento” (soldar dos piezas, etc.), el objeto “aluminio” puede ser
reutilizado en el campo de la construcción, del automóvil, de la aviación, etc.
La reutilización del software ha experimentado
resultados dispares, encontrando dos dificultades principales: el diseño de objetos
realmente genéricos es pobremente comprendido, y falta una metodología para la
amplia comunicación de oportunidades de reutilización. Algunas comunidades de
“código abierto” (open source) quieren ayudar en este problema dando medios a
los desarrolladores para diseminar la información sobre el uso y versatilidad
de objetos reutilizables y bibliotecas de objetos.
Independencia de la plataforma
La segunda característica, la independencia de la
plataforma, significa que programas escritos en el lenguaje Java pueden
ejecutarse igualmente en cualquier tipo de hardware. Este es el significado de
ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier
dispositivo, tal como reza el axioma de Java, ‘’’write once,
run anywhere’’’.
Para ello, se compila el código fuente escrito en
lenguaje Java, para generar un código conocido como “bytecode” (específicamente
Java bytecode) instrucciones máquina simplificadas específicas de la plataforma
Java. Esta pieza está “a medio camino” entre el código fuente y el código
máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces
en la máquina virtual (JVM), un programa escrito en código nativo de la
plataforma destino (que es el que entiende su hardware), que interpreta y
ejecuta el código. Además, se suministran bibliotecas adicionales para acceder
a las características de cada dispositivo (como los gráficos, ejecución
mediante hebras o threads, la interfaz de red) de forma unificada. Se debe
tener presente que, aunque hay una etapa explícita de compilación, el bytecode
generado es interpretado o convertido a instrucciones máquina del código nativo
por el compilador JIT (Just In Time).
Hay implementaciones del compilador de Java que
convierten el código fuente directamente en código objeto nativo, como GCJ. Esto elimina la etapa
intermedia donde se genera el bytecode, pero la salida de este tipo de
compiladores sólo puede ejecutarse en un tipo de arquitectura.
La licencia sobre Java de Sun insiste que todas las
implementaciones sean “compatibles”. Esto dio lugar a una disputa legal entre
Microsoft y Sun, cuando éste último alegó que la implementación de Microsoft no
daba soporte a las interfaces RMI y JNI además de haber añadido características
‘’dependientes’’ de su plataforma. Sun demandó a Microsoft y ganó por daños y
perjuicios (unos 20 millones de dólares) así como una orden judicial forzando
la acatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java
con su versión de sistema operativo, y en recientes versiones de Windows, su
navegador Internet Explorer no admite la ejecución de applets sin un conector
(o plugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas
para distintas versiones de Windows.
Las primeras implementaciones del lenguaje usaban una
máquina virtual interpretada para conseguir la portabilidad. Sin embargo, el
resultado eran programas que se ejecutaban comparativamente más lentos que
aquellos escritos en C o C++. Esto hizo que Java se ganase una reputación de
lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a
programas que se ejecutan considerablemente más rápido que las versiones
antiguas, empleando diversas técnicas, aunque sigue siendo mucho más lento que
otros lenguajes.
La primera de estas técnicas es simplemente compilar
directamente en código nativo como hacen los compiladores tradicionales,
eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la
ejecución, pero tapa el camino a la portabilidad. Otra técnica, conocida como
compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’), convierte el
bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas
virtuales más sofisticadas usan una ‘’’recompilación dinámica’’’ en la que la
VM es capaz de analizar el comportamiento del programa en ejecución y recompila
y optimiza las partes críticas. La recompilación dinámica puede lograr mayor
grado de optimización que la compilación tradicional (o estática), ya que puede
basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno
de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y
la recompilación dinámica permiten a los programas Java aprovechar la velocidad
de ejecución del código nativo sin por ello perder la ventaja de la
portabilidad en ambos.
La portabilidad es técnicamente difícil de lograr, y
el éxito de Java en ese campo ha sido dispar. Aunque es de hecho posible
escribir programas para la plataforma Java que actúen de forma correcta en
múltiples plataformas de distinta arquitectura, el gran número de estas con
pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan
de Sun, "Write once, run anywhere"
como "Write once, debug everywhere" (o “Escríbelo una vez, ejecútalo en
cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)
El concepto de independencia de la plataforma de Java
cuenta, sin embargo, con un gran éxito en las aplicaciones en el entorno del
servidor, como los Servicios Web, los Servlets, los Java Beans, así como en
sistemas empotrados basados en OSGi, usando entornos Java empotrados.
El recolector de basura
En Java el problema de las fugas de
memoria se evita en gran medida gracias a la recolección de basura (o automatic
garbage collector). El programador determina cuándo se crean los objetos y
el entorno en tiempo de ejecución de Java (Java runtime) es el responsable de
gestionar el ciclo de vida de los objetos. El programa, u otros objetos pueden
tener localizado un objeto mediante una referencia a éste. Cuando no quedan
referencias a un objeto, el recolector de basura de Java borra el objeto,
liberando así la memoria que ocupaba previniendo posibles fugas (ejemplo: un
objeto creado y únicamente usado dentro de un método sólo tiene entidad dentro
de éste; al salir del método el objeto es eliminado). Aún así, es posible que
se produzcan fugas de memoria si el código almacena referencias a objetos que
ya no son necesarios es decir, pueden aún ocurrir, pero en un nivel conceptual
superior. En definitiva, el recolector de basura de Java permite una fácil
creación y eliminación de objetos y mayor seguridad.
Sintaxis
La sintaxis de Java se deriva en gran medida de C++. Pero a
diferencia de éste, que combina la sintaxis para programación genérica,
estructurada y orientada a objetos, Java fue construido desde el principio para
ser completamente orientado a objetos. Todo en Java es un objeto (salvo algunas
excepciones), y todo en Java reside en alguna clase (recordemos que una clase
es un molde a partir del cual pueden crearse varios objetos).
Plataformas soportadas
Una versión del entorno de ejecución Java JRE (Java Runtime
Environment) está disponible en la mayoría de equipos de escritorio. Sin
embargo, Microsoft
no lo ha incluido por defecto en sus sistemas operativos. En el caso de Apple,
éste incluye una versión propia del JRE en su sistema operativo, el Mac OS.
También es un producto que por defecto aparece en la mayoría de las
distribuciones de GNU/Linux. Debido a incompatibilidades entre
distintas versiones del JRE, muchas aplicaciones prefieren instalar su propia
copia del JRE antes que confiar su suerte a la aplicación instalada por
defecto. Los desarrolladores de applets de Java o bien deben insistir a los usuarios en la
actualización del JRE, o bien desarrollar bajo una versión antigua de Java y
verificar el correcto funcionamiento en las versiones posteriores. https://www.bcp.com.bo/ibk/Account/Login
Fuente: Wikipedia
Fuente: Wikipedia