Site hosted by Angelfire.com: Build your free website today!

Cliente/Servidor en Web: la era de los objetos de Java

Introducción a Java

Internet es la aplicación por excelencia que acelerará el uso de objetos, a los que ha transformado en una oportunidad de mercado masivo que atrae a los mejores y más brillantes desarrolladores de todo el mundo. 
Donald DePalma
Forrester Research

Cambio de Paradigma

La aparición de Java obedece a un cambio de paradigma: de Cliente/Servidor (C/S) hacia NCA (Network Computer Architecture). La arquitectura cliente/servidor que ha caracterizado a las redes de los últimos años ha sufrido un cambio con la aparición de Java. Y aunque la arquitectura siga siendo Cliente/Servidor, el manejo del software ha cambiado y ha dado entrada a toda una nueva forma de aplicaciones.

Java es el primer paso hacia una Web de Objetos. Java no es suficiente por si mismo necesita tener una complementación con una infraestructura de objetos distribuidos, esto nos sirve para dar la entrada a un nuevo tema, más allá de Java. 
 

Cliente/Servidor en el Web, estilo Java

Java introduce un modelo completamente nuevo de interacción de cliente/servidor en el Web. Nos permite generar pequeños programas como componentes llamados applets, que pueden descargarse en un visualizador compatible con Java. Los applets nos permiten distribuir contenido ejecutable a lo largo del Web junto con los datos. 
 
  • Solicitud del applet. Un visualizador Web solicita un applet de Java cuando encuentra la etiqueta <APPLET>. Los atributos de la etiqueta incluyen el nombre del programa: el nombre de archivo de la clase. El programa suele residir en el mismo servidor en el que se origina la página, aunque no necesariamente. 
  • Recepción del applet. El visualizador inicia una sesión específica de TCP/IP para descargar cada applet que encuentra en una página Web. Trata al applet de Java como a cualquier otro objeto HTML (una imagen externa, por ejemplo). 
  • Carga y ejecución del applet. El visualizador carga el applet en la memoria  del cliente, y después la ejecuta. Por lo general, el applet creará cierto tipo de efecto visual dinámica dentro del área de la página que se le asigne. Los atributos de la etiqueta <APPLET> especifican el tamaño de la región que ocupará el applet. Esta es la parte de propiedad de una página que pertenece el applet. Esta pinta el contenido de la región, elige el color de fondo y las fuentes tipográfica y se ocupa de todos los eventos de teclado y ratón. La región del applet no se integra visualmente al resto de la página. En realidad es una modesta arquitectura de documentos compuestos. 
  • Descarte del applet. El visualizador borra el applet de la memoria cuando sale de la página Web. 


Como se deduce de este escenario, los applet de Java nos permiten crear páginas Web sumamente interactivas con contenido localmente ejecutable. Estos applets introducen un grado de flexibilidad sin paralelo. Permiten el cliente ejecutar partes minúsculas de código (los propios  applets), mientras que el servidor se convierte en una bodega de programas, datos y páginas HTML. 
 
 

Sistema de código movil de Java

Java cuenta con muchos mecanismos  que permiten una suerte de movimientos transparente; es como crear aplicaciones capaces de viajar po la red en forma segura. 
James Goslin, creador de Java. 
Aparte del intercambio de contenido tradicional - como texto, gráficos , audio y video - java permite que aplicaciones Web intercambien código movil. Java es un sistema de código movil. Otros ejemplos de sistemas de código móvil son Safe-Tel, Omniware de Colusa y Telescript de General Magic. Microsoft quizá provea también una versión exportable de su mecanismo de Visual Basic Script (VBScript).

Los sistemas de código movil constituyen la tecnología de base para los agentes móviles. Permiten distribuir código (y datos) entre clientes y servidores. Los objetos móviles - que Java llama applets - son piezas autónomas de código ejecutable. Como el software tradicional, el software tradicional, es dinámicamente cargado y ejecutado por programas independientes como visualizadores y servidores Web. 

