JAVA




Java es un lenguaje de programación de propósito general, concurrente, orientado a objetos que fue diseñado específicamente para tener tan pocas dependencias de implementación como fuera posible.

Su intención es permitir que los desarrolladores de aplicaciones escriban el programa una vez y lo ejecuten en cualquier dispositivo , lo que quiere decir que el código que es ejecutado en una plataforma no tiene que ser recopilado para correr en otra.

 Java es, a partir de 2012, uno de los lenguajes de programación más populares en uso, particularmente para aplicaciones de cliente-servidor de web, con unos 10 millones de usuarios reportados.

El lenguaje de programación Java fue originalmente desarrollado por James Gosling de Sun Microsystems (la cual fue adquirida por la compañía Oracle) y publicado en 1995 como un componente fundamental de la plataforma Java de Sun Microsystems.

 Su sintaxis deriva en gran medida de C y C++, pero tiene menos utilidades de bajo nivel que cualquiera de ellos. Las aplicaciones de Java son generalmente compiladas a bytecode (clase Java) que puede ejecutarse en cualquier máquina virtual Java (JVM) sin importar la arquitectura de la computadora subyacente.

La compañía Sun desarrolló la implementación de referencia original para los compiladores de Java, máquinas virtuales, y librerías de clases en 1991 y las publicó por primera vez en 1995.

 A partir de mayo de 2007, en cumplimiento con las especificaciones el Proceso de la Comunidad Java, Sun volvió a licenciar la mayoría de sus tecnologías de Java bajo la Licencia Pública General de GNU.

Otros también han desarrollado implementaciones alternas a estas tecnologías de Sun, tales como el Compilador y el GNU Classpath.




VENTAJAS

* El JDK es una herramienta libre de licencias (sin costo), creada por Sun.- Está respaldado por un gran número de proveedores.

Existe soporte dado por Sun.

Debido a que existen diferentes productos de Java, hay más de un proveedor de servicios.

Sun saca al mercado cada 6 meses una nueva versión del JDK.

* Es independiente de la plataforma de desarrollo.

* Existen dentro de su librería clases gráficas como awt y swing, las cuales permiten crear objetos gráficos comunes altamente configurables y con una arquitectura independiente de la plataforma.

Java permite a los desarrolladores aprovechar la flexibilidad de la Programación Orientada a Objetos en el diseño de sus aplicaciones.

 El conocimiento sobre tecnología Java está en alto crecimiento en el mercado.

Se puede acceder a bases de datos fácilmente con JDBC, independientemente de la plataforma utilizada.o El manejo de las bases de datos es uniforme, es decir transparente y simple.

* Existen las herramientas Crystal Reports o herramientas libres como iText que los genera en formato pdf.o La API que utilizan estas herramientas en Java, es la más recomendable para generar reportes en Web.

* Simple. Elimina la complejidad de los lenguajes como "C" y da paso al contexto de los lenguajes modernos orientados a objetos. Orientado a Objetos. La filosofía de programación orientada a objetos es diferente a la programación convencional.

* Familiar. Como la mayoría de los programadores están acostumbrados a programar en C o en C++, el sintaxis de Java es muy similar al de estos.

* Robusto. El sistema de Java maneja la memoria de la computadora por ti. No te tienes que preocupar por apuntadores, memoria que no se esté utilizando, etc. Java realiza todo esto sin necesidad de que uno se lo indique.

* Seguro. El sistema de Java tiene ciertas políticas que evitan se puedan codificar virus con este lenguaje. Existen muchas restricciones, especialmente para los applets, que limitan lo que se puede y no puede hacer con los recursos críticos de una computadora.

* Portable. Como el código compilado de Java (conocido como byte code) es interpretado, un programa compilado de Java puede ser utilizado por cualquier computadora que tenga implementado el interprete de Java.

Independiente a la arquitectura. Al compilar un programa en Java, el código resultante un tipo de código binario conocido como byte code. Este código es interpretado por diferentes computadoras de igual manera, solamente hay que implementar un intérprete para cada plataforma. De esa manera Java logra ser un lenguaje que no depende de una arquitectura computacional definida.

Multipropiedad. Un lenguaje que soporta múltiples threads es un lenguaje que puede ejecutar diferentes líneas de código al mismo tiempo.

* Interpretado. Java corre en máquina virtual, por lo tanto es interpretado.

* Dinámico. Java no requiere que compiles todas las clases de un programa para que este funcione. Si realizas una modificación a una clase Java se encarga de realizar un Dynamic Bynding o un Dynamic Loading para encontrar las clases.



