Java es uno de los pocos lenguajes de programación cuya historia coincide con varias grandes transformaciones de la informática: la electrónica de consumo, la expansión de la Web, el software empresarial, el código abierto, los smartphones y la nube.
Cuando Java se presentó públicamente en 1995, su promesa quedó resumida en un lema memorable: «Write Once, Run Anywhere», es decir, escribir una vez y ejecutar en cualquier lugar. La idea consistía en compilar un programa una sola vez y ejecutarlo en sistemas diferentes gracias a una plataforma común. Java convirtió esa promesa en un ecosistema basado en el bytecode, la Máquina Virtual de Java (JVM), la gestión automática de memoria y una amplia biblioteca estándar.
Sin embargo, Java no nació para la Web. Su historia comienza unos años antes, cuando un pequeño equipo de Sun Microsystems intentaba imaginar el futuro de los dispositivos electrónicos.
1991: el proyecto Green
A comienzos de los años noventa, Sun Microsystems era conocida sobre todo por sus estaciones de trabajo Unix y por su visión de la informática conectada en red.
Algunos ingenieros pensaban que la siguiente gran ola también llegaría a los dispositivos de consumo: televisores interactivos, decodificadores, asistentes y equipos domésticos inteligentes.
En 1991, Sun puso en marcha el Green Project.
Entre sus integrantes se encontraba James Gosling, que se convertiría en el principal diseñador del nuevo lenguaje.
El equipo se enfrentaba a una restricción importante: estos dispositivos podían utilizar procesadores y sistemas muy diferentes. Mantener una versión específica del software para cada plataforma sería caro y difícil.
La portabilidad se convirtió así en uno de los objetivos fundamentales del proyecto.
Oak: Java antes de Java
Gosling experimentó inicialmente con C y C++.
C++ ofrecía abstracciones potentes y un control muy preciso de los recursos, pero el equipo Green quería un entorno más sencillo de desplegar y más robusto frente a las diferencias de hardware.
Gosling diseñó entonces un nuevo lenguaje llamado Oak, nombre inspirado en un roble situado cerca de su oficina.
Oak conservaba una sintaxis familiar para quienes conocían C o C++, pero eliminaba o limitaba algunos mecanismos complejos. La memoria se recuperaba automáticamente mediante un recolector de basura y no se utilizaba aritmética explícita de punteros como en C.
El objetivo no era únicamente la portabilidad. También se pretendía facilitar la creación de programas grandes y reducir determinados errores de bajo nivel.
Bytecode y la Máquina Virtual de Java
La decisión arquitectónica más importante de Java fue su modelo de ejecución.
El código fuente Java no suele compilarse directamente en las instrucciones de un procesador concreto. El compilador genera una representación intermedia llamada bytecode Java.
Ese bytecode es ejecutado por una Java Virtual Machine, o JVM.
Si una plataforma dispone de una JVM compatible, puede ejecutar el mismo bytecode.
En lugar de adaptar cada aplicación a cada procesador y sistema operativo, se adapta la propia JVM a las distintas plataformas.
Esta arquitectura dio sentido al famoso lema:
Write Once, Run Anywhere.
La portabilidad perfecta siempre ha dependido de las bibliotecas y de la integración con el sistema, pero la JVM redujo enormemente la cantidad de código específico de cada plataforma.
De la electrónica de consumo a la Web
El proyecto Green no consiguió el éxito comercial esperado en la televisión interactiva.
Al mismo tiempo, el World Wide Web estaba creciendo a gran velocidad.
Sun comprendió que un lenguaje pensado para ejecutarse en dispositivos heterogéneos también podía resultar muy útil en una red formada por ordenadores diferentes.
Oak tuvo que cambiar de nombre por problemas de marca registrada.
El equipo terminó adoptando Java.
Sun presentó oficialmente el lenguaje en 1995, justo cuando la Web empezaba a llegar al gran público.
HotJava y los applets
Sun desarrolló HotJava, un navegador capaz de ejecutar pequeños programas Java integrados en páginas web.
Estos programas recibieron el nombre de applets.
En aquella época parecían revolucionarios. Una página podía incluir animaciones, interfaces interactivas, visualizaciones o pequeños juegos ejecutados en el ordenador del usuario.
Netscape incorporó rápidamente soporte para Java, lo que proporcionó al lenguaje una enorme visibilidad.
Los applets se convirtieron en uno de los símbolos de la Web de los años noventa.
Paradójicamente, no serían el futuro duradero de Java.
Java no es JavaScript
La similitud de los nombres sigue generando confusión, pero Java y JavaScript son lenguajes diferentes.
JavaScript fue creado en 1995 por Brendan Eich en Netscape como un lenguaje de scripting ligero para el navegador.
El nombre JavaScript estuvo muy influido por el contexto comercial de una época en la que Java recibía una enorme atención.
Históricamente, Java se consolidó sobre todo en aplicaciones, servidores y sistemas empresariales. JavaScript se convirtió en el lenguaje nativo del navegador y posteriormente se extendió también a servidores y muchos otros entornos.
Java 1.0: una plataforma, no solo un lenguaje
En enero de 1996, Sun publicó el Java Development Kit 1.0.
Java ya era mucho más que una sintaxis.
La plataforma incluía el lenguaje, el compilador, la JVM, una biblioteca estándar, herramientas de desarrollo, mecanismos de seguridad y carga dinámica de clases.
Esta visión de plataforma se convirtió en una de sus principales fortalezas.
Los desarrolladores podían utilizar API comunes para redes, entrada y salida, colecciones, interfaces gráficas, concurrencia y muchas otras tareas.
El ecosistema creció alrededor de un entorno de ejecución compartido.
Las clases y los objetos se convirtieron en las unidades principales de organización. La encapsulación, la herencia, las interfaces y el polimorfismo ocuparon un lugar central.
Frente a C++, Java simplificó deliberadamente varios mecanismos.
No permite herencia múltiple de clases, automatiza la recuperación de memoria y elimina la aritmética explícita de punteros.
Estas decisiones ayudaron a convertirlo en una opción atractiva para equipos que debían mantener aplicaciones grandes durante muchos años.
Java 2 y la era empresarial
Java 1.2, publicado en 1998, marcó una expansión importante. Sun empezó a utilizar el nombre Java 2 y organizó la plataforma en varias ediciones.
J2SE estaba destinada al desarrollo general.
J2EE se centraba en aplicaciones empresariales y servidores.
J2ME apuntaba a dispositivos con recursos limitados, como teléfonos y sistemas embebidos.
J2EE desempeñó un papel decisivo en el éxito a largo plazo de Java.
Servlets, JavaServer Pages, Enterprise JavaBeans, API de bases de datos, mensajería y servidores de aplicaciones proporcionaron una base estandarizada para grandes sistemas.
Java se volvió habitual en bancos, aseguradoras, telecomunicaciones, administraciones y grandes empresas.
¿Por qué las empresas adoptaron Java?
Su éxito empresarial procede de una combinación de factores.
La portabilidad reducía la dependencia de un sistema operativo concreto.
El tipado estático permitía detectar numerosos errores antes del despliegue.
El recolector de basura eliminaba buena parte de la gestión manual de memoria.
La JVM ofrecía un entorno de ejecución controlado.
Las bibliotecas y frameworks crecían rápidamente.
Además, una comunidad enorme facilitaba encontrar desarrolladores y mantener equipos durante largos periodos.
Para organizaciones cuyos sistemas debían vivir diez o veinte años, la estabilidad era una ventaja esencial.
La JVM se vuelve más rápida
Las primeras implementaciones de Java fueron criticadas por su rendimiento.
Ejecutar bytecode en una máquina virtual parecía necesariamente más lento que ejecutar código nativo.
Pero las JVM evolucionaron rápidamente.
Los compiladores JIT (Just-In-Time) identifican las partes más utilizadas de un programa y las convierten en código máquina optimizado durante la ejecución.
Además, la JVM puede observar el comportamiento real del programa y optimizar los caminos que se utilizan de verdad.
HotSpot, una tecnología adquirida por Sun e integrada en Java, se convirtió en una pieza fundamental.
Con el tiempo, Java pasó de ser considerado demasiado lento a ejecutar algunos de los sistemas servidor más grandes del mundo.
El declive de los applets
Mientras Java prosperaba en los servidores, los applets siguieron el camino contrario.
Necesitaban plugins o una instalación local de Java, podían tardar en arrancar y planteaban problemas de seguridad y despliegue.
Al mismo tiempo, los navegadores se hicieron mucho más potentes.
JavaScript, CSS, HTML y las API web modernas permitieron crear interfaces ricas sin depender de un plugin Java.
Los navegadores terminaron abandonando las antiguas tecnologías de plugins.
Los applets desaparecieron.
Java sobrevivió porque su ecosistema de servidores y aplicaciones empresariales ya era mucho más importante que su presencia en el navegador.
Java 5 moderniza el lenguaje
Publicado en 2004, Java 5 introdujo varias mejoras importantes:
generics;
anotaciones;
enumeraciones;
autoboxing;
bucles for mejorados;
métodos con número variable de argumentos.
Los generics mejoraron la seguridad de tipos en colecciones y API reutilizables.
Las anotaciones adquirieron una enorme importancia porque los frameworks podían asociar metadatos directamente a clases, métodos y campos.
Java demostraba que podía evolucionar sin renunciar a la compatibilidad.
Los frameworks transforman Java
La historia de Java no puede explicarse únicamente mediante sus versiones.
Los frameworks cambiaron profundamente la forma de desarrollar aplicaciones.
Apache Tomcat se convirtió en un contenedor de servlets muy utilizado.
Hibernate popularizó el mapeo objeto-relacional.
Spring ofreció una alternativa más ligera a algunos modelos empresariales históricos y popularizó la inyección de dependencias.
Más tarde, Spring Boot simplificó enormemente la creación de aplicaciones autónomas y servicios web.
Herramientas como Maven y Gradle, bibliotecas de pruebas y repositorios de paquetes se convirtieron también en partes esenciales del ecosistema.
IDE y herramientas industriales
Java se benefició pronto de entornos de desarrollo muy potentes.
Eclipse, inicialmente vinculado a IBM, se convirtió en un IDE open source de referencia.
IntelliJ IDEA destacó por su análisis de código, navegación y refactorización automática.
NetBeans, durante mucho tiempo asociado a Sun, también desempeñó un papel importante.
En bases de código de millones de líneas, estas herramientas son fundamentales.
La calidad del tooling se convirtió en una de las grandes ventajas de Java.
OpenJDK: la apertura de la plataforma
Durante su primera década, Java estuvo estrechamente asociado a Sun Microsystems.
En 2006, Sun anunció la publicación como software libre de una gran parte de Java.
OpenJDK se convirtió en la implementación open source de referencia de la plataforma.
Esto modificó profundamente el ecosistema.
Java dejó de ser simplemente una tecnología distribuida por una única empresa. Distintas compañías y comunidades podían colaborar en el runtime y crear sus propias distribuciones.
OpenJDK constituye hoy la base de la mayoría de distribuciones Java modernas.
Oracle compra Sun
Oracle completó la adquisición de Sun Microsystems en 2010.
Java entró así en una nueva etapa institucional.
La transición generó debates sobre gobernanza, licencias y ritmo de evolución.
Con el tiempo, OpenJDK adquirió un papel cada vez más central.
Oracle, Red Hat, IBM, Amazon, Microsoft y otras organizaciones contribuyen al ecosistema o distribuyen runtimes basados en OpenJDK.
La plataforma es hoy mucho más amplia que una única distribución comercial.
Android y Java
Java también quedó profundamente ligado a Android.
Las primeras versiones del SDK de Android utilizaban Java como lenguaje principal para las aplicaciones.
Android no ejecutaba simplemente las aplicaciones en una JVM Java SE clásica. Google desarrolló su propia arquitectura, primero con Dalvik y después con ART.
El uso de las API Java dio lugar a un largo conflicto jurídico entre Oracle y Google.
A pesar de estas diferencias, Java fue el lenguaje con el que toda una generación aprendió a desarrollar aplicaciones Android.
Kotlin obtuvo posteriormente soporte oficial y pasó a ser preferido en muchos proyectos nuevos, pero una enorme cantidad de código Java sigue formando parte del ecosistema.
Java 8: lambdas y streams
Publicado en 2014, Java 8 fue una de las versiones modernas más importantes.
Introdujo las expresiones lambda y la API Stream.
Las lambdas permitieron expresar comportamientos de forma mucho más concisa que mediante las clases anónimas utilizadas anteriormente.
Los streams ofrecieron un modelo declarativo para filtrar, transformar y agregar secuencias de datos.
Java incorporó así ideas de programación funcional sin abandonar sus fundamentos orientados a objetos.
Java 8 permaneció durante muchos años como una versión dominante en producción.
La JVM se vuelve multilingüe
La JVM dejó de estar reservada a Java.
Scala combina programación orientada a objetos y funcional.
Clojure aporta un enfoque inspirado en Lisp.
Groovy ofrece un lenguaje dinámico muy integrado con las bibliotecas Java.
Kotlin, creado por JetBrains, propone una sintaxis moderna y una fuerte interoperabilidad con Java.
Este fenómeno es una parte importante del legado de Java: incluso un programa escrito en otro lenguaje puede aprovechar los recolectores de basura, compiladores JIT, bibliotecas y herramientas de la JVM.
Un ritmo de publicación más rápido
A partir de 2017, Java adoptó un ritmo de publicación regular.
En lugar de esperar varios años entre grandes versiones, aparecen nuevas versiones funcionales con mucha más frecuencia, mientras determinadas versiones reciben soporte a largo plazo según las distribuciones.
El Java moderno ha incorporado, entre otras cosas:
el sistema de módulos;
var para inferencia local de tipos;
records;
text blocks;
pattern matching;
sealed classes;
virtual threads.
Estas mejoras buscan reducir parte de la verbosidad histórica y responder a cargas de trabajo modernas sin romper la enorme base de software existente.
Virtual threads y concurrencia moderna
La concurrencia siempre ha sido importante en las aplicaciones servidor Java.
Los threads tradicionales del sistema operativo son recursos relativamente costosos.
El proyecto Loom introdujo los virtual threads, que permiten crear un número muy elevado de tareas concurrentes ligeras manteniendo un estilo de programación familiar.
Resultan especialmente útiles para servicios que pasan gran parte del tiempo esperando bases de datos, redes u otras operaciones de entrada y salida.
Es un buen ejemplo de la forma en que Java suele evolucionar: modernizar la plataforma sin obligar a abandonar por completo los modelos conocidos.
Java frente a Python, JavaScript y C++
Java ocupa un espacio diferente al de otros grandes lenguajes.
Python favorece una sintaxis concisa y un desarrollo rápido, y se ha vuelto esencial en automatización, ciencia de datos e inteligencia artificial.
JavaScript domina la programación en el navegador y se ha extendido mucho más allá de él.
C++ ofrece un control más directo sobre memoria y recursos, algo fundamental en motores, sistemas y aplicaciones donde el rendimiento extremo es prioritario.
Java busca un equilibrio entre rendimiento, portabilidad, seguridad de ejecución, productividad y estabilidad a largo plazo.
No son lenguajes intercambiables: responden a restricciones distintas.
¿Por qué Java sigue siendo importante?
Java tiene ya más de treinta años y continúa utilizándose de forma masiva.
La compatibilidad es una de las razones principales. Muchas organizaciones pueden trasladar aplicaciones antiguas a JVM recientes sin reescribirlas por completo.
Las JVM modernas ofrecen además recolectores de basura sofisticados, compiladores JIT muy optimizados, profiling, diagnóstico y observabilidad.
El ecosistema es inmenso: frameworks, herramientas de pruebas, sistemas de build y servicios cloud.
Y, sobre todo, Java está profundamente implantado en sectores donde el software debe vivir durante décadas.
Críticas y adaptación
Java ha sido criticado durante mucho tiempo por su verbosidad, consumo de memoria, tiempo de arranque y la complejidad acumulada por décadas de compatibilidad.
Lenguajes más recientes ofrecen a veces sintaxis más expresivas o sistemas de tipos diferentes.
Java responde de forma gradual.
Los records reducen código repetitivo.
El pattern matching simplifica determinadas comprobaciones de tipos.
Los recolectores modernos reducen las pausas.
Frameworks como Quarkus y Micronaut se orientan a contenedores y cloud.
GraalVM y la compilación nativa exploran otros modelos de despliegue.
Java sigue cambiando porque el entorno para el que se utiliza también cambia.
De Oak a una infraestructura mundial
La historia de Java resulta especialmente interesante porque varias tecnologías que le dieron fama inicialmente desaparecieron.
La televisión interactiva no fue su gran mercado.
Los applets desaparecieron.
Sun Microsystems dejó de existir como empresa independiente.
Java, sin embargo, continuó creciendo.
Sus fundamentos más profundos - portabilidad, máquina virtual, memoria gestionada, bibliotecas comunes, compatibilidad y ecosistema - demostraron ser útiles en contextos que sus creadores no podían prever por completo.
Java pasó de ser un lenguaje para dispositivos electrónicos heterogéneos a convertirse en una infraestructura mundial de software.
Lo esencial
Java nació en el Green Project de Sun Microsystems en 1991. James Gosling creó inicialmente Oak para software que debía funcionar en hardware muy diferente.
Rebautizado como Java, el lenguaje fue presentado en 1995 y obtuvo una enorme visibilidad gracias a los applets web.
Su innovación más duradera no fue el applet, sino la combinación de bytecode y JVM, que trasladó buena parte del problema de portabilidad al entorno de ejecución.
Desde finales de los años noventa, Java se consolidó especialmente en servidores y sistemas empresariales.
Java 5 modernizó el lenguaje, Java 8 introdujo lambdas y streams y OpenJDK transformó Java en una infraestructura open source compartida.
Hoy, la JVM aloja varios lenguajes y Java continúa evolucionando mediante versiones regulares, nuevas funcionalidades y mejoras del runtime como los virtual threads.
Su historia muestra una lección recurrente de la informática: una tecnología puede sobrevivir a su uso inicial cuando su arquitectura resulta útil en entornos completamente nuevos.
Preguntas frecuentes
¿Quién creó Java?
Java fue diseñado principalmente por James Gosling y un equipo de Sun Microsystems dentro del proyecto Green a comienzos de los años noventa.
¿Cómo se llamaba Java originalmente?
El lenguaje se llamaba inicialmente Oak antes de adoptar el nombre Java.
¿Por qué Java es portable?
Java se compila normalmente a bytecode, que es ejecutado por una JVM compatible en cada plataforma.
¿Java y JavaScript están relacionados?
No. Son dos lenguajes distintos, con historias, diseños y modelos de ejecución diferentes.
¿Siguen utilizándose los applets Java?
Prácticamente han desaparecido porque los navegadores modernos ya no soportan el modelo de plugins necesario para ejecutarlos.
¿Qué es OpenJDK?
OpenJDK es la implementación open source de referencia de la plataforma Java y constituye la base de numerosas distribuciones actuales.
¿Java sigue utilizándose hoy?
Sí. Sigue siendo muy habitual en sistemas empresariales, servicios backend, finanzas, infraestructuras distribuidas y plataformas de larga duración.
¿Cuál es la diferencia entre Java y la JVM?
Java es un lenguaje de programación. La JVM es un entorno de ejecución de bytecode que también puede alojar lenguajes como Kotlin, Scala o Clojure.
¿Por qué Java ha durado tanto?
Su portabilidad, compatibilidad, herramientas maduras, la JVM, su enorme ecosistema y su adopción empresarial han creado una plataforma extraordinariamente duradera.