Questa è la traduzione di una pagina scritta originariamente in lingua inglese.
Il gruppo dei traduttori italiani cerca nuovi volontari: visitate la pagina del gruppo per ulteriori informazioni.

Libero ma incatenato - La trappola Java

Nota

Dalla prima pubblicazione di questo articolo le cose sono cambiate: Sun (ora parte di Oracle) ha rilasciato sotto licenza GNU GPL la maggior parte del suo codice sorgente per la piattaforma Java, ed ora esiste un ambiente di sviluppo Java libero. Quindi il linguaggio Java in sé non è più una trappola.

Tuttavia bisogna prestare attenzione quando lo si usa, perché non tutte le piattaforme Java sono libere. Sun continua a distribuire una piattaforma Java in forma binaria che non è software libero, e così fanno anche altri.

L'ambiente Java libero si chiama IcedTea e comprende il codice sorgente rilasciato da Sun. Dovete quindi usare IcedTea, che è incluso in molte distribuzioni GNU/Linux, anche se alcune includono anche piattaforme Java non libere. (Nota di ottobre 2015: in molte distribuzioni GNU/Linux questa implementazione libera di Java è denominata OpenJDK).

Per essere certi che i vostri programmi Java si possano utilizzare correttamente un un ambiente libero, dovete svilupparli con IcedTea. In teoria le piattaforme Java dovrebbero essere compatibili fra loro, ma la compatibilità non è perfetta al 100%.

Inoltre ci sono molti programmi non liberi con “Java” nel nome, some JavaFX, e ci sono pacchetti Java non liberi che possono sembrare comodi ma che sono da rifiutare. Quindi dovete controllare la licenza di qualsiasi pacchetto vogliate usare. Se usate Swing, accertatevi di usare la versione libera, che è inclusa in IcedTea. (Nota di ottobre 2015: è ora disponibile un sostituto libero di JavaFX che si chiama OpenJFX).

A parte il caso specifico di Java, il problema generale qui descritto rimane importante, perché qualsiasi libreria o piattaforma di sviluppo non libera può creare problemi simili. La storia di Java ci deve servire di lezione per evitare trappole simili in futuro.

Vedere anche: La trappola JavaScript.


12 aprile 2004

Se un vostro programma è software libero è, in linea di principio, accettabile, ma c'è una trappola a cui dovete stare attenti. Il vostro programma, benché libero di per sé, può subire restrizioni a causa di software non libero da cui dipende. Dato che l'esempio classico di questo problema è oggi quello dei programmi Java, diamo a questo problema il nome di “trappola Java”.

Un programma è software libero se i suoi utenti hanno alcune libertà cruciali. Per farla breve, intendiamo: la libertà di eseguire il programma, la libertà di studiare e modificare il codice sorgente, la libertà di redistribuire il codice sorgente e il programma in formato binario, e la libertà di pubblicare versioni migliorate. (Si veda la definizione di software libero). È esclusivamente la licenza a determinare se uno specifico programma, fornito in forma di codice sorgente, sia o meno software libero.

È tutto un altro problema, invece, determinare se il programma possa essere usato nel Mondo Libero, da persone intenzionate a vivere nella libertà. Questo non è determinato dalla sola licenza del programma, perché nessun programma funziona da solo: ogni programma dipende da altri programmi. Ad esempio, un programma deve essere compilato o interpretato, perciò dipende da un compilatore o da un interprete; se compilato in bytecode, ha bisogno di un interprete bytecode; inoltre ha bisogno di librerie per essere eseguito, e a sua volta potrebbe chiamare altri programmi che girano in altri processi. Tutti questi programmi si chiamano dipendenze: le dipendenze possono essere indispensabili per l'esecuzione di un programma, oppure possono essere necessarie solo per alcune funzioni. In ogni modo un programma non è pienamente funzionale senza le sue dipendenze.

Se alcune delle dipendenze di un programma non sono libere, quel programma è inutilizzabile in tutto o in parte su sistemi completamente liberi, non è utilizzabile nel Mondo Libero. Certo, potremmo comunque ridistribuirlo e copiarlo sui nostri computer, ma non serve a molto se è impossibile eseguirlo. Quel programma, pur essendo software libero, è di fatto incatenato ai suoi requisiti non liberi.

Questo problema può manifestarsi in ogni tipo di software, in ogni linguaggio. Per esempio un programma che funziona solo su Microsoft Windows è chiaramente inutile nel Mondo Libero. Ma anche il software per GNU/Linux può essere inutile se richiede software non libero: in passato Motif (prima che avessimo LessTif) e Qt (prima che i suoi sviluppatori lo rendessero software libero) hanno causato problemi del genere. Molte schede grafiche 3D funzionano al meglio solo con driver non liberi, altra tipica situazione problematica. Ma la causa principale di questo problema di questi tempi è Java, perché chi scrive software libero spesso trova Java attraente: accecati dalla loro attrazione per questo linguaggio, non badano alla questione dei requisiti e cadono nella trappola Java.