Como mínimo, el código movil debe ser exportable y seguro. A medida que el uso de visualizadores Web se incremente, se descargarán y ejecutarán cientos de estos módulos de código ejecutable, de manera que es crucial controlar con toda precisión el acceso de los módulos a recursos importantes. He aquí una breve lista de los servicios que cabría esperar de un sistema de código móvil:

  • Un entorno seguro para la ejecución de código móvil. Usted debe controlar con precisión un entorno de applets, incluidos su acceso a memoria, llamadas del sistema y llamadas a funciones del servidor. 
  • Servicios independientes de plataformas. El sistema debe ofrecer administración de memoria, hilos, sincronización, comunicaciones y servicios de GUI entre plataformas, incluida una estructuras de documentos compuestos. Los applets deben ejecutarse sobre una amplia variedad de sistemas operativos y plataformas de hardware. 
  • Control de ciclo de vida. El sistema debe proporcionar un entorno en tiempo de ejecución para carga, descarga y ejecución del código. 
  • Distribución de applets. El sistema debe brindar facilidades para el desplazamiento de applets por la red. Debe garantizar que el código no será alterado cuando se halle en tránsito. Asimismo, debe certificar el applet y auntenticar las identidades tanto de clientes como de servidores. En otras palabras, usted debe hacer todo lo que esté a su alcance para impedir que el código móvil se convierta en conducto de virus. 
En esencia, el código móvil permite generar una aplicación una vez y después hacerla correr en cualquier parte. La red se convierte así en el vehículo de distribución de aplicaciones de software y permiten llegar instantáneamente a millones de clientes a través de redes globales. El código movil significa que usted no tiene que ocuparse de asuntos como la exportación y la instalación del usuario final. 
 

La magia de los códigos de bytes

Al igual que todos los sistemas de código móvil, Java ofrece tanto exportabilidad como seguridad. Un applet de Java es una unidad exportable de código móvil. Java logra la exportabilidad compilando applets en la máquina virtual de Java, La cual sigue el modelo de instrucciones de un procesador RISC virtual. Estas primitivas instrucciones se llaman códigos de bytes (bytecodes). Los códigos de bytes trasladan las instrucciones compiladas al nivel más bajo posible sin volverlas dependientes de la máquina. El lenguaje Java se afirma especificando el tamaño de sus tipos de datos básicos y el comportamiento de sus operadores aritméticos. Los programas son los mismos en cualquier plataforma; no existen incompatibilidades de tipos de datos entre arquitecturas de hardware y software. 

Los códigos de bytes hace de Java un lenguaje parcialmente compilado. La creación de códigos de bytes representa alrededor del 80% de la labor de compilación; el otro 20% es realizado por el tiempo de ejecución de Java. Así puede decirse que Java es un 80% de compilación y 20% de interpretación. Esta combinación parece ofrecer una excelente exportabilidad de código; la abstracción de códigos de bytes fue diseñada para el eficiente transporte de código entre múltiples plataformas. 

Por supuesto esto implica un costo. En este caso, se gana en exportabilidad lo que se pierde en desempeño; el código interpretado en Java es unas 15 veces más lento que el código compilado nativo. Java también soporta compiladores regulares, así como compiladores JIT (Just In Time), capaces de generar código que corra a velocidades nativas de C++.
 

El verificador de Java 

En la imagen aparecen los pasos a seguir para crear y ejecutar un applet de Java. En primer término, usted corre un applet a través de un compilador de máquina virtal de Java para crear los códigos de bytes y almacenarlos en un servidor. Sus códigos de bytes serán copiados en una máquina cliente destino cuando un visualizador solicite su applet. Tan pronto como los códigos de bytes arriben a la máquina destino, correrán a través de un verificador de Java, sumamente suspicaz en cuanto al código que recibe. 

El verificador corre los códigos de bytes por un guante de pruebas. Analiza la presencia de cosas como punteros falsificados, violaciones de acceso, desajustes de tipos de parámetros y sobreflujos de pilas. En cierto sentido, el verificador actúa como un "portero"; asegura que el código que recibe de fuentes tanto locales como remotas sea seguro. No se permite la ejecución de ningún código que no apruebe los análisis del verificador. Si éste se muestra satisfecho, cede los códigos de bytes al cargados de clases. 

El cargador de clases suele trasmitir los códigos de bytes  a un intérprete. Este es el elemento de tiempo de ejecución que ejecuta las instrucciones de Java en la máquina destino. El intérprete puede proceder a la ejecución sin revisar nada, porque sabe que el código recibido ha sido purificado. Puede correr a toda velocidad sin demérito de la confiabilidad. 

Sin embargo, incluso "a toda velocidad" un intérprete es de un orden de magnitud más lento que el código compilado nativo. Así, los diseñadores de Java intentan ahora arreglar la situación con técnicas de compilador justo a tiempo JIT, lo que significa traducir un applet completo a código nativo antes de ejecutarlo. Eso puede incrementar un tanto la carga general durante el proceso de traducción, pero permite que el código resultante corra a casi velocidad nativa. 
 
 

