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).
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.
hola disculpe en q materia les dan todo eso..........
ResponderEliminary x cierto esta buena la foto de verdad
en la materia que estan viendo eso es en Programacion..
ResponderEliminarLenguaje java es cierto que esta orientados a objetos, sola quisiera saber si las codificaciones de un programa dentro de este lenguaje son mas dificultuosos o tiene codigos diferentes a los demas; en otros terminos el grado de la dificultad es bastante o no.....gracias
ResponderEliminarUn lenguaje de programacion que aun no tenemos conocimiento pero segun esta publicacion es un lenguaje muy interesante que nos permite trabajar en diferentes plataformas mismas que son orientadas a objetos.... esperemos que cuando nos toque programar en este lenguaje de programacion nos ayuden con algo mas sobre el tema, con ejemplos de codificacion, ejercicios para saber como se utiliza y su sintaxis..... por lo demas un tema muy interesante...... que nos viene ya en camino espero que nos va de la mejor manera..... cuando no s toque aprender ................ compañeros por favor si pueden publicar como codificar o algo relacionado a este lenguaje de programacion...
ResponderEliminar