DESVENTAJAS


* Hay diferentes tipos de soporte técnico para la misma herramienta, por lo que el análisis de la mejor opción se dificulta

* Para manejo a bajnivel deben usarse métodos nativos, lo que limita la portabilidad.

* El diseño de interfaces gráficas con awt y swing no es simple.o Existen herramientas como el JBuilder que permiten generar interfaces gráficas de manera sencilla, pero tienen un costo adicional.

* Puede ser que no haya JDBC para bases de datos poco comerciales.

* Algunas herramientas tienen un costo adicional



Principales Características de JAVA.

Java es un lenguaje de programación de propósito general orientado a objetos desarrollado por Sun Microsystems. 

También se puede decir que Java es una tecnología que no sólo se reduce al lenguaje sino que además provee de una máquina virtual Java que permite ejecutar código compilado Java, sea cual sea la plataforma que exista por debajo; plataforma tanto hardware, como software (el sistema operativo que soporte ese hardware).

 El apoyo a esta tecnología viene dado por la gran cantidad de fabricantes que apoyan esta especificación de máquina virtual.

Aprender el lenguaje de programación Java requiere tiempo y esfuerzo, pero en este curso trataremos de sentar las bases para el conocimiento general del lenguaje. El lenguaje se inspira en otros lenguajes:
  • sentencias comunes de C y C++ (sintaxis parecida a dichos lenguajes)
  • concurrencia parecida a la de Mesa (un lenguaje de investigación de Xerox)
  • interrupciones parecidas a las de Modula-3
  • tratamiento de enlace dinámico de código nuevo parecido al de Lisp
  • definiciones de interfaces parecidas a las de Objective C
  • gestión de almacenamiento automático parecida a la de Lisp

Características.

Sun describe al lenguaje Java de la siguiente manera:

  • Simple
  • Orientado a Objetos
  • Tipado estáticamente
  • Distribuido
  • Interpretado
  • Robusto
  • Seguro
  • de Arquitectura Neutral
  • Multihilo
  • con Recolector de basura (Garbage Collector)
  • Portable
  • de Alto Rendimiento: sobre todo con la aparición de hardware especializado y mejor software
  • Dinámico
Sun admite que lo dicho anteriormente son un montón de halagos por su parte, pero el hecho es que todas esas características pueden servir para describir el lenguaje. Todas ellas son importantes, sin embargo cabe destacar tres, que son las que han proporcionado tanto interés por el lenguaje: la portabilidad, el hecho de que sea de arquitectura neutral y su simplicidad. Java ofrece toda la funcionalidad de los lenguajes potentes, pero sin las características menos usadas y más confusas de éstos.

Java elimina muchas de las características de otros lenguajes como C++, para mantener reducidas especificaciones del lenguaje y añadir características muy útiles como el recolector de basura. No es necesario preocuparse de liberar memoria, el recolector se encarga de eliminar la memoria asignada. Gracias al recolector, sólo te tienes que preocupar de crear los objetos relevantes de tu sistema ya que él se encarga de destruirlos en caso de no ser reutilizados.

Java reduce en un 50% los errores más comunes de programación con lenguajes como C y C++. Entre las características más "indeseables" de C++ que se han evitado en el diseño de Java destacan: ficheros de cabecera, aritmética de punteros, sobrecarga de operadores, estructuras, uniones, conversión implícita de tipos, clases base virtuales, pre-procesador, etc.

Comentemos algunas de las características más interesantes:

Java es interpretado.

Estrictamente hablando, Java es interpretado, aunque en realidad Java es tanto interpretado como compilado. De hecho, sólo cerca del 20% del código Java es interpretado por la JVM (Java Virtual Machine), pero es un 20% muy importante. Tanto la seguridad de Java como su habilidad para ser ejecutado en múltiples plataformas se deben a que los pasos finales de la compilación se manejan localmente.

Existen ciertos entornos que para mejorar el rendimiento usan un pequeño compilador para la última fase de compilación, de forma que una vez que se tenga el bytecode, en vez de interpretarlo se compila generando código nativo para esa plataforma y se ejecuta, pero esta compilación se realiza cada vez que se quiera ejecutar el programa. 

El único código realmente independiente es el bytecode. Este tipo de compiladores se conocen como 'Just In Time' o JIT. Sin embargo, el bytecode no se completa hasta que se junta con un entorno de ejecución, que en este caso será la máquina virtual Java de la plataforma en la que estemos. Un browser puede proveer dicha plataforma desde el punto de vista del sistema operativo.

