Ελεύθερο αλλά δεσμευμένο - η παγίδα της Java
από τον Richard StallmanΥποσημείωση
Από τότε που αυτό το άρθρο δημοσιεύτηκε για πρώτη φορά, η Sun (τώρα τμήμα της Oracle) έχει επαναδειοδοτήσει το μεγαλύτερο μέρος της δικής της υλοποίησης αναφοράς της πλατφόρμας Java υπό την GNU Γενική Άδεια Δημόσιας Χρήσης, κι υπάρχει τώρα ένα ελεύθερο περιβάλλον ανάπτυξης για Java. Επομένως, η γλώσσα Java ως έχει δεν είναι πια μία παγίδα.
Πρέπει να είστε προσεκτικοί ωστόσο, επειδή δεν είναι κάθε πλατφόρμα Java ελεύθερη. Η Sun εξακολουθεί να διανέμει μια εκτελέσιμη πλατφόρμα Java που είναι μη-ελεύθερη, και άλλες εταιρείες το κάνουν επίσης.
Το ελεύθερο περιβάλλον ανάπτυξης για Java ονομάζεται IcedTea· ο πηγαίος κώδικας που ελευθέρωσε η Sun περιλαμβάνεται σε αυτό. Έτσι, αυτό είναι το μοναδικό που θα έπρεπε να χρησιμοποιείτε. Πολλές διανομές GNU/Linux έρχονται με το IcedTea, αλλά μερικές περιλαμβάνουν μη-ελεύθερες πλατφόρμες Java. (Σημείωση, προστέθηκε στις 10/2015): Η ελεύθερη υλοποίηση της Java είναι γνωστή ως OpenJDK σε πολλές διανομές GNU/Linux.)
Για να εξασφαλίσετε με αξιοπιστία ότι τα Java προγράμματά σας τρέχουν χωρίς προβλήματα σε ένα ελεύθερο περιβάλλον, πρέπει να τα αναπτύξετε χρησιμοποιώντας το IcedTea. Θεωρητικά οι πλατφόρμες Java πρέπει να είναι συμβατές, αλλά δεν είναι 100 τοις εκατό συμβατές.
Επιπλέον, υπάρχουν μη-ελεύθερα προγράμματα με το “Java” στο όνομά τους, όπως το JavaFX, και υπάρχουν και μη-ελεύθερα πακέτα Java που μπορεί να τα βρίσκετε δελεαστικά, αλλά θα χρειαστεί να τα απορρίψετε. Γι αυτό, ελέγχετε τις άδειες οποιουδήποτε πακέτου σκοπεύετε να χρησιμοποιήσετε. Αν χρησιμοποιείτε το Swing, εξασφαλίστε ότι χρησιμοποιείτε την ελεύθερη έκδοση, που έρχεται με το IcedTea. (Σημείωση, προστέθηκε στις 10/2015: Μια ελεύθερη αντικατάσταση για το JavaFX ονομαζόμενη OpenJFX έχει δημοσιευθεί.)
Πέρα από εκείνα τα ειδικά για τη Java, το γενικό ζήτημα που περιγράφεται εδώ παραμένει σημαντικό, επειδή οποιαδήποτε μη-ελεύθερη βιβλιοθήκη η πλατφόρμα προγραμματισμού μπορεί να προκαλέσει παρόμοια προβλήματα. Πρέπει να πάρουμε το μάθημα μας από την ιστορία της Java, ώστε να αποφύγουμε ενδεχόμενες μελλοντικές παγίδες.
Παρακαλούμε δείτε επίσης: Η παγίδα της JavaScript.
12 Απριλίου, 2004
Εάν το πρόγραμμά σας είναι ελεύθερο λογισμικό, είναι γενικά ηθικό—αλλά υπάρχει μια παγίδα για την οποία πρέπει να είστε σε ετοιμότητα. Το πρόγραμμά σας, αν και είναι ελεύθερο, μπορεί να περιοριστεί από το ανελεύθερο λογισμικό από το οποίο εξαρτάται. Δεδομένου ότι αυτό το πρόβλημα είναι το πιο σοβαρό σήμερα για τα προγράμματα της Java, το καλούμε η παγίδα της Java.
Ένα πρόγραμμα είναι ελεύθερο λογισμικό εάν οι χρήστες του έχουν ορισμένες κρίσιμες ελευθερίες. Χοντρικά, αυτές είναι: η ελευθερία εκτέλεσης του προγράμματος, η ελευθερία μελέτης και μεταβολής του πηγαίου κώδικα, η ελευθερία επαναδιανομής του πηγαίου κώδικα και των εκτελέσιμων αρχείων, και η ελευθερία δημοσίευσης βελτιωμένων εκδόσεων. (Δείτε Ορισμός του Ελεύθερου Λογισμικού.) Εάν οποιοδήποτε πρόγραμμα σε πηγαίο κώδικα είναι ελεύθερο λογισμικό, εξαρτάται αποκλειστικά από το περιεχόμενο της άδειας χρήσεώς του.
Το εάν όμως το συγκεκριμένο πρόγραμμα μπορεί να χρησιμοποιηθεί στον Ελεύθερο Κόσμο, από τους ανθρώπους που θέλουν να ζουν με ελευθερία, είναι μια πιο σύνθετη ερώτηση. Αυτό δεν καθορίζεται από την άδεια χρήσεως του προγράμματος, επειδή κανένα πρόγραμμα δεν λειτουργεί μεμονωμένα. Κάθε πρόγραμμα εξαρτάται από άλλα προγράμματα. Παραδείγματος χάριν, ένα πρόγραμμα πρέπει να μεταγλωττιστεί ή να διερμηνευτεί, άρα εξαρτάται από έναν μεταγλωττιστή ή έναν διερμηνέα. Εάν μεταγλωττίζεται σε κώδικα χαρακτήρων (byte code), εξαρτάται από έναν διερμηνέα κώδικα χαρακτήρων. Επιπλέον, χρειάζεται βιβλιοθήκες προκειμένου να εκτελεστεί, και μπορεί επίσης να απαιτεί και άλλα χωριστά προγράμματα που τρέχουν σε άλλες διαδικασίες. Όλα αυτά τα προγράμματα είναι εξαρτήσεις. Οι εξαρτήσεις μπορεί να είναι απαραίτητες για να μπορεί να εκτελεστεί το πρόγραμμα, ή μπορούν να είναι απαραίτητες μόνο για ορισμένα χαρακτηριστικά του γνωρίσματα. Σε κάθε περίπτωση, σύνολο ή μέρος του προγράμματος δεν μπορεί να λειτουργήσει χωρίς τις εξαρτήσεις.
Εάν μερικές από τις εξαρτήσεις ενός προγράμματος είναι ανελεύθερες, αυτό σημαίνει ότι σύνολο ή μέρος του προγράμματος είναι ανίκανο να εκτελεστεί σε ένα εξ ολοκλήρου ελεύθερο σύστημα—είναι ακατάλληλο προς χρήση για τον Ελεύθερο Κόσμο. Βέβαια, θα μπορούσαμε να επαναδημοσιοποιήσουμε το πρόγραμμα και να έχουμε αντίγραφα για τις μηχανές μας, αλλά θα ήταν άχρηστο εάν δεν μπορούσε να εκτελεστεί. Αυτό το πρόγραμμα είναι μεν ελεύθερο λογισμικό, αλλά χάνει την αποτελεσματικότητα του από τις ανελεύθερες εξαρτήσεις του.
Το πρόβλημα αυτό μπορεί να εμφανιστεί σε οποιοδήποτε είδος λογισμικού, σε οποιαδήποτε γλώσσα προγραμματισμού. Παραδείγματος χάριν, ένα ελεύθερο πρόγραμμα που τρέχει μόνο στα Microsoft Windows είναι σαφώς άχρηστο για τον Ελεύθερο Κόσμο. Το λογισμικό που τρέχει στο GNU/Linux μπορεί επίσης να είναι άχρηστο εάν εξαρτάται από άλλο ανελεύθερο λογισμικό. Στο παρελθόν, το Motif (πριν τη δημιουργία του LessTif) και το QT (πριν οι κατασκευαστές του το μετατρέψουν σε ελεύθερο) ήταν σημαντικές αιτίες αυτού του προβλήματος. Οι περισσότερες τρισδιάστατες κάρτες οθόνης (γραφικών) λειτουργούν πλήρως μόνο με ανελεύθερους οδηγούς, οι οποίοι προκαλούν επίσης το ίδιο πρόβλημα. Αλλά η σημαντικότερη πηγή αυτού του προβλήματος είναι σήμερα η Java, επειδή οι άνθρωποι που γράφουν ελεύθερο λογισμικό αισθάνονται συχνά ότι η Java είναι ελκυστική. Τυφλοί από την έλξη τους στη γλώσσα, αγνοούν το ζήτημα των εξαρτήσεων, και πέφτουν στην παγίδα της Java.
Η υλοποίηση της Java από τη Sun είναι μη-ελεύθερη. Οι τυποποιημένες βιβλιοθήκες της Java είναι επίσης μη-ελεύθερες. Εμείς έχουμε ελεύθερες υλοποιήσεις της Java, όπως ο μεταγλωττιστής GNU για τη Java (GCJ) και το GNU Classpath, αλλά δεν υποστηρίζουν όλα τα χαρακτηριστικά γνωρίσματα ακόμα. Ακόμη προσπαθούμε να προλάβουμε.
Εάν αναπτύσσετε ένα πρόγραμμα της Java για την πλατφόρμα της Sun, είστε εκτεθειμένοι στο να χρησιμοποιήσετε χαρακτηριστικά γνωρίσματα χρήσης της Sun χωρίς καν να το αντιληφθείτε. Τη στιγμή που θα το ανακαλύψετε, μπορεί να τα χρησιμοποιούσατε για μήνες, και η επανασυγγραφή των έργων σας θα μπορούσε να πάρει ακόμη περισσότερους μήνες. Πιθανότατα θα πείτε, “είναι πάρα πολλή δουλειά για να ξεκινήσω ξανά από την αρχή.” Έτσι το πρόγραμμά σας θα έχει πέσει στην παγίδα της Java. Θα είναι ακατάλληλο προς χρήση στον Ελεύθερο Κόσμο.
Ο αξιόπιστος τρόπος ώστε να αποφευχθεί η παγίδα της Java είναι να έχετε μόνο μια ελεύθερη υλοποίηση της Java στο σύστημά σας. Κατόπιν εάν χρησιμοποιήσετε ένα χαρακτηριστικό γνώρισμα ή μια βιβλιοθήκη της Java που το ελεύθερο λογισμικό δεν υποστηρίζει ακόμα, θα το ανακαλύψετε αμέσως, και μπορείτε να ξαναγράψετε αυτό τον κώδικα άμεσα.
Η Sun συνεχίζει να αναπτύσσει τις πρόσθετες “τυποποιημένες” βιβλιοθήκες της Java, και σχεδόν όλες τους είναι μη-ελεύθερες. Σε πολλές περιπτώσεις, ακόμη και η προδιαγραφή μιας βιβλιοθήκης είναι ένα εμπορικό μυστικό, και η πιο πρόσφατη άδεια της Sun για αυτές τις προδιαγραφές απαγορεύει τη δημοσίευση (release) οτιδήποτε λιγότερου από μια πλήρη υλοποίηση της προδιαγραφής. (Δείτε τη Συμφωνία Συμμετοχής στην Προδιαγραφή της Java και τη J2ME™ Προδιαγραφή Προφίλ Προσωπικής Βάσης, για παραδείγματα.)
Ευτυχώς, αυτή η προδιαγραφή της άδειας (της Sun) επιτρέπει τη δημοσίευση μία υλοποίησης ως ελεύθερο λογισμικό. Δηλαδή άλλοι χρήστες της βιβλιοθήκης επιτρέπεται να την αλλάξουν δίχως να απαιτείται να προσθέσουν τις αλλαγές τους στην προδιαγραφή. Όμως οι απαιτήσεις της έχουν ως αποτέλεσμα η δημιουργία ενός συνεργατικού μοντέλου ανάπτυξης και η δημιουργία μίας ελεύθερης υλοποίησης να είναι απαγορευτική. Η χρήση αυτού του μοντέλου συνεπάγεται την δημοσίευση ελλιπών εκδόσεων, στις οποίες όσοι έχουν διαβάσει την προδιαγραφή (της Sun) δεν επιτρέπεται να συμμετάσχουν.
Στις αρχές του κινήματος ελεύθερου λογισμικού, ήταν αδύνατο να αποφευχθεί η εξάρτηση από μη-ελεύθερα προγράμματα. Πριν αποκτήσουμε τον μεταγλωττιστή GNU C, κάθε πρόγραμμα C (ελεύθερο ή όχι) είχε εξάρτηση από έναν μη-ελεύθερο μεταγλωττιστή C. Πριν αποκτήσουμε τη βιβλιοθήκη GNU C, κάθε πρόγραμμα είχε εξάρτηση από μια μη-ελεύθερη βιβλιοθήκη C. Πριν αποκτήσουμε τον Linux, τον πρώτο ελεύθερο πυρήνα, κάθε πρόγραμμα είχε εξάρτηση από έναν μη-ελεύθερο πυρήνα. Πριν αποκτήσουμε το BASH, κάθε κώδικας κελύφους (shellscript) έπρεπε να ερμηνευθεί από ένα μη-ελεύθερο κέλυφος. Ήταν αναπόφευκτο ότι τα πρώτα προγράμματά μας θα παρακωλύονταν αρχικά από αυτές τις εξαρτήσεις, αλλά το δεχτήκαμε επειδή το σχέδιό μας συμπεριλάμβανε να τα διασώσει στη συνέχεια. Ο γενικός στόχος μας, ένα αυτό-φιλόξενο λειτουργικό σύστημα GNU, συμπεριλαμβανομένων τις ελεύθερες αντικαταστάσεις για όλες εκείνες τις εξαρτήσεις. Εάν πετυχαίναμε το στόχο, όλα τα προγράμματά μας θα διασώζονταν. Έτσι κι έγινε: με το σύστημα GNU/Linux, μπορούμε τώρα να εκτελέσουμε αυτά τα προγράμματα σε ελεύθερες πλατφόρμες.
Η κατάσταση σήμερα είναι διαφορετική. Πλέον έχουμε ισχυρά ελεύθερα λειτουργικά συστήματα και πολλά ελεύθερα εργαλεία προγραμματισμού. Οποιαδήποτε εργασία κι αν θέλετε να κάνετε, μπορείτε να την κάνετε σε μια ελεύθερη πλατφόρμα. Δεν υπάρχει καμία ανάγκη να γίνει αποδεκτή μια μη-ελεύθερες εξάρτηση ακόμα και προσωρινά. Ο κύριος λόγος της πτώσης των ανθρώπων στην παγίδα της Java σήμερα είναι επειδή δεν το σκέφτονται. Η ευκολότερη λύση στο πρόβλημα της παγίδας της Java είναι να διδαχθούν οι άνθρωποι ώστε να μην πέφτουν σε αυτήν.
Για να κρατήσετε τον κώδικα σας γραμμένο σε Java μακριά από την παγίδα της, εγκαταστήστε ένα ελεύθερο περιβάλλον ανάπτυξης της Java και χρησιμοποιήστε το. Γενικότερα, οποιαδήποτε γλώσσα κι αν χρησιμοποιείτε, κρατήστε τα μάτια σας ανοικτά, και ελέγξτε την ελεύθερη κατάσταση των προγραμμάτων από τα οποία εξαρτάται ο κώδικάς σας. Ο ευκολότερος τρόπος να εξακριβωθεί ότι κάποιο πρόγραμμα είναι ελεύθερο είναι με έρευνα για την ύπαρξή του στον Κατάλογο Ελεύθερου Λογισμικού. Εάν ένα πρόγραμμα δεν είναι στον κατάλογο, μπορείτε να ελέγξετε την(τις) άδειά(ές) του σε σχέση με την λίστα αδειών ελεύθερου λογισμικού.
Προσπαθούμε να διασώσουμε τα παγιδευμένα προγράμματα της Java, έτσι εάν συμπαθείτε τη γλώσσα Java, σας προσκαλούμε να βοηθήσετε στην ανάπτυξη του GNU Classpath. Δοκιμάζοντας τα προγράμματά σας με το μεταγλωττιστή GCJ και το GNU Classpath, και εκθέτοντας οποιαδήποτε προβλήματα αντιμετωπίζετε στις κλάσεις που υλοποιήθηκαν ήδη, γίνεστε χρήσιμοι. Εντούτοις, η ολοκλήρωση του GNU Classpath θα πάρει χρόνο. Εάν περισσότερες ανελεύθερες βιβλιοθήκες συνεχίζουν να προστίθενται, ίσως να μην μπορέσουμε να τις έχουμε ποτέ όλες. Για αυτό παρακαλούμε μην βάλετε το ελεύθερο λογισμικό σας σε δεσμούς. Όταν γράφετε ένα πρόγραμμα εφαρμογών σήμερα, γράψτε το ώστε να εκτελείται σε ελεύθερες πλατφόρμες εξ' αρχής.