Seguridad en Java

La importación de código por la red es potencialmetne una invitación abierta a todo tipo de problemas. Sin las verificaciones adecuadas, los applets de Java pueden convertirse en campo de cultivo de virus terribles. Java parte del supuesto de que no se puede confiar en nada, y procesde en consecuencia. Su entorno ofrece cinco mecanismos de defensa, o perímetros defensivos entrelazados: 1) el propio lenguaje Java, 2) el verificador, 3) el cargador de códigos de bytes, 4) las listas de control de acceso y 5) el visualizador de Java. He aquí una veloz descripción de los perímetros defensivos:
 
  1. Perímetro defensivo del Lenguaje Java: Una de las líneas básicas de defensa de Java es su asignación de memoria y modelo de referencia. Las decisiones de diagramación de memoria no son tomadas por el compilador del lenguaje, como ocurre en C y C++. En cambio, se les difiere a tiempo de ejecución. Además, Java no soporta "apuntadores" o "punteros" en el sentido tradicional de C y C++; es decir, celdas de memoria que contienen las direcciones de otras celdas de memoria. Por el contrario, el código compilado de Java remite a la memoria a través de "nombres" simbólicos que se convierten en direcciones de memoria reales en tiempo de ejecución por medio del intérprete de Java. Juntos, estos dos mecanismos de acoplamiento posterior impiden que los piratas informáticos puedan irrumpir en la diagramación de memoria física de una clase analizando su declaración. La asignación de memoria y modelo de referencia de Java les resultan por completo oscuros. Así carecen de medios para llegar demasiado lejos y falsificar apuntadores en memoria. 
  2. Perímetro de defensa del verificador: Como se explicó en la sección anterior, fragmentos importados de código de Java son sometidos a una batería de revisiones por el verifiador antes de que se les permita correr en la plataforma de destino. El verificador protege el entorno de tiempo de ejecución de Java contra una amplia variedad de amenazas externas, como compiladores hostiles, manipuladores de código y códigos de bytes falsos. 
  3. Perímetro de defensa del cargador de clases. El cargador descompone el conjunto de clases de Java en espacios para nombres independientes. Una clase sólo puede acceder a objetos que se encuentren dentro de su espacio para nombres. Java crea un espacio para nombres para clases procedentes del sistema de archivos locales, y un espacio para nombres distinto para cada fuente de la red. Cuando una clase se importa a través de la red, se le coloca en el espacio para nombres privado asociado con su origen. Cuando una clase remite a otra clase, Java busca antes el espacio para nombres del sistema local (clases integradas), y después el espacio para nombres de la clase de referencia. Java resuelve todos los símbolos en tiempo de carga. Cada clase referenciada por un applet es cargada en el visualizador, y todas las referencias simbólicas y relaciones de herencia de clases se resuelven en este periodo. 
  4. Perímetro de defensa de las listas de control de acceso. Java usa listas de control de acceso para brindar niveles adicionales de seguridad sobre su ya protegida base de lenguaje y tiempo de ejecución. Por ejemplo, los elementos primitivos de acceso a archivos implementan listas de control de acceso. Eso permite controlar acceso de lectura y escritura a archivos por parte de código importado (o código invocado por código importado). Las opciones por omisión de estas listas de control de acceso son muy restrictivas. Si una pieza de código importado intenta acceder a un archivo para el cual no se le ha autorizado acceso, aparece de inmediato un cuadro de diáologo para que el usuario decida si procede este acceso específico. 
  5. Perímetro de defensa del visualizador de Java. Los visualizadores permiten establecer el modo de seguridad pro medio de un recuadro de diálogo de propiedades. El nivel de seguridad más riguroso es ninguno, lo que significa que los applets no pueden acceder a la red. El modo anfitrión permite que estos applets accedan a datos sólo en el servidor sede en el que fueron originados. El modo firewall permite que applets fuera del muro accedan únicamente a recursos también fuera del muro. Finalmente, el modo irrestricto permite que los applets se conecten con cualquier anfitrión en internet. 

El Lenguaje Java

Java viene a ser como C más-más-menos-menos
Bill Joy, cofundador
Sun Microsystems. 
Sun describe el lenguaje Java como "simple, orientado a objetos, distribuido, interpretado, robusto, seguro, neutral en cuanto a arquitecturas, exportable, multihilos y dinámico". 