Inconvenientes.

El browser tiene que interpretar los ficheros de clases antes de que se ejecuten. Utilizando un lenguaje de programación tradicional como puede ser el C++, el ordenador puede ejecutar directamente el código generado. Sin embargo, debido a la interpretación que el browser tiene que hacer de los ficheros, los programas escritos en Java tienden a ejecutarse bastante más lentos que con otros lenguajes de programación (p.e. C++).

¿Por qué se considera un rasgo positivo el hecho de combinar la compilación y la interpretación?
  • Facilita la seguridad y la estabilidad.
  • Reduce los problemas de versiones.
El hecho de que la última fase de la compilación se lleve a cabo por un dispositivo de una determinada plataforma, releva al programador de la responsabilidad del mantenimiento de varios fuentes en varias plataformas. La interpretación también admite que los datos se incorporen en tiempo de ejecución, de ahí el comportamiento dinámico que también caracteriza a Java.

La máquina virtual Java.

Para establecer Java como parte integral de la red, el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutará. Cualquier máquina que tenga el sistema de ejecución (runtime) puede ejecutar ese código objeto, sin importar en modo alguno la máquina en que ha sido generado.

El código fuente Java se "compila" a un código de bytes de alto nivel independiente de la máquina. Este código (bytecode) está diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema runtime, que sí es dependiente de la máquina. Por lo tanto, lo que verdaderamente es dependiente del sistema es la Máquina Virtual Java (JVM) y las librerías fundamentales, que también nos permitirían acceder directamente al hardware de la máquina.

 El compilador Java genera bytecode que serán ejecutables dondequiera que exista una JVM.

Orientación a objetos.

Java implementa la tecnología básica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. 

Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las tres características propias del paradigma de la orientación a objetos: encapsulación, enlace dinámico y polimorfismo.

 Los modelos de objetos son llamados, como en C++, clases y sus copias, instancias. Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria.

Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolución dinámica de métodos. Esta característica deriva del lenguaje ObjectiveC.

 En C++ se suele trabajar con librerías dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las funciones que se encuentran en su interior. 

Java resuelve este inconveniente mediante una interfaz específica llamada RTTI  que define la interacción entre objetos excluyendo variables de instancias o implementación de métodos.

 Las clases en Java tienen una representación en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinámicamente la clase con el resultado de la búsqueda.

En Java casi todo son objetos. La mayoría de los lenguajes orientados a objetos permiten la herencia múltiple, lo que puede llevar a confusiones y/o complicaciones innecesarias. Java no permite herencia múltiple, sólo soporta "Herencia simple" en una estructura cósmica (todas las clases Java derivan jerárquicamente de la clase "Object").

 La herencia simple significa que en cada momento cada clase sólo hereda de otra clase. Este tipo de herencia evita problemas del tipo de herencias múltiples contradictorias o exclusivas entre sí.

Java también permite la creación de clases totalmente abstractas, a las que llama interfaces con características similares a los interfaces IDL de CORBA. Las interfaces permiten definir métodos que
pueden compartir con varias clases, sin tener en cuenta cómo las otras manejan los métodos.


Seguridad en JAVA.

El código Java pasa muchos tests antes de ejecutarse en una máquina. El código se pasa a través de un verificador de bytecodes que comprueba el formato de los fragmentos de código y aplica un probador de teoremas para detectar fragmentos de código ilegal -código que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-.

Si los bytecode pasan la verificación sin generar ningún mensaje de error, entonces sabemos que:
  • El código no produce desbordamiento de operandos en la pila
  • El tipo de los parámetres de todos los códigos de operación son conocidos y correctos
  • No ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros en puntero
  • El acceso a los campos de un objeto se sabe que es legal: public, private, protected
  • No hay ningún intento de violar las reglas de acceso y seguridad establecidas
  • Evitamos saltos a mitad de una instrucción, o direccionamientos de memoria de un objeto fuera de los límites del mismo.


El cargador de clases también ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. 

Esto limita cualquier aplicación del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior.

Definición de API.

API son las iniciales de Application Programar Interface. Pensemos lo siguiente. Por muy completo que sea un lenguaje en cuanto a estructuras, tipos de datos y operadores, para que sea funcional necesita hacer E/S .

 La E/S es dependiente del Sistema Operativo. La API es una capa de abstracción que se pone encima del S.O. para permitir hacer entradas y salidas de una manera estandarizada. Se trata de una especificación de una librería software, detallando las llamadas a funciones, los argumentos, y los resultados que obtienes al utilizarlas. 

