par Richard Stallman
le 12 avril 2004
En décembre 2006, Sun est en train de republier sa plateforme Java sous licence GNU GPL. Quand ce changement de licence sera achevé, nous nous attendons à ce que Java ne soit plus un piège. Cependant, le problème général décrit ici demeure important, car toute bibliothèque ou plateforme de programmation non-libre peut causer un problème similaire. Nous devons retenir la leçon de l'histoire de Java de sorte à éviter d'autres pièges à l'avenir.
Si votre programme est un logiciel libre, il est éthique par nature -- Mais il y a un piège dont il faut se méfier. Bien qu'intrinsèque, la liberté de votre programme, peut être restreinte à cause de logiciels non-libres dont dépend votre programme. Comme ce problème est aujourd'hui le plus visible avec les programmes Java, nous l'avons nommé le Piège Java.
Un programme est un logiciel libre si ses utilisateurs possèdent certaines libertés fondamentales. En gros, il s'agit de : la liberté d'exécuter le programme, la liberté d'en étudier et modifier le code source, la liberté d'en redistribuer les fichiers source et binaires, et la liberté d'en publier des versions améliorées. (Voir http://www.gnu.org/philosophy/free-sw.fr.html.) Qu'un programme donné soit un logiciel libre ne dépend que de la signification de sa licence.
Que le programme puisse être utilisé dans le Monde Libre, utilisé par des personnes qui entendent vivre en toute liberté, est une question plus compliquée. La seule licence du programme ne détermine pas cela, car aucun programme ne fonctionne en isolation totale. Chaque programme dépend d'autres programmes. Par exemple, un programme nécessite d'être compilé ou interprété, il dépend donc d'un compilateur ou d'un interpréteur. S'il est compilé en pseudo-code binaire, il dépend d'un interpréteur de pseudo-code. Qui plus est, pour s'exécuter il a besoin de bibliothèques, et il peut faire appel à d'autres programmes qui s'exécutent sous d'autres processus. Tous ces programmes sont des dépendances. Les dépendances peuvent être totalement indispensables à l'exécution du programme, ou juste nécessaires à certaines de ses fonctionnalités. D'une façon ou d'une autre, tout ou partie du programme ne peut pas fonctionner sans elles.
Que certaines des dépendances d'un programme ne soient pas libres, signifie que tout ou partie du programme ne peut s'exécuter sur un système totalement libre -- Il est inutilisable dans le Monde Libre. Bien sûr, nous pouvons distribuer le programme et en avoir des copies sur nos machines, mais cela ne sert pas à grand chose s'il ne s'exécute pas. Ce programme est un logiciel libre, mais il est en fait entravé par des dépendances non-libres.
Ce problème peut se produire avec n'importe quel type de logiciel, n'importe quel langage. Par exemple, un programme libre qui ne fonctionne que sous Microsoft Windows est parfaitement inutilisable dans le Monde Libre. Mais des logiciels qui tourne sous GNU/Linux peuvent aussi être inutilisable lorsqu'ils dépendent d'autres logiciels non-libres. Par le passé, Motif (avant que nous ayons LessTif) et Qt (avant que ses développeurs n'en fassent un logiciel libre) étaient les causes principales de ce problème. La plupart des cartes vidéo 3D ne fonctionnent pleinement qu'avec des pilotes non-libres, ceci pose également un problème. Mais en ce moment, la cause principale de ce problème est Java, parce que certaines personnes qui écrivent des logiciels libres pense que le langage Java est sexy. Aveuglés par leur attrait du langage, ils sous-estiment le problème des dépendances et tombent dans le Piège Java.
L'implémentation Java de Sun est non-libre. Blackdown est aussi non-libre; c'est une adaptation du code propriétaire de Sun. Les bibliothèques de base de Java sont non-libres aussi. Bien sûr, nous disposons d'implémentations libres de Java, comme le compilateur GNU pour Java (GCJ) et GNU Classpath, mais ils ne supportent pas encore toutes les fonctionnalités. Nous sommes encore en train de rattraper le retard.
Si vous développez un programme Java sur la plate-forme Java de Sun, vous êtes voués à utiliser des fonctionnalités Sun exclusives sans même vous en rendre compte. Vous pourriez les avoir utilisées pendant des mois avant même de vous en rendre compte et reprendre la tâche pourrait prendre plus de mois encore. Vous pourriez vous dire, «Recommencer demande trop de travail». Alors votre programme sera tombé dans le Piège Java; il sera inutilisable dans le Monde Libre.
Le truc fiable pour éviter le Piège Java est de n'avoir qu'une implémentation libre de Java sur votre système. Ainsi, si vous utilisez une fonctionnalité ou une bibliothèque que le logiciel libre ne supporte pas encore, vous vous en rendrez compte immédiatement, et vous pourrez réécrire ce code tout de suite.
Sun continue de créer des bibliothèques «de base» supplémentaires, et presque toutes celles-ci sont non-libres; dans bien des cas, même les spécifications de la bibliothèque sont des secrets commerciaux. De plus la dernière licence de Sun concernant ces spécifications interdit la publication d'une mise en œuvre partielle de ces spécifications. (Voir par exemple http://jcp.org/aboutJava/communityprocess/JSPA2.pdf et http://jcp.org/aboutJava/communityprocess/final/jsr129/j2me_pb-1_0-fr-spec-license.html).
Heureusement, la licence de ces spécifications permet d'en publier une mise en œuvre en logiciel libre; ceux qui recevraient une telle bibliothèque peuvent être autorisés à la modifier et ne sont pas tenus d'en suivre les spécifications. Mais cette clause a pour effet d'interdire l'utilisation d'un modèle de développement collaboratif pour produire cette mise en œuvre libre. L'utilisation d'un tel modèle impliquerait la parution de versions incomplètes, ce qui est interdit aux personnes ayant lu les spécifications.
Aux premiers jours du Mouvement du logiciel libre, il était impossible de ne pas dépendre de programme non-libres. Avant que nous ne disposions du compilateur GNU C, tous les programmes C (qu'il fussent libres ou non) dépendaient d'un compilateur C non-libre. Avant que nous ne disposions de la bibliothèque GNU C, tous les programmes dépendaient d'une bibliothèque C non-libre. Avant que nous ne disposions de Linux, le premier noyau libre, tous les programmes dépendaient d'un noyau non-libre. Avant que nous ne disposions de Bash, chaque script shell devait être exécuté par un interpréteur non-libre. Il était inévitable que nos premiers programmes soient initialement sous le joug de ces dépendances, mais ceci était acceptable car leur sauvetage ultérieur faisait partie de notre plan. Notre objectif global, un système d'exploitation autonome, comprenait des remplacements libres à toutes ces dépendances; si nous atteignions ce but, tous nos programmes seraient sauvés. Et c'est ce qui se produisit : avec le système GNU/Linux, nous pouvons à présent exécuter ces programmes sur des plates-formes libres.
La situation est différente aujourd'hui. Nous disposons à présent de systèmes d'exploitation puissant et de nombreux d'outils de programmation libres. Quelle que soit la tâche que vous ayez à exécuter, vous pouvez le faire sur une plate-forme libre; il n'est plus nécessaire, même temporairement, d'accepter des dépendances non-libres. À ce jour, la raison principale pour laquelle les gens tombent dans le piège, est que cela ne leur vient pas à l'esprit. La plus simple des solutions concernant le Piège Java est d'apprendre au gens à ne pas tomber dedans.
Afin de protéger votre code Java du Piège Java, installez un environnement de développement Java libre et utilisez-le. De façon générale, quel que soit le langage que vous utilisiez, ouvrez l'œil, et assurez-vous du statut libre des programmes dont dépend le code de vos programmes. La façon la plus simple de vérifier si ce programme est libre est de s'assurer qu'il possède une entrée dans le Répertoire des logiciels libres (http://www.fsf.org/directory). Si un programme n'est pas dans ce répertoire, vous pouvez vérifier si la licence qui l'accompagne est dans la liste des licences de logiciels libres (http://www.gnu.org/licenses/license-list.fr.html).
Nous sommes en train d'essayer de sauver les programmes Java piégés, alors si vous aimez le langage Java, nous vous invitons à nous aider à développer GNU Classpath. Vous pouvez aussi aider en essayant vos programmes avec le compilateur GCJ et GNU Classpath. Toutefois, cela prendra du temps pour terminer GNU Classpath; si d'autres bibliothèques non-libres continuent à y être ajoutées, il se peut que nous n'ayons jamais les plus récentes. Alors s'il vous plaît, ne placez pas d'entraves sur vos logiciels libres. Faites en sorte que l'application que vous écrivez en ce moment soit conçue pour fonctionner dans un environnement libre dès le départ.