L'implementazione di Java realizzata da Sun non è libera. Anche Blackdown non è libera, è un adattamento di codice proprietario di Sun. E anche le librerie Java standard non sono libere. Implementazioni libere di Java esistono (ad esempio GCJ, il compilatore GNU per Java e GNU Classpath), ma non supportano ancora tutte le caratteristiche; stiamo ancora inseguendo.

Se sviluppate un programma Java sulla piattaforma Java di Sun, potreste finire per usare caratteristiche esclusive di Sun senza nemmeno accorgervene, e prima di scoprirlo potreste averle usate per mesi, al punto che sarebbero necessari mesi per rifare il lavoro. Potreste concludere che è troppo tardi per ricominciare, e a quel punto il vostro programma sarà caduto nella trappola Java: sarà inutilizzabile nel Mondo Libero.

L'unico modo affidabile di evitare la trappola Java è quello di avere esclusivamente un'implementazione libera di Java sul vostro sistema: in questo modo vi accorgerete immediatamente se state usando una libreria o una caratteristica di Java che il software libero ancora non supporta, e potrete riscrivere quel codice subito.

Sun continua a sviluppare nuove librerie aggiuntive Java “standard”, quasi tutte non libere: in molti casi sono un segreto commerciale anche le specifiche di una libreria, e l'ultima licenza di Sun per queste specifiche proibisce di distribuire qualsiasi cosa diversa da una piena implementazione delle specifiche: si vedano, ad esempio, “Java Specification Participation Agreement” e “J2ME™ Personal Basis Profile Specification”.

Per fortuna, quella licenza permette di distribuire un'implementazione come software libero; altri che ricevono la libreria possono essere autorizzati a cambiarla e non devono necessariamente aderire alla specifica. Ma la richiesta ha l'effetto di proibire l'uso di un modello di sviluppo cooperativo per produrre l'implementazione libera. L'uso di quel modello costringerebbe alla pubblicazione di versioni incomplete, cosa che quelli che hanno letto la specifica non possono fare.

Agli albori del movimento del Software Libero era inevitabile dipendere da programmi non liberi. Prima che avessimo il compilatore C GNU, ogni programma in C (libero o no) richiedeva un compilatore C non libero. Prima che avessimo la libreria GNU C, ogni programma dipendeva da una libreria C non libera. Prima che avessimo Linux (il primo kernel libero) ogni programma dipendeva da un kernel non libero. Prima che avessimo BASH, ogni script per shell doveva essere interpretato da una shell non libera. Era inevitabile che i nostri programmi all'inizio avessero queste dipendenze, ma abbiamo accettato questa situazione perché il nostro progetto prevedeva di rimediare in seguito: il nostro obiettivo, un sistema GNU completo, comprendeva alternative libere per tutte quelle dipendenze; una volta raggiunto lo scopo avremmo recuperato tutti i nostri programmi. E così è successo: col sistema GNU/Linux, ora possiamo eseguire tutti questi programmi su piattaforme libere.

Oggi la situazione è diversa: ora abbiamo potenti sistemi operativi liberi e molti strumenti liberi per la programmazione. Qualsiasi cosa vogliate fare, potete farla su una piattaforma libera e non c'è bisogno di accettare una dipendenza non libera, nemmeno provvisoriamente. Il principale motivo per cui alcuni oggi cadono nella trappola è semplicemente che non ci pensano; la soluzione più facile al problema è insegnare alla gente a riconoscere la trappola e a non cascarci.

Per tenere il vostro codice Java al sicuro dalla Trappola Java, installate e usate un ambiente di sviluppo libero per Java. In generale, qualsiasi linguaggio usiate, tenete gli occhi aperti, e accertatevi dello stato libero dei programmi da cui dipende il vostro codice. Il modo più semplice di verificare che un programma è libero è quello di cercarlo nell'Elenco del Software Libero. Se un programma non è in elenco, potete comunque cercare la sua licenza nella lista delle licenze software libere.

Stiamo cercando di salvare i programmi Java intrappolati, quindi se vi piace Java per favore aiutate lo sviluppo di GNU Classpath. E' utile anche provare i vostri programmi con il compilatore GCJ e GNU Classpath, e comunicare gli eventuali problemi che riscontrate nelle classi già implementate. Comunque, ci vorrà tempo per finire GNU Classpath; se continueranno ad essere aggiunte altre librerie non libere, potremmo non avere mai le ultime versioni. Quindi per favore non incatenate il vostro software libero: se scrivete un'applicazione ora, fatelo su fondamenta libere.

Vedere anche:

The Curious Incident of Sun in the Night-Time