Esta es una traducción de la página original en inglés.

Libre pero encadenado. La trampa de Java

Nota

Después de que se publicara este artículo, Sun (ahora parte de Oracle) relicenció la mayor parte de la implementación de referencia de su plataforma Java bajo la Licencia Pública General de GNU, de manera que ahora existe un entorno de desarrollo libre para Java. Así pues, el lenguaje Java ya no es una trampa.

No obstante, debe ser precavido, pues no toda plataforma Java es libre. Sun sigue distribuyendo una plataforma Java ejecutable que no es libre, y también otras compañías lo hacen.

El entorno libre para Java se denomina «IcedTea» —que es donde se incluye el código fuente liberado por Sun—, de manera que es este el entorno que se debe utilizar. Muchas distribuciones GNU/Linux vienen con IcedTea, pero algunas incluyen plataformas Java que no son libres.(Nota, añadida en octubre de 2015: La implentación libre de Java se denomina OpenJDK en muchas distribuciones GNU/Linux).

Para tener la seguridad de que sus programas Java funcionarán correctamente en un entorno libre, tiene que escribirlos utilizando IcedTea. En teoría, las plataformas Java deberían ser compatibles, pero no lo son al cien por cien.

Además, hay programas privativos que incluyen la palabra «Java» en el nombre, como sucede con JavaFX, y existen paquetes Java que uno podría sentirse tentado a utilizar pero que hay que rechazar, pues no son libres. Si utiliza Swing, asegúrese de que sea la versión libre, que viene con IcedTea.(Nota, añadida en octubre de 2015: Se ha publicado un reemplazo libre de JavaFX llamado OpenJFX.)

Dejando a un lado los aspectos que se refieren específicamente a Java, el asunto general aquí descrito continúa siendo importante, pues cualquier plataforma de programación o biblioteca que no sea libre puede provocar un problema similar. Hemos de aprender de la historia de Java para evitar así otras trampas en el futuro.

Véase también: La trampa de JavaScript.


12 de abril de 2004

Si su programa es software libre, básicamente es ético, pero hay una trampa a la que debe estar atento. Su programa, aunque en sí mismo sea libre, puede estar limitado por alguna dependencia de software que no es libre. En la actualidad este problema se da sobre todo en los programas Java, por lo que lo llamamos «la trampa de Java».

Un programa es software libre si sus usuarios tienen ciertas libertades esenciales. Sin entrar en detalles, éstas son: la libertad de ejecutar el programa, la libertad de estudiar y modificar el código fuente, la libertad de redistribuir el código fuente y los binarios, y la libertad de publicar versiones mejoradas (véase la Definición de software libre). Que un programa en forma de código fuente sea software libre depende únicamente de los términos de su licencia.

Que el programa pueda ser usado en el mundo libre por personas que quieren vivir en libertad es una cuestión más compleja. No es algo que esté determinado únicamente por la licencia del programa, porque ningún programa funciona aislado. Todos los programas dependen de otros programas. Por ejemplo, un programa necesita ser compilado o interpretado, por lo tanto depende de un compilador o de un intérprete. Si es compilado en bytecode, depende de un intérprete de bytecode. Además, necesita bibliotecas para ejecutarse, y también puede invocar a otros programas aparte que se ejecutan en otros procesos. Todos estos programas son dependencias. Las dependencias pueden ser necesarias para poder ejecutar el programa, o pueden ser necesarias solamente para ciertas funciones. En cualquier caso, el programa entero, o alguna parte del mismo, no puede funcionar sin las dependencias.

Si algunas de las dependencias de un programa no son libres, entonces ese programa o una parte de él no se puede ejecutar en un sistema completamente libre: es inutilizable en el mundo libre. Ciertamente podemos redistribuir el programa y tener copias en nuestras máquinas, pero eso no sirve de mucho si no podemos ejecutarlo. El programa es software libre, pero en la práctica está encadenado por dependencias que no son libres.

Este problema puede suceder en cualquier tipo de software, en cualquier lenguaje. Por ejemplo, un programa libre que solamente funcione en Microsoft Windows es claramente inútil en el mundo libre. Pero el software que funciona en GNU/Linux también puede ser inútil si depende de otro software que no sea libre. En el pasado, Motif (antes de que tuviéramos LessTif) y Qt (antes de que sus desarrolladores lo convirtieran en software libre) fueron importantes causantes de este problema. La mayoría de las tarjetas gráficas 3D solamente funcionan a pleno rendimiento con controladores que no son libres, que también originan este problema. Pero hoy en día la causa principal de este problema es Java, porque los programadores que escriben software libre a menudo se sienten atraídos por Java. Cegados por su atracción hacia el lenguaje, descuidan el problema de las dependencias y caen en la trampa de Java.