A diferencia del C++, Java sólo soporta un solo modelo de herencia para implmentaciones de clases de objetos. Sin embargo, soporta herencia múltiple al nivel de interfaces. Una interfaz de Java es muy semejante a un IDL de CORBA; especifica los contratos de interfaces de una clase sin inmiscuirse en la implementación. Una clase de Java puede implementar una o más interfaces, así como añadir sus propias funciones. Sin embargo, puesto que Java carece de herencia de implementación múltiple, se debe reimplementar la funcionalidad de la interfaz en cada clase que implemente esta interfaz. 

Java aborda el probelma de colisiones de nombre con C++ introduciendo un concepto de espacio para nombres llamado paquetes o packages. Un paquete, como los modulos de IDL de CORBA, reúne clases afines en paquetes nombrados. 

A diferencia de c++, Java ofrece recolección automática de basura. Usted no tiene que ocuparse de la destrucción de los objetos por medio de destructores. Esto quiere decir que se pueden crear instancias de nuevos objetos sin temor a fugas de memoria. Las características multihilos de Java también son muy útiles; facilitan enormemente la provisión de código exportable asegurado con hilos. Java integra asimismo manejo de excepciones; la documentación de un método debe indicar las exepciones que tolera. En general, Java es una delicia para le programador de C++. Conserva las bondades del C++ y elimina todo lo desagradable. Lo único que lamentamos es la pérdida de herencia de implementaciones múltiples.
 

Applets: Componentes, estilo Java

Usted puede correr aplicaciones Java como programas independientes o como applets invocados por un navegador. Técnicamente, un applet es una pieza de código que hereda su comportamietno de la clase Applet de Java, que extiende con el programa. Un applet no es una aplicación completa. En realidad es un componente que corre en el entorn de un visualizador. En realidad el navegador sirve como estructura de apoyo para la ejecución del applet. 

El navegador ofrece a sus applets tres servicios útile. 

  • El navegador controla por completo el ciclo de vida de los applets. 
  • El navegador da a los applets la información de atributos de la etiqueta <APPLET>
  • Sirve como programa  o proceso principal dentro del cual se ejecuta el applet.

Administración del ciclo de vida de los applets

Un navegador  administra todas las fases del ciclo de vida de un applet. Recuérdese que el visualizador descarga primero el applet y después lo corre en su entorno. Tiene adema´s la gentileza de informarle al applet acerca de los eventos  más importantes ocurridos en su ciclo de vida. La interfaz Runnable de java define los métodos que un visualizador invoca en un applet durante su ciclo de vida. La mayoría de los applets de Java Implementan códigoq ue reacciona a estas invocaciones de métodos. 

El navegador invoca init después de cargar el applet en la memoria. Invoca start para indicarle al applet que haga todo lo necesario antes de correr. Paint instruye al applet para que exhiba su contenido. Stop y Destroy le indica anular todos sus hilos, detener la ejecución y liberar todos sus recursos. Esto ocurre cuando el navegador reemplaza la página Web que contiene al applet por otra página. En síntesis, el navegador es el dueño del applet.
 

La etiqueta <APPLET> de HTML 

El principal propósito en la vida de un applet de Java es aportar contenido vivo a las páginas Web exhibidas en un navegador con integración de Java. En contraste con ello, una aplicación Java puede correr por fuera del navegador. La etiqueta APPLET de HTML sirve para colocar un applet en una página Web y describir sus atributos y entorno. La etiqueta le indica al visualizador donde encontrar el applet para descargar. Java propociona un conjunto de métodos para su uso por un applet a fin de que obtenga información sobre su entorno, como los atributos de tiquetas incrustadas y sus valores. 

La etiqueta APPLET prové la inforamción esencial que conecta al visualizador Web con el applet incrustado. Permite asimismo que usted especifique la información de atributos clave; estos atributos le sirven para configurar un applet y controlara su comportamiento sin tener que generar una solalínea de código. Un applet bien diseñado aportará todos los atributos necesarios para que usted controle su comportamiento a través de HTML. 