Una API sólo existe en papel y no es más que diseño. De hecho, para usar una API necesitas una librería que exista y que implemente esa API.

Clasificación de las APIs

Las APIs están clasificadas como API Core (Núcleo) o como Standard Extensión (Extensiones estándar).

 Una API Core es aquélla que viene incluida en el sistema JDK, es parte de la implementación estándar de Sun y cualquier sistema Java tiene que ser capaz de soportarlas. 

Una extensión estándar es una librería que los sistemas Java no tienen por qué soportar, pero de hacerlo, lo tiene que hacer siguiendo exactamente la forma estándar.
  
 Estas tres distribuciones son:

aJ2SE o simplemente Java SE: Java 2 Standard Edition o Java Standard Edition. Orientado al desarrollo de aplicaciones cliente / servidor. No incluye soporte a tecnologías para internet. Es la base para las otras distribuciones Java y es la plataforma que utilizaremos nosotros en este curso por ser la más utilizada.

b) J2EE: Java 2 Enterprise Edition. Orientado a empresas y a la integración entre sistemas. Incluye soporte a tecnologías para internet. Su base es J2SE.

c) J2ME: Java 2 Micro Edition. Orientado a pequeños dispositivos móviles (teléfonos, tabletas, etc.).





*    JDK 1.0 (23 de enero de 1996) — Primer lanzamiento: comunicado de prensa

*      JDK 1.1 (19 de febrero de 1997) — Principales adiciones incluidas: comunicado de prensa

*   una reestructuración intensiva del modelo de eventos AWT (Abstract Windowing Toolkit)

*    clases internas (inner classes)

*       JavaBeans

*        JDBC (Java Database Connectivity), para la integración de bases de datos

*         RMI (Remote Method Invocation)

*    J2SE 1.2 (8 de diciembre de 1998) — Nombre clave Playground. Esta y las siguientes versiones fueron recogidas bajo la denominación Java 2 y el nombre "J2SE" (Java 2 Platform, Standard Edition), reemplazó a JDK para distinguir la plataforma base de J2EE (Java 2 Platform, Enterprise Edition) y J2ME (Java 2 Platform, Micro Edition). 

Otras mejoras añadidas incluían: comunicado de prensa

*      la palabra reservada (keyword) strictfp

*       reflexión en la programación

*      la API gráfica ( Swing) fue integrada en las clases básicas

*      la máquina virtual (JVM) de Sun fue equipada con un compilador JIT (Just in Time) por primera vez

*        Java Plug-in

*      Java IDL, una implementación de IDL (Lenguaje de Descripción de Interfaz) para la interoperabilidad con CORBA

*       Colecciones (Collections)

*     J2SE 1.3 (8 de mayo de 2000) — Nombre clave Kestrel. Los cambios más notables fueron:comunicado de prensa lista completa de cambios

*    la inclusión de la máquina virtual de HotSpot JVM (la JVM de HotSpot fue lanzada inicialmente en abril de 1999, para la JVM de J2SE 1.2)

*    RMI fue cambiado para que se basara en CORBA

*     JavaSound

*  se incluyó el Java Naming and Directory Interface (JNDI) en el paquete de bibliotecas principales (anteriormente disponible como una extensión)

*   Java Platform Debugger Architecture (JPDA)

 * J2SE 1.4 (6 de febrero de 2002) — Nombre Clave Merlin. Este fue el primer lanzamiento de la plataforma Java desarrollado bajo el Proceso de la Comunidad Java como JSR 59. Los cambios más notables fueron: comunicado de prensalista completa de cambios

*        Palabra reservada assert (Especificado en JSR 41.)

 *       Expresiones regulares modeladas al estilo de las expresiones regulares Perl

*        Encadenación de excepciones Permite a una excepción encapsular la excepción de bajo nivel original.

*         non-blocking NIO (New Input/Output) (Especificado en JSR 51.)

*         Logging API (Specified in JSR 47.)

*         API I/O para la lectura y escritura de imágenes en formatos como JPEG o PNG

*         Parser XML integrado y procesador XSLT (JAXP) (Especificado en JSR 5 y JSR 63.)

*         Seguridad integrada y extensiones criptográficas (JCE, JSSEJAAS)