La implementación de Java de Sun no es libre. Las bibliotecas estándar de Java tampoco son libres. Sí que tenemos implementaciones libres de Java, como el compilador de GNU para Java (GCJ) y Classpath de GNU, pero todavía no tienen todas las funcionalidades. Aún estamos trabajando en ello.

Si usted escribe un programa Java sobre la plataforma Java de Sun, está expuesto a usar funcionalidades exclusivas de Sun sin ni siquiera advertirlo. Para cuando se dé cuenta, quizás las haya estado usando durante meses, y rehacer el trabajo podría llevarle aún más tiempo. Podría pensar: «Volver a empezar es demasiado trabajo». Entonces su programa habrá caído en la trampa de Java y será inutilizable en el mundo libre.

La manera más eficaz de evitar la trampa de Java es tener en su sistema solamente una implementación libre de Java. Así, si usted usa una funcionalidad o biblioteca de Java que el software libre todavía no soporta, se dará cuenta enseguida, y podrá reescribir ese código de inmediato.

Sun continúa desarrollando bibliotecas «estándar» adicionales de Java, y casi ninguna es libre. En muchos casos, incluso la especificación de la biblioteca es un secreto comercial, y la última licencia de Sun para estas especificaciones prohíbe publicar nada que no sea una implementación completa de la especificación (para encontrar ejemplos, véase el Java Specification Participation Agreement y J2ME™ Personal Basis Profile Specification).

Afortunadamente, la licencia de esa especificación permite publicar una implementación como software libre. A quien reciba la biblioteca se le permite modificarla y no se le exige adherirse a la especificación. Pero el requisito tiene el efecto de prohibir el uso de un modelo de desarrollo cooperativo para producir la implementación libre. El uso de ese modelo implicaría la publicación de versiones incompletas, algo que aquellos que han leído la especificación no están autorizados a hacer.

Durante los primeros años del Movimiento del Software Libre era imposible evitar la dependencia de programas privativos. Antes de que tuviéramos el compilador C de GNU, todos los programas en C (libres o no) dependían de un compilador C que no era libre. Antes de que tuviéramos la biblioteca C de GNU, todos los programas dependían de una biblioteca C que no era libre. Antes de que tuviéramos Linux, el primer núcleo libre, todos los programas dependían de un núcleo que no era libre. Antes de que tuviéramos BASH, todos los textos para el intérprete de órdenes [shell scripts] tenían que ser interpretados por un intérprete de órdenes [shell] que no era libre. Era inevitable que nuestros primeros programas se vieran obstaculizados por estas dependencias, pero lo aceptamos porque nuestro plan incluía su posterior rescate. Nuestra meta final, un sistema operativo GNU autosuficiente, incluía sustitutos libres para todas estas dependencias. Si alcanzábamos la meta, todos nuestros programas serían rescatados. Y así sucedió: con el sistema GNU/Linux, ahora podemos ejecutar estos programas en plataformas libres.

Hoy en día la situación es diferente. Tenemos potentes sistemas operativos libres y muchas herramientas de programación libres. Cualquier tarea que usted quiera hacer, la puede hacer en una plataforma libre; no hay necesidad de aceptar una dependencia que no sea libre, ni siquiera temporalmente. La principal razón por la que la gente cae hoy en la trampa es porque no piensan en ello. La solución más fácil al problema de la trampa de Java es enseñar a reconocerla para que las personas no caigan en ella.

Para mantener su código Java a salvo de la trampa de Java, instale un entorno de desarrollo Java que sea libre y úselo. De forma más general, cualquiera que sea el lenguaje que use, mantenga los ojos abiertos y compruebe que los programas de los que depende su código sean libres. La manera más fácil de verificar si un programa es libre es buscarlo en el Directorio de Software Libre. Si un programa no está en el directorio, puede comprobar si su licencia está en la lista de licencias de software libre.

Estamos intentando rescatar los programas atrapados en Java, así que si a usted le gusta el lenguaje Java, le invitamos a colaborar en el desarrollo de Classpath de GNU. También es útil probar sus programas con el compilador GJC y con Classpath de GNU, e informar de cualquier problema que encuentre en las clases que ya están implementadas. Sin embargo, finalizar Classpath de GNU tomará tiempo. Si se siguen añadiendo más bibliotecas que no sean libres, es posible que nunca dispongamos de todas las versiones más recientes. Así que, por favor, no encadene su software libre. Cuando escriba una aplicación, escríbala para que funcione desde el principio en entornos libres.

Véase también:

El curioso incidente de Sun a medianoche