La etiqueta APPLET contiene los atributos requeridos "CODE" (código), "WIDTH" (anchura), y "HEIGHT" (alto); contiene así mismo atributos opcionales como "CODEBASE" (báse de código) y "ALIGN" (alineación). El atributo "CODE" especifica el archivo que contiene el código de bytes del applet. Normalmetne este archivo se encuentra en el mismo directorio que la hoja HTML. Sin embargo, se puede emplear el atributo opcional "CODEBASE" para especificar una ubicación diferente. Los atributos "WIDTH" y "HEIGHT" especifican el área dentro de una página de HTML que pertenece al applet. Se puede usar el atributo opcional "ALIGN" para indicarle al navegador donde se desea que coloque el applet. 

Ejemplo:

<APPLET
    CODE=Hello.class
     CODEBASE="applets/miaplicacion"
     WIDTH=300
     HEIGHT=200
     ALIGN=left>
<PARAM NAME=Param1  VALUE="valor 1"
<PARAM NAME=Param2  VALUE="Valor 2"
</APPLET>
Los atributos PARAM son específicos de cada applet. Cada uno de ellos puede definir tantos parámetros como necesite. Usted debe proporcionar una etiqueta "PARAM" para cada par "nombre/valor. Un applet puede acceder a cualquier parámetro que se le pase con getParameter
 

Bibliotecas de Java

Las bibliotecas de Java exitenden el lenguaje; aportan un entorno exportable para la generación de aplicaciones de Java aseguradas con hilos. Se componen de seis paquetes de Java en los que se implementan cientos de clases. 

Para mayor información vea la hoja de productos de Java

He aquí una breve descripción de lo que ofrecen estos paquetes: 

  • Java.lang
  • http://java.sun.com/docs/books/tutorial/

Desventaja del Paradigma Cliente/Servidor Anterior

  • La administración y actualización de los clientes de la red es muy costosa.
  • Existe limitada interoperabilidad entre las subredes de la organización debido principalmente a incompatibilidades de hardware.
  • La incompatibilidad de las máquinas impide el acceso universal a las aplicaciones.
  • La actualización de la versión de sistema operativo es traumática entre más grande sea la red.

Java da respuesta a algunos problemas

Las respuestas que Java presenta al mundo son los siguientes: 
  • Su ambiente de programación es orientado a objetos, aunque es aún muy simple.
  • Su ciclo de desarrollo es mucho más rápido porque Java es interpretado. El ciclo compilar-linkar-probar-crash-depuración es obsoleto - ahora usted simplemente compila y corre.
  • Sus aplicaciones son portables a través de múltiples plataformas. Escriba sus aplicaciones una vez, y usted nunca necesitará portarlas - ellas correran sin modificación en sistemas operativos y arquitecturas de hardware múltiples.
  • Sus aplicaciones son robustas porque el sistema run-time de Java le maneja la memoria.
  • Sus aplicaciones gráficas interactivas tienen alto rendimiento porque múltiples hilos concurrentes de actividad en su aplicación son soportadas por la construcción multithreading dentro del lenguaje Java y la plataforma run-time.
  • Sus aplicaciones son adaptables a ambientes cambiantes porque usted puede dinámicamente bajar módulos de código de cualquier parte en la red.
  • Sus usuarios finales pueden confiar que sus aplicaciones son seguras, aún dado que están bajando código de todas partes en internet; el sistema run-time de Java tiene protección integrada en contra de virus e intromisiones.
La plataforma de Lenguaje de Programación Java da un lenguaje de programación orientado a objetos, simple, de alto rendimiento, interpretado y portable.
 

Objetivos de Diseño en Java

Los requerimientos de diseño de Java son determinados por la naturaleza de los ambientes de computación en los cuales el software debe ser entregado.

El crecimiento masivo de Internet y del World-Wide Web lleva a una forma completamente nueva de ver el desarrollo y la distribución de software. Para vivir en el mundo del comercio y distribución electrónicos, Java debe habilitar el desarrollo de aplicaciones altamente robustas, seguras y de alto rendimiento en plataformas múltiples y redes distribuidas, hetereogéneas.

La operación en plataformas múltiples en redes hetereogéneas invalida los esquemas tradicionales de distribución binaria, release, actualización, patch, etc. Para sobrevivir en esta jungla, Java debe ser neutral en arquitectura, portable y dinámicamente adaptable.

El sistema de Java que emergió para lograr estas necesidades es simple, de forma que pueda ser fácilmente programado por la mayoría de los desarrolladores; es familiar, de manera que los actuales desarrolladores puedan aprender Java fácilmente; es orientado a objetos, para tomar ventaja de las metodologías modernas de desarrollo de software y para tener cabida dentro de las aplicaciones Cliente/Servidor; tiene multihilamiento (multithreaded), para lograr alto rendimiento en aplicaciones que necesitan hacer actividades múltiples concurrentes, tales como multimedia; y es interpretado, para máxima portabilidad y capacidades dinámicas.