*       Java Web Start incluido (El primer lanzamiento ocurrió en marzo de 2001 para J2SE 1.3) (Especificado en JSR 56.)

*      J2SE 5.0 (30 de septiembre de 2004) — Nombre clave: Tiger. (Originalmente numerado 1.5, esta notación aún es usada internamente.) Desarrollado bajo JSR 176, Tiger añadió un número significativo de nuevas características comunicado de prensa

*        Plantillas (genéricos) — provee conversión de tipos (type safety) en tiempo de compilación para colecciones y elimina la necesidad de la mayoría de conversión de tipos (type casting). (Especificado por JSR 14.)

*       Metadatos — también llamados anotaciones, permite a estructuras del lenguaje como las clases o los métodos, ser etiquetados con datos adicionales, que puedan ser procesados posteriormente por utilidades de proceso de metadatos. (Especificado por JSR 175.)

*         Autoboxing/unboxing — Conversiones automáticas entre tipos primitivos (Como los int) y clases de envoltura primitivas (Como Integer). (Especificado por JSR 201.)

*        Enumeraciones — la palabra reservada enum crea una typesafe, lista ordenada de valores (como Dia.LUNESDia.MARTES, etc.). Anteriormente, esto solo podía ser llevado a cabo por constantes enteras o clases construidas manualmente (enum pattern). (Especificado por JSR 201.)

*        Varargs (número de argumentos variable) — El último parámetro de un método puede ser declarado con el nombre del tipo seguido por tres puntos (e.g. void drawtext(String... lines)). En la llamada al método, puede usarse cualquier número de parámetros de ese tipo, que serán almacenados en un array para pasarlos al método.

*         Bucle for mejorado — La sintaxis para el bucle for se ha extendido con una sintaxis especial para iterar sobre cada miembro de un array o sobre cualquier clase que implemente Iterable, como la clase estándar Collection, de la siguiente forma:
 void displayWidgets (Iterable<Widget> widgets) {
     for (Widget w : widgets) {
         w.display();
     }
 }
Este ejemplo itera sobre el objeto Iterable widgets, asignando, en orden, cada uno de los elementos a la variable w, y llamando al método display() de cada uno de ellos. (Especificado por JSR 201.)

*       Java SE 6 (11 de diciembre de 2006) — Nombre clave Mustang. Estuvo en desarrollo bajo la JSR 270. En esta versión, Sun cambió el nombre "J2SE" por Java SE y eliminó el ".0" del número de versión.. Está disponible en http://java.sun.com/javase/6/

Los cambios más importantes introducidos en esta versión son:

*         Incluye un nuevo marco de trabajo y APIs que hacen posible la combinación de Java con lenguajes dinámicos como PHP, Python, Ruby y JavaScript.

*         Incluye el motor Rhino, de Mozilla, una implementación de Javascript en Java.

*        Incluye un cliente completo de Servicios Web y soporta las últimas especificaciones para Servicios Web, como JAX-WS 2.0, JAXB 2.0, STAX y JAXP.

*         Mejoras en la interfaz gráfica y en el rendimiento.

*        Java SE 7 — Nombre clave Dolphin. En el año 2006 aún se encontraba en las primeras etapas de planificación. Su lanzamiento fue en julio de 2011.

*         Soporte para XML dentro del propio lenguaje.

*         Un nuevo concepto de superpaquete.

*        Soporte para closures.

*         Introducción de anotaciones estándar para detectar fallos en el software.

*         No oficiales:

*        NIO2.

*         Java Module System.

*         Java Kernel.

*         Nueva API para el manejo de Días y Fechas, la cual reemplazara las antiguas clases Date y Calendar.

*         Posibilidad de operar con clases BigDecimal usando operandos.

·*        Java SE 8 — lanzada en marzo de 2014. Cabe destacar:

*         Incorpora de forma completa la librería JavaFX.

*         Diferentes mejoras en seguridad.

*         Diferentes mejoras en concurrencia.

*         Añade funcionalidad para programación funcional mediante expresiones Lambda.

*         Mejora la integración de JavaScript.

*         Nuevas API para manejo de fechas y tiempo (date - time).

En el 2005 se calcula en 4,5 millones el número de desarrolladores y 2.500 millones de dispositivos habilitados con tecnología Java.

*  Java SE 9: nueva versión que mejora la anterior (en difusión).

* Java SE 10: nueva versión que mejora la anterior (todavía sin uso comercial).








No hay comentarios:

Publicar un comentario