Java es un conjunto de software y especificaciones que proporciona una plataforma de software para desarrollar aplicaciones e implementarlas en un entorno informático multiplataforma . Java se utiliza en una amplia variedad de plataformas informáticas , desde dispositivos integrados y teléfonos móviles hasta servidores empresariales y supercomputadoras . Los subprogramas de Java , que son menos comunes que las aplicaciones Java independientes, se ejecutaban comúnmente en entornos seguros y aislados para proporcionar muchas características de las aplicaciones nativas al estar integradas en páginas HTML .
Escribir en el lenguaje de programación Java es la forma principal de producir código que se implementará como código de bytes en una máquina virtual Java (JVM); Los compiladores de código byte también están disponibles para otros lenguajes, incluidos Ada , JavaScript , Python y Ruby . Además, se han diseñado varios lenguajes para ejecutarse de forma nativa en la JVM, incluidos Clojure , Groovy y Scala . La sintaxis de Java se basa en gran medida en C y C++ , pero las características orientadas a objetos están modeladas a partir de Smalltalk y Objective-C . [10] Java evita ciertas construcciones de bajo nivel, como punteros , y tiene un modelo de memoria muy simple donde los objetos se asignan en el montón (mientras que algunas implementaciones, por ejemplo, todas actualmente soportadas por Oracle, pueden usar optimización de análisis de escape para asignar en la pila ). y todas las variables de tipos de objetos son referencias . La gestión de la memoria se gestiona mediante la recolección de basura automática integrada realizada por la JVM.
La última versión es Java 21 , una versión de soporte a largo plazo (LTS) lanzada en septiembre de 2023, mientras que también se admite Java 17 lanzado en septiembre de 2021, una de las pocas versiones de LTS más antiguas hasta Java 8 LTS. Como plataforma de código abierto, Java tiene muchos distribuidores, incluidos Amazon , IBM , Azul Systems y AdoptOpenJDK . Las distribuciones incluyen Amazon Corretto, Zulu, AdoptOpenJDK y Liberica. En cuanto a Oracle, distribuye Java 8 y también pone a disposición, por ejemplo, Java 11, ambas versiones actualmente compatibles con LTS. Oracle (y otros) "recomiendan encarecidamente que desinstale versiones anteriores de Java" que Java 8, [11] debido a riesgos graves debido a problemas de seguridad no resueltos. [12] [13] [14] Dado que Java 9 (así como las versiones 10, 12–16 y 18–20) ya no son compatibles, Oracle aconseja a sus usuarios realizar una "transición inmediata" a una versión compatible. Oracle lanzó la última actualización pública gratuita para uso comercial para el legado Java 8 LTS en enero de 2019 y continuará brindando soporte a Java 8 con actualizaciones públicas para uso personal de manera indefinida. El soporte extendido de Oracle para Java 6 finalizó en diciembre de 2018. [15]
La plataforma Java es un conjunto de programas que facilitan el desarrollo y ejecución de programas escritos en el lenguaje de programación Java . Una plataforma Java incluye un motor de ejecución (llamado máquina virtual ), un compilador y un conjunto de bibliotecas ; También puede haber servidores adicionales y bibliotecas alternativas que dependen de los requisitos. Se han implementado plataformas Java para una amplia variedad de hardware y sistemas operativos con el fin de permitir que los programas Java se ejecuten de manera idéntica en todos ellos.
La plataforma Java consta de varios programas, cada uno de los cuales proporciona una parte de sus capacidades generales. Por ejemplo, el compilador de Java , que convierte el código fuente de Java en código de bytes de Java (un lenguaje intermedio para JVM), se proporciona como parte del kit de desarrollo de Java (JDK). Java Runtime Environment (JRE), que complementa la JVM con un compilador justo a tiempo (JIT) , convierte el código de bytes intermedio en código de máquina nativo sobre la marcha. La plataforma Java también incluye un amplio conjunto de bibliotecas.
Los componentes esenciales de la plataforma son el compilador del lenguaje Java, las bibliotecas y el entorno de ejecución en el que se ejecuta el código de bytes intermedio de Java de acuerdo con las reglas establecidas en la especificación de la máquina virtual.
Las diferentes plataformas apuntan a diferentes clases de dispositivos y dominios de aplicaciones :
Java Platform, Standard Edition (Java SE) es una plataforma informática para el desarrollo e implementación de código portátil para entornos de escritorio y servidor . [16] Java SE se conocía anteriormente como plataforma Java 2, edición estándar (J2SE).
La plataforma utiliza el lenguaje de programación Java y forma parte de la familia de plataformas de software Java. Java SE define una variedad de API de propósito general , como las API de Java para la biblioteca de clases de Java , y también incluye la especificación del lenguaje Java y la especificación de la máquina virtual Java . [17] OpenJDK es la implementación de referencia oficial desde la versión 7. [18] [19] [20]El corazón de la plataforma Java es la "máquina virtual" que ejecuta programas de código de bytes Java . Este código de bytes es el mismo sin importar en qué hardware o sistema operativo se ejecute el programa. Sin embargo, las nuevas versiones, como Java 10 (y anteriores), han realizado pequeños cambios, lo que significa que el código de bytes en general solo es compatible con versiones posteriores . Hay un compilador JIT (Just In Time) dentro de la Máquina Virtual Java o JVM. El compilador JIT traduce el código de bytes de Java en instrucciones nativas del procesador en tiempo de ejecución y almacena en caché el código nativo en la memoria durante la ejecución.
El uso de bytecode como lenguaje intermedio permite que los programas Java se ejecuten en cualquier plataforma que tenga una máquina virtual disponible. El uso de un compilador JIT significa que las aplicaciones Java, después de un breve retraso durante la carga y una vez que se han "calentado" al ser compiladas en su totalidad o en su mayoría JIT, tienden a ejecutarse tan rápido como los programas nativos. [23] [24] [25] Desde la versión 1.2 de JRE, la implementación JVM de Sun ha incluido un compilador justo a tiempo en lugar de un intérprete.
Aunque los programas Java son multiplataforma o independientes de la plataforma, el código de las Máquinas Virtuales Java (JVM) que ejecutan estos programas no lo es. Cada plataforma operativa compatible tiene su propia JVM.
El Java Development Kit (JDK) es una distribución de tecnología Java de Oracle Corporation . Implementa la especificación del lenguaje Java (JLS) y la especificación de la máquina virtual Java (JVMS) y proporciona la edición estándar (SE) de la interfaz de programación de aplicaciones (API) de Java. Es un derivado del OpenJDK impulsado por la comunidad que administra Oracle. [26] Proporciona software para trabajar con aplicaciones Java. Ejemplos de software incluido son la máquina virtual Java, un compilador, herramientas de monitoreo del rendimiento, un depurador y otras utilidades que Oracle considera útiles para los programadores de Java.
Oracle ha lanzado la versión actual del software bajo la licencia de Términos y condiciones sin cargo de Oracle (NFTC). Binarios de lanzamiento de Oracle para la arquitectura x86-64 para sistemas operativos basados en Windows, macOS y Linux, y para la arquitectura aarch64 para macOS y Linux. Las versiones anteriores eran compatibles con el sistema operativo Oracle Solaris y la arquitectura SPARC .
La implementación principal de Oracle del JVMS se conoce como HotSpot (máquina virtual) .Java Runtime Environment (JRE) lanzado por Oracle es una distribución de software disponible gratuitamente que contiene una JVM independiente (HotSpot), la biblioteca estándar de Java ( Java Class Library ), una herramienta de configuración y, hasta su discontinuación en JDK 9, un plugin para el navegador. Es el entorno Java más común instalado en computadoras personales en formato portátil y de escritorio . Es más probable que los teléfonos móviles , incluidos los teléfonos básicos y los primeros teléfonos inteligentes que se envían con una JVM, incluyan una JVM destinada a ejecutar aplicaciones destinadas a la Micro Edición de la plataforma Java. Mientras tanto, la mayoría de los teléfonos inteligentes, tabletas y otras computadoras portátiles modernos que ejecutan aplicaciones Java probablemente lo hagan mediante el soporte del sistema operativo Android , que incluye una máquina virtual de código abierto incompatible con la especificación JVM. (En cambio, las herramientas de desarrollo de Android de Google toman programas Java como código de bytes Dalvik de entrada y salida , que es el formato de entrada nativo para la máquina virtual en dispositivos Android). La última versión de actualización de ruta crítica de JRE con un acuerdo BCL de Oracle [27] era 8u201 y la última versión de actualización del conjunto de parches con la misma licencia fue 8u202. [28] [29] La última implementación de Oracle JRE, independientemente de su esquema de licencia, fue 9.0.4. [30] Desde Java Platform SE 9, toda la plataforma también se agrupó en módulos . [31] La modularización de las implementaciones de Java SE permite a los desarrolladores agrupar sus aplicaciones junto con todos los módulos utilizados por ellas, en lugar de depender únicamente de la presencia de una implementación de Java SE adecuada en el dispositivo del usuario. [32] [33] [34] [35]
En la mayoría de los sistemas operativos (SO) modernos, se proporciona una gran cantidad de código reutilizable para simplificar el trabajo del programador. Este código generalmente se proporciona como un conjunto de bibliotecas cargables dinámicamente a las que las aplicaciones pueden llamar en tiempo de ejecución. Debido a que la plataforma Java no depende de ningún sistema operativo específico, las aplicaciones no pueden depender de ninguna de las bibliotecas del sistema operativo preexistentes. En cambio, la plataforma Java proporciona un conjunto completo de sus propias bibliotecas de clases estándar que contienen muchas de las mismas funciones reutilizables que se encuentran comúnmente en los sistemas operativos modernos. La mayor parte de la biblioteca del sistema también está escrita en Java. Por ejemplo, la biblioteca Swing pinta la interfaz de usuario y maneja los eventos por sí misma, eliminando muchas diferencias sutiles entre cómo las diferentes plataformas manejan los componentes.
Las bibliotecas de clases Java tienen tres propósitos dentro de la plataforma Java. En primer lugar, al igual que otras bibliotecas de código estándar, las bibliotecas de Java proporcionan al programador un conjunto bien conocido de funciones para realizar tareas comunes, como mantener listas de elementos o realizar análisis de cadenas complejas. En segundo lugar, las bibliotecas de clases proporcionan una interfaz abstracta para tareas que normalmente dependerían en gran medida del hardware y el sistema operativo. Tareas como el acceso a la red y el acceso a archivos a menudo están fuertemente entrelazadas con las implementaciones distintivas de cada plataforma. Las bibliotecas java.net
y java.io
implementan una capa de abstracción en el código nativo del sistema operativo y luego proporcionan una interfaz estándar para que las aplicaciones Java realicen esas tareas. Finalmente, cuando alguna plataforma subyacente no soporta todas las características que espera una aplicación Java, las bibliotecas de clases trabajan para manejar con gracia los componentes ausentes, ya sea mediante emulación para proporcionar un sustituto o al menos proporcionando una manera consistente de verificar la presencia. de una característica específica.
La palabra "Java", por sí sola, generalmente se refiere al lenguaje de programación Java que fue diseñado para usarse con la plataforma Java. Los lenguajes de programación suelen estar fuera del alcance de la frase "plataforma", aunque el lenguaje de programación Java figuraba como una parte central de la plataforma Java antes de Java 7. Por lo tanto, el lenguaje y el tiempo de ejecución se consideraban comúnmente una sola unidad. Sin embargo, con la especificación Java 7 se hizo un esfuerzo para tratar más claramente el lenguaje Java y la Máquina Virtual Java como entidades separadas, de modo que ya no se consideren una sola unidad. [36]
Terceros han producido muchos compiladores o intérpretes dirigidos a la JVM. Algunos de ellos son para lenguajes existentes, mientras que otros son para extensiones del lenguaje Java. Éstas incluyen:
El éxito de Java y su concepto de escribir una vez y ejecutar en cualquier lugar ha llevado a otros esfuerzos similares, en particular .NET Framework , que aparece desde 2002 y que incorpora muchos de los aspectos exitosos de Java. .NET se creó desde cero para admitir múltiples lenguajes de programación, mientras que la plataforma Java se creó inicialmente para admitir solo el lenguaje Java, aunque desde entonces se han creado muchos otros lenguajes para JVM. Al igual que Java, los lenguajes .NET se compilan en código de bytes y se ejecutan mediante Common Language Runtime (CLR), que tiene un propósito similar al JVM. Al igual que la JVM, CLR proporciona administración de memoria mediante recolección automática de basura y permite que el código de bytes .NET se ejecute en múltiples sistemas operativos.
.NET incluía un lenguaje similar a Java llamado primero J++ y luego Visual J# que era incompatible con la especificación Java. Se suspendió en 2007 y su soporte finalizó en 2015.
La especificación JVM ofrece mucha libertad a los implementadores con respecto a los detalles de implementación. Desde Java 1.3, JRE de Oracle contiene una JVM llamada HotSpot. Ha sido diseñado para ser una JVM de alto rendimiento.
Para acelerar la ejecución del código, HotSpot se basa en la compilación justo a tiempo. Para acelerar la asignación de objetos y la recolección de basura, HotSpot utiliza un montón generacional.
El montón de la máquina virtual Java es el área de memoria utilizada por la JVM para la asignación de memoria dinámica . [38]
En HotSpot el montón se divide en generaciones :
La generación permanente (o permgen ) se usaba para definiciones de clases y metadatos asociados antes de Java 8. La generación permanente no formaba parte del montón. [39] [40] La generación permanente se eliminó de Java 8. [41]
Originalmente no había una generación permanente y los objetos y clases se almacenaban juntos en la misma área. Pero como la descarga de clases ocurre mucho menos que la recolección de objetos, mover estructuras de clases a un área específica permitió mejoras significativas en el rendimiento. [39]
Java JRE está instalado en una gran cantidad de computadoras. Por lo tanto, los usuarios finales con una versión desactualizada de JRE son vulnerables a muchos ataques conocidos. Esto llevó a la creencia ampliamente compartida de que Java es inherentemente inseguro. [42] Desde Java 1.7, JRE de Oracle para Windows incluye funcionalidad de actualización automática.
Antes de la interrupción del complemento del navegador Java, cualquier página web podría haber ejecutado un subprograma de Java, que proporcionaba una superficie de ataque de fácil acceso para sitios web maliciosos. En 2013, Kaspersky Labs informó que el complemento Java era el método elegido por los delincuentes informáticos. Los exploits de Java se incluyen en muchos paquetes de exploits que los piratas informáticos implementan en sitios web pirateados. [43] Los subprogramas de Java se eliminaron en Java 11, lanzado el 25 de septiembre de 2018.
Java 17, una versión de soporte a largo plazo (LTS), viene con varias mejoras. Proporciona coincidencia de patrones para declaraciones de cambio y clases selladas .
Java 16 introduce clases de registro , coincidencia de patrones y clases selladas para capacidades mejoradas de modelado de datos.
Java 15 introdujo bloques de texto y clases selladas como características de vista previa, mejorando el manejo de cadenas y clases.
Java 14 trajo nuevas funciones, como clases de registros y coincidencia de patrones , por ejemplo, como funciones de vista previa.
Java 13 incluyó mejoras como bloques de texto y reimplementación de la API de socket heredada .
Java 12 introdujo expresiones de cambio y el nuevo recolector de basura Shenandoah .
Java 11, una versión LTS, introdujo el nuevo Cliente HTTP . También eliminó los módulos Java EE y CORBA.
Java 10 introdujo la inferencia de tipo de variable local (var), que permite a los desarrolladores declarar variables locales sin especificar su tipo.
Java 9 introdujo el Java Platform Module System (JPMS) para modularizar aplicaciones y JShell , un Java REPL interactivo.
Java 8 es una versión importante que introdujo expresiones Lambda y una nueva API de fecha y hora para una mejor productividad.
Java 7 introdujo try-with-resources , Switch on String y Diamond Operador . También incluyó un manejo de excepciones ampliado y una nueva biblioteca de E/S de archivos (NIO.2).
Java 6 introdujo compatibilidad con lenguajes de secuencias de comandos (JSR 223) y mejoras en los servicios web . También proporcionó a JDBC 4.0 soporte SQL XML.
Java 5 fue una versión importante que incluía genéricos , un bucle for mejorado , autoboxing/unboxing , importación estática , varargs , enumeraciones y anotaciones .
Java 4 introdujo expresiones regulares , encadenamiento de excepciones y un nuevo conjunto de API de E/S conocido como NIO (nueva entrada/salida). También incluyó una nueva API de registro .
Java 3 incluía la nueva JVM de Sun conocida como HotSpot . También introdujo Java Naming and Directory Interface (JNDI) y Java Platform Debugger Architecture (JPDA).
Java 2 introdujo el marco de colecciones , el mapa de memoria de cadenas de Java para constantes , un compilador Just In Time (JIT) y la API Swing para GUI .
Java 1.1 introdujo Inner Classes , Reflection , Java Beans y la API JDBC para el acceso a la base de datos.
Java 1.0 fue la primera versión del lenguaje de programación Java. Introdujo la programación orientada a objetos y el código de bytes, lo que hizo que Java fuera independiente de la plataforma.
La plataforma y el lenguaje Java comenzaron como un proyecto interno en Sun Microsystems en diciembre de 1990, proporcionando una alternativa a los lenguajes de programación C++/ C . El ingeniero Patrick Naughton se había sentido cada vez más frustrado con el estado de las herramientas e interfaces de programación de aplicaciones (API) C++ y C de Sun, así como con la forma en que la organización manejaba el proyecto NeWS . Naughton informó a Scott McNealy sobre su plan de dejar Sun y pasar a NeXT ; McNealy le pidió que fingiera ser Dios y le enviara un correo electrónico explicándole cómo arreglar la empresa. Naughton imaginó la creación de un pequeño equipo que pudiera trabajar de forma autónoma sin la burocracia que estaba paralizando otros proyectos de Sun. McNealy envió el mensaje a otras personas importantes de Sun y se inició el Proyecto Stealth . [44]
El Proyecto Stealth pronto pasó a llamarse Proyecto Verde , y James Gosling y Mike Sheridan se unieron a Naughton. Junto con otros ingenieros, comenzaron a trabajar en una pequeña oficina en Sand Hill Road en Menlo Park, California . Su objetivo era desarrollar nueva tecnología para programar aparatos inteligentes de próxima generación, que Sun esperaba que ofreciera nuevas e importantes oportunidades. [45]
El equipo originalmente consideró usar C++, pero lo rechazó por varias razones. Debido a que estaban desarrollando un sistema integrado con recursos limitados, decidieron que C++ necesitaba demasiada memoria y que su complejidad conducía a errores de desarrollador. La falta de recolección de basura del lenguaje significaba que los programadores tenían que administrar manualmente la memoria del sistema, una tarea desafiante y propensa a errores. Al equipo también le preocupaba la falta de funciones portátiles de seguridad, programación distribuida y subprocesamiento del lenguaje C++ . Finalmente, querían una plataforma que se pudiera portar fácilmente a todo tipo de dispositivos.
Bill Joy había imaginado un nuevo lenguaje que combinara Mesa y C. En un artículo llamado Further , propuso a Sun que sus ingenieros deberían producir un entorno orientado a objetos basado en C++. Inicialmente, Gosling intentó modificar y extender C++ (una propuesta de desarrollo al que se refirió como "C++ ++ -") pero pronto lo abandonó en favor de la creación de un nuevo lenguaje, al que llamó Oak , en honor al árbol que se encontraba justo afuera. su oficina. [46]
En el verano de 1992, el equipo pudo demostrar partes de la nueva plataforma, incluido el sistema operativo Green , el lenguaje Oak, las bibliotecas y el hardware. Su primera demostración, el 3 de septiembre de 1992, se centró en construir un dispositivo asistente digital personal (PDA) llamado Star7 [1] que tenía una interfaz gráfica y un agente inteligente llamado "Duke" para ayudar al usuario. En noviembre de ese año, el Proyecto Verde se escindió para convertirse en Firstperson , una subsidiaria de propiedad total de Sun Microsystems, y el equipo se mudó a Palo Alto, California . [47] El equipo de Firstperson tenía interés en construir dispositivos altamente interactivos, y cuando Time Warner emitió una solicitud de propuesta (RFP) para un decodificador , Firstperson cambió su objetivo y respondió con una propuesta para una plataforma de decodificador. . Sin embargo, la industria del cable consideró que su plataforma daba demasiado control al usuario, por lo que Firstperson perdió su oferta ante SGI . Tampoco se materializó un acuerdo adicional con The 3DO Company para un decodificador. Al no poder generar interés dentro de la industria de la televisión, la empresa volvió a formar parte de Sun.
En junio y julio de 1994, después de tres días de intercambio de ideas con John Gage (director científico de Sun), Gosling, Joy, Naughton, Wayne Rosing y Eric Schmidt , el equipo reorientó la plataforma para la World Wide Web . Sintieron que con la llegada de los navegadores web gráficos como Mosaic , Internet podría evolucionar hasta convertirse en el mismo medio altamente interactivo que habían imaginado para la televisión por cable. Como prototipo, Naughton escribió un pequeño navegador, WebRunner (llamado así por la película Blade Runner ), rebautizado como HotJava [45] en 1995.
Sun cambió el nombre del lenguaje Oak a Java después de que una búsqueda de marcas revelara que Oak Technology usaba el nombre Oak . [48] Sun fijó el precio de las licencias de Java por debajo del coste para ganar cuota de mercado. [49] Aunque Java 1.0a estuvo disponible para su descarga en 1994, el primer lanzamiento público de Java, Java 1.0a2 con el navegador HotJava, llegó el 23 de mayo de 1995, anunciado por Gage en la conferencia SunWorld . Acompañando el anuncio de Gage, Marc Andreessen , vicepresidente ejecutivo de Netscape Communications Corporation , anunció inesperadamente que los navegadores Netscape incluirían soporte para Java. El 9 de enero de 1996, Sun Microsystems formó el grupo JavaSoft para desarrollar la tecnología. [50]
Si bien los llamados subprogramas de Java para navegadores web ya no son el uso más popular de Java (por ejemplo, más utilizado en el lado del servidor) ni la forma más popular de ejecutar código en el lado del cliente (JavaScript se convirtió en el más popular), Todavía es posible ejecutar Java (u otros lenguajes JVM como Kotlin) en navegadores web, incluso después de que se haya eliminado el soporte JVM, utilizando, por ejemplo, TeaVM .
El 13 de noviembre de 2006, Sun Microsystems puso a disposición la mayor parte de su implementación de Java bajo la Licencia Pública General GNU (GPL). [51] [52]
El lenguaje Java ha sufrido varios cambios desde el lanzamiento de JDK ( Java Development Kit ) 1.0 el 23 de enero de 1996, así como numerosas adiciones de clases y paquetes a la biblioteca estándar . Desde J2SE 1.4, el Proceso de la comunidad Java (JCP) ha regido la evolución del lenguaje Java. El JCP utiliza solicitudes de especificación de Java (JSR) para proponer y especificar adiciones y cambios a la plataforma Java. La Especificación del lenguaje Java (JLS) especifica el lenguaje; Los cambios en JLS se gestionan según JSR 901. [53]
Sun lanzó JDK 1.1 el 19 de febrero de 1997. Las principales adiciones incluyeron una extensa reestructuración del modelo de eventos AWT , clases internas agregadas al lenguaje, JavaBeans y JDBC .
J2SE 1.2 (8 de diciembre de 1998) – Nombre en clave Playground . Esta y las versiones posteriores hasta J2SE 5.0 pasaron a llamarse Java 2 y el nombre de la versión "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, Microedición ). Las principales adiciones incluyeron reflexión , un marco de colecciones , Java IDL (una implementación de lenguaje de descripción de interfaz para la interoperabilidad CORBA ) y la integración de la API gráfica Swing en las clases principales. Se lanzó un complemento de Java y la JVM de Sun se equipó con un compilador JIT por primera vez.
J2SE 1.3 (8 de mayo de 2000) – Nombre en clave Kestrel . Los cambios notables incluyeron la combinación de HotSpot JVM (HotSpot JVM se lanzó por primera vez en abril de 1999 para J2SE 1.2 JVM), JavaSound, Java Naming and Directory Interface (JNDI) y Java Platform Debugger Architecture (JPDA).
J2SE 1.4 (6 de febrero de 2002) – Nombre clave Merlin . Esta se convirtió en la primera versión de la plataforma Java desarrollada bajo el Proceso de la comunidad Java como JSR 59. [54] Los cambios principales incluyeron expresiones regulares modeladas a partir de Perl , encadenamiento de excepciones , un analizador XML integrado y un procesador XSLT ( JAXP ) y Java Web Start .
J2SE 5.0 (30 de septiembre de 2004) – Nombre en clave Tiger . Originalmente tenía el número 1.5, que todavía se utiliza como número de versión interna. [55] Desarrollado bajo JSR 176, Tiger agregó varias características nuevas de lenguaje importantes, incluido el bucle for-each , genéricos , autoboxing y var-args . [56]
Java SE 6 (11 de diciembre de 2006) – Nombre en clave Mustang . Se incluye con un administrador de bases de datos y facilita el uso de lenguajes de secuencias de comandos con JVM (como JavaScript usando el motor Rhino de Mozilla ). A partir de esta versión, Sun reemplazó el nombre "J2SE" por Java SE y eliminó el ".0" del número de versión. [57] Otros cambios importantes incluyen soporte para anotaciones conectables ( JSR 269 ), muchas mejoras en la GUI , incluidas mejoras en la interfaz de usuario nativa para admitir la apariencia de Windows Vista , y mejoras en la arquitectura de depuración de la plataforma Java (JPDA) y la interfaz de herramientas JVM para mejor seguimiento y resolución de problemas.
Java SE 7 (28 de julio de 2011): nombre en clave Dolphin . Esta versión se desarrolló bajo JSR 336. [58] Agregó muchos pequeños cambios de lenguaje, incluidas cadenas en switch, prueba con recursos e inferencia de tipos para la creación de instancias genéricas. La JVM se amplió con soporte para lenguajes dinámicos, mientras que la biblioteca de clases se amplió, entre otros, con un marco de unión/bifurcación, [59] una nueva biblioteca de E/S de archivos mejorada y soporte para nuevos protocolos de red como SCTP . Java 7 Update 76 se lanzó en enero de 2015, con fecha de vencimiento el 14 de abril de 2015. [60]
En junio de 2016, después de la última actualización pública de Java 7, [61] se anunciaron errores de seguridad " explotables remotamente " en Java 6, 7 y 8. [13]
Java SE 8 (18 de marzo de 2014): nombre en clave Kenai . Los cambios notables incluyen soporte a nivel de lenguaje para expresiones lambda ( cierres ) y métodos predeterminados, el tiempo de ejecución de JavaScript del Proyecto Nashorn, una nueva API de fecha y hora inspirada en Joda Time y la eliminación de PermGen. Esta versión no es oficialmente compatible con la plataforma Windows XP . [62] Sin embargo, debido al final del ciclo de vida de Java 7, es la versión recomendada para usuarios de XP. Anteriormente, sólo se había descrito un método de instalación manual no oficial para Windows XP SP3. Se refiere a JDK8, la plataforma de desarrollo para Java que también incluye un Java Runtime Environment en pleno funcionamiento . [63] Java 8 es compatible con Windows Server 2008 R2 SP1, Windows Vista SP2 y Windows 7 SP1, Ubuntu 12.04 LTS y superiores (y algunos otros sistemas operativos). [64]
Java SE 9 y 10 tenían requisitos de sistema más altos, es decir, Windows 7 o Server 2012 (y el navegador web certificado mínimo se eleva a Internet Explorer 11 u otros navegadores web), y Oracle eliminó la compatibilidad de 32 bits para todas las plataformas, es decir, solo Oracle " 64 ". -Las máquinas virtuales Java (JVM) de bits están certificadas". [sesenta y cinco]
Java SE 11 se lanzó en septiembre de 2018, la primera versión LTS desde que se adoptó el modelo de lanzamiento rápido a partir de la versión 9. Por primera vez, OpenJDK 11 representa el código fuente completo para la plataforma Java bajo la Licencia Pública General GNU, y mientras que Oracle aún así tiene una licencia dual con una licencia propietaria opcional, no hay diferencias de código ni módulos exclusivos de la versión con licencia propietaria. [66] Las características de Java 11 incluyen dos nuevas implementaciones de recolector de basura, Flight Recorder para depurar problemas profundos y un nuevo cliente HTTP que incluye soporte para WebSocket . [67]
Java SE 12 se lanzó en marzo de 2019. [68]
Java SE 13 se lanzó en septiembre de 2019. [69]
Java SE 14 se lanzó en marzo de 2020. [70]
Java SE 15 se lanzó en septiembre de 2020.
Java SE 16 se lanzó en marzo de 2021.
Java SE 17 se lanzó en septiembre de 2021.
Java SE 18 se lanzó en marzo de 2022.
Java SE 19 se lanzó en septiembre de 2022.
Java SE 20 se lanzó en marzo de 2023.
Además de los cambios de lenguaje, a lo largo de los años se han realizado cambios significativos en la biblioteca de clases de Java, que ha crecido de unos pocos cientos de clases en JDK 1.0 a más de tres mil en J2SE 5.0. Han evolucionado API completamente nuevas, como Swing y Java 2D , y muchas de las clases y métodos originales de JDK 1.0 han quedado obsoletos .
Según Oracle en 2010, Java Runtime Environment se encontró en más de 850 millones de PC. [71] Microsoft no ha incluido un Java Runtime Environment (JRE) con sus sistemas operativos desde que Sun Microsystems demandó a Microsoft por agregar clases específicas de Windows al entorno de ejecución Java incluido y por hacer que las nuevas clases estén disponibles a través de Visual J++ . [ cita necesaria ] Apple ya no incluye un tiempo de ejecución de Java con OS X a partir de la versión 10.7 , pero el sistema solicita al usuario que lo descargue e instale la primera vez que se inicia una aplicación que requiere JRE. [ cita necesaria ] Muchas distribuciones de Linux incluyen el tiempo de ejecución OpenJDK como máquina virtual predeterminada, eliminando la necesidad de descargar el Oracle JRE propietario. [72]
Algunas aplicaciones Java tienen un uso bastante extendido en el escritorio, incluidos los entornos de desarrollo integrados NetBeans y Eclipse , y clientes para compartir archivos como LimeWire y Vuze . Java también se utiliza en el entorno de programación matemática MATLAB , tanto para representar la interfaz de usuario como como parte del sistema central. Java proporciona una interfaz de usuario multiplataforma para algunas aplicaciones colaborativas de alto nivel como Lotus Notes .
Oracle planea primero desaprobar el complemento del navegador Java instalable por separado del Java Runtime Environment en JDK 9 y luego eliminarlo por completo de una versión futura, lo que obligará a los desarrolladores web a utilizar una tecnología alternativa. [73]
Duke es la mascota de Java . [74]
Cuando Sun anunció que Java SE y Java ME se lanzarían bajo una licencia de software libre (la Licencia Pública General GNU ), lanzaron los gráficos de Duke bajo la licencia BSD gratuita al mismo tiempo. [75] Cada año se crea una nueva personalidad de Duke. [76] Por ejemplo, en julio de 2011, "Future Tech Duke" incluía una nariz más grande, un jetpack y alas azules. [77]
El código fuente para las implementaciones de Java de Sun (es decir, la implementación de referencia de facto) ha estado disponible durante algún tiempo, pero hasta hace poco, [78] los términos de la licencia restringían severamente lo que se podía hacer con él sin firmar (y generalmente pagar) un contrato con el sol. Como tales, estos términos no cumplían los requisitos ni de la Open Source Initiative ni de la Free Software Foundation para ser considerados software libre o de código abierto y, por lo tanto, Sun Java era una plataforma propietaria. [79]
Mientras que varios proyectos de terceros (por ejemplo, GNU Classpath y Apache Harmony ) crearon implementaciones parciales de Java de software libre , el gran tamaño de las bibliotecas de Sun combinado con el uso de métodos de sala limpia significó que sus implementaciones de las bibliotecas de Java (el compilador y la VM son comparativamente pequeños y bien definidos) eran incompletos y no totalmente compatibles. Estas implementaciones también tendían a estar mucho menos optimizadas que las de Sun. [ cita necesaria ]
Sun anunció en JavaOne 2006 que Java se convertiría en software libre y de código abierto , [80] y el 25 de octubre de 2006, en la conferencia Oracle OpenWorld, Jonathan I. Schwartz dijo que la compañía estaba lista para anunciar el lanzamiento del núcleo Java. Plataforma como software gratuito y de código abierto en un plazo de 30 a 60 días. [81]
Sun lanzó la máquina virtual Java HotSpot y el compilador como software libre bajo la Licencia Pública General GNU el 13 de noviembre de 2006, con la promesa de que el resto del JDK (que incluye el JRE) quedaría bajo la GPL en marzo de 2007 (" excepto algunos componentes que Sun no tiene derecho a publicar en formato fuente distribuible según la GPL"). [82] Según Richard Stallman , esto significaría el fin de la "trampa de Java". [83] Mark Shuttleworth calificó el anuncio de prensa inicial como "Un verdadero hito para la comunidad del software libre ". [84]
Sun publicó el código fuente de la biblioteca Class bajo GPL el 8 de mayo de 2007, excepto algunas partes limitadas que Sun obtuvo de terceros que no querían que su código se publicara bajo una licencia de software libre y de código abierto. [85] Algunas de las partes gravadas resultaron ser partes bastante clave de la plataforma, como la representación de fuentes y la rasterización 2D, pero Sun las lanzó más tarde como código abierto (consulte la biblioteca de clases OpenJDK ).
El objetivo de Sun era reemplazar las partes que siguen siendo propietarias y de código cerrado con implementaciones alternativas y hacer que la biblioteca de clases sea completamente gratuita y de código abierto. Mientras tanto, un proyecto de terceros llamado IcedTea creó un JDK completamente gratuito y altamente utilizable reemplazando el código sobrecargado con códigos auxiliares o de GNU Classpath . Sin embargo, desde entonces OpenJDK se puede construir sin las partes gravadas (desde OpenJDK 6 b10 [86] ) y se ha convertido en el entorno de ejecución predeterminado para la mayoría de las distribuciones de Linux. [87] [88] [89] [90]
En junio de 2008, se anunció que IcedTea 6 (como la versión empaquetada de OpenJDK en Fedora 9 ) pasó las pruebas del Kit de compatibilidad tecnológica y puede afirmar que es una implementación de Java 6 totalmente compatible. [91]
Debido a que OpenJDK está bajo la GPL, es posible redistribuir una versión personalizada del JRE directamente con aplicaciones de software, [92] [93] en lugar de requerir que el usuario final (o su administrador de sistemas) descargue e instale la versión correcta del software propietario de Oracle. JRE en cada uno de sus sistemas.
En la mayoría de los casos, la compatibilidad con Java es innecesaria en los navegadores web y los expertos en seguridad recomiendan que no se ejecute en un navegador a menos que sea absolutamente necesario. [94] Fue sugerido [ ¿por quién? ] que, si algunos sitios web requieren Java, los usuarios deben tener una instalación de navegador separada específicamente para esos sitios. [ cita necesaria ]
Cuando se agregaron los genéricos a Java 5.0, ya existía un gran marco de clases (muchas de las cuales ya estaban en desuso ), por lo que se eligieron los genéricos para implementarlos mediante borrado para permitir la compatibilidad de la migración y la reutilización de estas clases existentes. Esto limitó las funciones que podría proporcionar esta adición en comparación con otros idiomas. [95] [96] La adición de comodines de tipo hizo que Java fuera poco sólido. [97]
Java carece de tipos nativos de enteros sin signo . Los datos sin firmar a menudo se generan a partir de programas escritos en C y la falta de estos tipos impide el intercambio directo de datos entre C y Java. Los números grandes sin signo también se utilizan en muchos campos de procesamiento numérico, incluida la criptografía, lo que puede hacer que Java sea menos conveniente para estas tareas. [98] Aunque es posible evitar parcialmente este problema con el código de conversión y el uso de tipos de datos más grandes, hace que el uso de Java sea engorroso para manejar los datos sin firmar. Si bien se puede utilizar un entero con signo de 32 bits para contener un valor sin signo de 16 bits con relativa facilidad, un valor sin signo de 32 bits requeriría un entero con signo de 64 bits. Además, un valor sin signo de 64 bits no se puede almacenar utilizando ningún tipo entero en Java porque no existe ningún tipo mayor que 64 bits en el lenguaje Java. Si se abstraen mediante funciones, las llamadas a funciones se vuelven necesarias para muchas operaciones que son nativas de otros lenguajes. Alternativamente, es posible utilizar los enteros con signo de Java para emular enteros sin signo del mismo tamaño, pero esto requiere un conocimiento detallado de operaciones bit a bit complejas. [99]
Si bien la aritmética de coma flotante de Java se basa en gran medida en IEEE 754 ( Estándar para aritmética binaria de coma flotante ), ciertas características no son compatibles incluso cuando se usa el strictfp
modificador, como indicadores de excepción y redondeos dirigidos, capacidades exigidas por el estándar IEEE 754. Además, la Los tipos de punto flotante de precisión extendida permitidos en 754 y presentes en muchos procesadores no están permitidos en Java. [100] [101]
En los primeros días de Java (antes de que se implementara HotSpot VM en Java 1.3 en 2000) hubo algunas críticas sobre el rendimiento. Los puntos de referencia generalmente informaban que Java era aproximadamente un 50% más lento que C (un lenguaje que se compila en código nativo). [102] [103] [104]
El rendimiento de Java ha mejorado sustancialmente desde las primeras versiones. [23] En algunas pruebas optimizadas se ha demostrado que el rendimiento de los compiladores JIT en relación con los compiladores nativos es bastante similar. [23] [24] [25]
El código de bytes de Java puede interpretarse en tiempo de ejecución mediante una máquina virtual o puede compilarse en tiempo de carga o en tiempo de ejecución en código nativo que se ejecuta directamente en el hardware de la computadora. La interpretación es más lenta que la ejecución nativa y la compilación en tiempo de carga o de ejecución tiene una penalización de rendimiento inicial para la compilación. Todas las implementaciones JVM modernas y de alto rendimiento utilizan el enfoque de compilación, por lo que después del tiempo de inicio inicial el rendimiento es equivalente al código nativo.
La plataforma Java proporciona una arquitectura de seguridad [105] que está diseñada para permitir al usuario ejecutar código de bytes que no es de confianza en un "espacio aislado" para protegerse contra software malicioso o mal escrito. Esta característica de "zona de pruebas" tiene como objetivo proteger al usuario restringiendo el acceso a ciertas funciones de la plataforma y API que podrían ser explotadas por malware , como acceder al sistema de archivos local, ejecutar comandos arbitrarios o acceder a redes de comunicación.
En los últimos años, los investigadores han descubierto numerosas fallas de seguridad en algunas implementaciones de Java ampliamente utilizadas, incluida la de Oracle, que permiten que el código no confiable eluda el mecanismo de espacio aislado, exponiendo a los usuarios a ataques maliciosos. Estos fallos afectan sólo a las aplicaciones Java que ejecutan códigos de bytes arbitrarios que no son de confianza, como complementos de navegadores web que ejecutan subprogramas Java descargados de sitios web públicos. Las aplicaciones en las que el usuario confía y tiene control total sobre todo el código que se ejecuta no se ven afectadas.
El 31 de agosto de 2012, se descubrió que Java 6 y 7 (ambos compatibles en ese entonces) en Microsoft Windows, OS X y Linux tenían una falla de seguridad grave que permitía que se realizara un exploit remoto simplemente cargando una página web maliciosa. [106] Más tarde se descubrió que Java 5 también tenía fallas. [107]
El 10 de enero de 2013, tres especialistas en informática se pronunciaron en contra de Java y dijeron a Reuters que no era seguro y que la gente debería desactivar Java. Jaime Blasco, director de laboratorios de AlienVault Labs, afirmó que "Java es un desastre. No es seguro. Hay que desactivarlo". [108] Esta vulnerabilidad afecta a Java 7 y no está claro si afecta a Java 6 , por lo que se sugiere que los consumidores la desactiven. [109] [110] Las alertas de seguridad de Oracle anuncian cronogramas de parches críticos relacionados con la seguridad para Java. [111]
El 14 de enero de 2013, los expertos en seguridad dijeron que la actualización aún no lograba proteger las PC de ataques. [112] Este agujero de explotación provocó una respuesta del Departamento de Seguridad Nacional de los Estados Unidos que animaba a los usuarios a desactivar o desinstalar Java. [14] Apple incluyó Java en la lista negra en orden limitado para todas las computadoras que ejecutan su sistema operativo OS X a través de un programa de protección antivirus. [113]
En 2014, y en respuesta a los recientes problemas de seguridad y vulnerabilidad de Java, el bloguero de seguridad Brian Krebs pidió a los usuarios que eliminaran al menos el complemento del navegador Java y también todo el software. "Espero un mundo sin el complemento Java (y no tener que recordar a los lectores acerca de las actualizaciones de parches trimestrales), pero probablemente pasarán años antes de que varias versiones de este complemento se eliminen en su mayoría de los sistemas de los usuarios finales en todo el mundo". [114] "Una vez prometedor, ha dejado de ser útil en el navegador y se ha convertido en una pesadilla que deleita a los ciberdelincuentes a expensas de los usuarios de computadoras". [115] "Creo que todo el mundo debería desinstalar Java de todas sus PC y Mac, y luego pensar detenidamente si es necesario volver a agregarlo. Si es un usuario doméstico típico, probablemente pueda prescindir de él. Si es una empresa usuario, es posible que no tenga otra opción." [116]
El entorno de ejecución Java distribuido por Oracle tiene un historial de agrupar software patrocinado que se instala de forma predeterminada durante la instalación y durante las actualizaciones que se implementan aproximadamente cada mes. Esto incluye la " barra de herramientas Ask.com " que redirigirá las búsquedas del navegador a anuncios y "McAfee Security Scan Plus". [117] Estas ofertas se pueden bloquear mediante una configuración en el Panel de control de Java, aunque esto no es obvio. Esta configuración se encuentra en la pestaña "Avanzado" en el Panel de control de Java, bajo el encabezado "Varios", donde la opción está etiquetada como una opción para suprimir "ofertas de patrocinadores".
Java aún tiene que lanzar un actualizador automático que no requiera la intervención del usuario ni derechos administrativos [118] a diferencia de Google Chrome [119] y Flash Player. [120]
{{cite web}}
: CS1 maint: archived copy as title (link){{cite web}}
: CS1 maint: archived copy as title (link)"Los abogados nos habían dicho que no podíamos utilizar el nombre "OAK" porque [ya era una marca registrada de] Oak Technologies", dijo Frank Yellin, ingeniero senior de Sun. "Así que se llevó a cabo una sesión de intercambio de ideas para encontrar ideas para un nuevo nombre".
"Su precio es inferior a nuestros costes", afirma Schmidt. 'Esto supone una pérdida de dinero en el negocio de las licencias en el futuro inmediato. Es una inversión estratégica en cuota de mercado”.
Sólo se admite el modo X.org.
El modo Wayland
no es compatible.
Java se ejecuta en más de 850 millones de computadoras personales en todo el mundo y en miles de millones de dispositivos en todo el mundo, incluidos dispositivos móviles y de TV.