Vamos ahora a examinar en más detalle las palabras clave de lo anterior:

1.2.1 Simple, Orientado a Objectos y Familiar
1.2.2 Robusto y Seguro
1.2.3 Neutral en Arquitectura y Portable
1.2.4 Alto Rendimiento
1.2.5 Interpretado, usa multihilamiento y es Dinámico

1.2.1 Simple, Orientado a Objectos y Familiar

La características primarias de Java incluyen un lenguaje simple que puede ser programado sin entrenamiento de programador extensivo mientras que está siendo puesto a tono de la prácticas de software actuales. Los conceptos fundamentales de Java son captados rápidamente, los programadores pueden ser productivos desde el mismo principio.

Java es diseñado para ser orientado a objetos desde sus bases. La tecnología de objetos ha encontrado finalmente su entrada en la corriente principal de la programación luego de un período de gestación de treinta años. Las necesidades de sistemas basados en Cliente/Servidor coinciden con las prácticas de paso de mensajes y encapsulamiento del software orientado a objetos. Para funcionar dentro de ambientes basados en red cada vez más complejos, los sistemas de programación debe adoptar conceptos orientados a objetos. Java da una plataforma de desarrollo basada en objetos limpia y eficiente.

Los programadores que usan Java pueden accesar la librería existentes de objetos probados que dan funcionalidad yendo desde los tipos de datos básicos a través de I/O y las interfaces de red hasta cajas de herramientas de interfaz de usuario gráfico. Estas librerías pueden ser extendidas para dar un nuevo comportamiento.

Aún dado que C++ fue rechazado como un lenguaje de implementación, es un lenguaje familiar pues mantiene su similaridad con el C++ tanto como es posible.  Las complejidades innecesarias del C++ se han retirado.

1.2.2 Robusto y Seguro

Java está diseñado para crear software altamente confiable. Hace chequeo muy amplio al tiempo de compilación, seguido por un segundo nivel de chequeo al momento de correr. Las características del lenguaje guían a los programadores hacia hábitos de programación confiables.

El modelo de manejo de memoria es extremadamente simple: los objetos son creados con un operador new. No hay variables tipo apuntador definidas por el programador, no hay aritmética de apuntadores y hay recolección automática de basura. Este modelo de manejo simple de memoria elimina todas las clases de errores de programación que agobian a los programadores de C  y C++. Usted puede desarrollar código en lenguaje Java con confianza de que el sistema encontrará muchos errores rápidamente y que los problemas principales no permanecerán dormidos hasta que su código de producción ha sido enviado al usuario.

Java está diseñado para operar en ambientes distribuidos, lo que significa que la seguridad es de importancia monumental. Con características de  seguridad diseñadas dentro del lenguaje y el sistema de Run-time, Java lle permite construir aplicaciones que no pueden ser invadidas desde afuera. En el ambiente de red, la aplicaciones escritas en Java son seguras con respecto a intrusión de código no autorizado intentando ver detrás de bambalinas y la creación de virus o invasión de sistemas de archivos.

1.2.3 Neutral en Arquitectura y Portable

Java está diseñado para soportar aplicaciones que serán entregadas en ambientes de red hetereogéneos. En tales ambientes, las aplicaciones deben ser capaces de ejecutarse en una variedad de arquitecturas de hardware. Dentro de esta variedad de plataformas de hardware, las aplicaciones deben ejecutarse encima de una variedad de sistemas operativos e interoperar con interfaces de lenguaje de programación múltiples. Para acomodarse a la diversidad de ambientes operativos, el compilador Java genera bytecodes- un formato intermedio neutral en arquitectura diseñado para transportar código eficientemente a plataformas de hardware y software múltiples. La naturaleza interpretada de Java resuelve el problema de distribución binaria y el problema de versión; el mismo bytecodes de Lenguaje Java correrá en cualquier plataforma.

La neutralidad de Arquitectura es sólo una parte de un sistema realmente portable. Java va más allá en portabilidad siendo estricto en su definición de lenguaje básico. Java coloca un estaca en la tierra y especifica los tamaños de sus tipos de datos básicos y el comportamiento de sus operadores aritméticos. Sus programas son los mismos en cualquier plataforma - no hay incompatibilidades de datos a través de las arquitecturas de hardware y software.

La neutralidad de arquitectura y la plataforma de lenguaje portable de Java es conocido como la Máquina Virtual de Java. Es la especificación de una máquina abstracta para la cual los compiladores de lenguaje Java pueden generar código. Las implementaciones específicas de la Máquina Virtual de Java para plataformas de hardware y software específicos entonces logran la realización completa de máquina virtual. La Máquina Virtual de Java está basada primariamente en la definición del estándar de la industria de especificación de interfaz POSIX de un interfaz de sistema portable. La implementación de la Máquina Virtual de Java en nuevas arquitecturas es una tarea relativamente recta siempre que la plataforma objeto cumpla con los requerimientos básicos tales como soporte de multithreading.

1.2.4 Alto Rendimiento

El rendimiento es siempre una consideración. Java logra mayor rendimiento adoptando un esquema por el cual el interpretador puede correr con velocidad total sin necesitar chequear el ambiente de run-time. El recolector de basura automático corre como un hilo en background con baja prioridad, asegurando una alta probabilidad de que la memoria esté disponible cuando se requiera, llevando a un mejor rendimiento. Las aplicaciones que requieren grandes cantidades de poder computacional pueden ser diseñadas de forma que las secciones de cálculos intensivos puedan ser reescritas en código de máquina nativo si lo requiere y con la interfaz correspondiente a la plataforma de Java. En general, los usuarios perciben que las aplicaciones interactivas respondan rápidamente aún dado que son interpretadas.

1.2.5 Interpretado, Con multihilamiento y Dinámico

El interpretador de Java puede ejecutar bytecodes de Java directamente en cualquier máquina para la cual el interpretador y el sistema run-time haya sido transportado. En una plataforma interpretada tal como el sistema Java, la fase de linkado de un programa es simple, incremental, y de peso liviano. Usted se beneficia de desarrollo, prototipos, experimentación, y desarrollo rápido mucho más rápido en contra de los ciclos de compilación, linkado y prueba de peso pesado.

Las aplicaciones modernas basadas en red, tales como el HotJava World-Wide Web, típicamente necesitan hacer varias cosas al mismo tiempo. Un usuario trabajando con HotJava puede correr varias animaciones concurrentemente mientras que hace download de una imagen y está haciendo scroll en la página. La capacidad de multithreading de Java da los medios para construir aplicaciones con muchos hilos concurrentes de actividad. Multithreading por eso resulta en un alto mayor de interactividad para el usuario final.

Java soporta multithreading a nivel de lenguaje con la adición de primitivas de sincronización sofisticadas: la librería de lenguaje da la clase Thread, y el sistema de run-time da primitivas de monitor y condition lock. A nivel de librería, más aún, las librerías de sistema de alto nivel de Java han sido escritas para ser seguras en cuanto a threads: la funcionalidad dada por las librerías está disponible sin conflictos para múltiples hilos de ejecución concurrentes.

Mientras que el compilador de Java es estricto en su chequeo estático al momento de compilación, el lenguaje y el sistema de run-time en sus etapas de linkaje. Las clases son linkadas sólo si se necesitan. Los nuevos módulos de código pueden ser linkados según demanda desde una variedad de fuentes, aún desde fuentes a través de una red. En el caso del browser HotJava y aplicaciones similares, el código ejecutable interactivo puede ser cargado desde cualquier lugar, que habilita la actualización transparente de aplicaciones. El resultado serán servicios en línea que evolucionesn constantemente; ellos pueden permanener innovadores y frescos, atender más clientes e incitar el crecimiento del comercio electrónico en la Internet.


1.3 LA PLATAFORMA JAVA - UNA NUEVA APROXIMACION A COMPUTACION DISTRIBUIDA

Las características discutidas, tomadas individualmente,anteriormente pueden ser encontradas en una variedad de plataformas de desarrollo de software. Lo que es completamente nuevo es la manera en la cual Java y su sistema run-time las han combinado para producir un sistema de programación flexible y poderoso.

Desarrollar sus aplicaciones usando Java tendrá  un software que es portable a través de múltiples arquitecturas de máquinas, sistemas operativos, e interfaces gráficas de usuarios, que es seguro y de alto rendimiento.

Webliografía

ORFALI, Robert; HARKEY, Dan. EDWARDS, Jeri. 

Java Language Environment