Ελεύθερο αλλά δεσμευμένο - η παγίδα της 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 για την πλατφόρμα Java της Sun, είστε εκτεθειμένοι στο να χρησιμοποιήσετε χαρακτηριστικά γνωρίσματα χρήσης της Sun χωρίς καν να το αντιληφθείτε. Τη στιγμή που θα το ανακαλύψετε, μπορεί να τα χρησιμοποιούσατε για μήνες, και η επανασυγγραφή των έργων σας θα μπορούσε να πάρει ακόμη περισσότερους μήνες. Πιθανότατα θα πείτε, “είναι πάρα πολλή δουλειά για να ξεκινήσω ξανά από την αρχή.” Έτσι το πρόγραμμά σας θα έχει πέσει στην παγίδα της Java. Θα είναι ακατάλληλο προς χρήση στον Ελεύθερο Κόσμο.
Ο αξιόπιστος τρόπος ώστε να αποφευχθεί η παγίδα της Java είναι να έχετε μόνο μια ελεύθερη υλοποίηση της Java στο σύστημά σας. Κατόπιν εάν χρησιμοποιήσετε ένα χαρακτηριστικό γνώρισμα ή μια βιβλιοθήκη της Java που το ελεύθερο λογισμικό δεν υποστηρίζει ακόμα, θα το ανακαλύψετε αμέσως, και μπορείτε να ξαναγράψετε αυτό τον κώδικα άμεσα.
Η Sun συνεχίζει να αναπτύσσει τις πρόσθετες “τυποποιημένες” βιβλιοθήκες της Java, και σχεδόν όλες τους είναι μη-ελεύθερες. Σε πολλές περιπτώσεις, ακόμη και η προδιαγραφή μιας βιβλιοθήκης είναι ένα εμπορικό μυστικό, και η πιο πρόσφατη άδεια της Sun για αυτές τις προδιαγραφές απαγορεύει τη δημοσίευση (release) οτιδήποτε λιγότερου από μια πλήρη υλοποίηση της προδιαγραφής. (Δείτε τη Συμφωνία Συμμετοχής στην Προδιαγραφή της Java και τη J2ME™ Προδιαγραφή Προφίλ Προσωπικής Βάσης, για παραδείγματα.)
Ευτυχώς, αυτή η προδιαγραφή της άδειας (της Sun) επιτρέπει τη δημοσίευση μία υλοποίησης ως ελεύθερο λογισμικό. Δηλαδή άλλοι χρήστες της βιβλιοθήκης επιτρέπεται να την αλλάξουν δίχως να απαιτείται να προσθέσουν τις αλλαγές τους στην προδιαγραφή. Όμως οι απαιτήσεις της έχουν ως αποτέλεσμα η δημιουργία ενός συνεργατικού μοντέλου ανάπτυξης και η δημιουργία μίας ελεύθερης υλοποίησης να είναι απαγορευτική. Η χρήση αυτού του μοντέλου συνεπάγεται την δημοσίευση ελλιπών εκδόσεων, στις οποίες όσοι έχουν διαβάσει την προδιαγραφή (της Sun) δεν επιτρέπεται να συμμετάσχουν.
Στις αρχές του κινήματος ελεύθερου λογισμικού, ήταν αδύνατο να αποφευχθεί η εξάρτηση από μη-ελεύθερα προγράμματα. Πριν αποκτήσουμε τον μεταγλωττιστή GNU C, κάθε πρόγραμμα C (ελεύθερο ή όχι) είχε εξάρτηση από έναν μη-ελεύθερο μεταγλωττιστή C. Πριν αποκτήσουμε τη βιβλιοθήκη GNU C, κάθε πρόγραμμα είχε εξάρτηση από μια μη-ελεύθερη βιβλιοθήκη C. Πριν αποκτήσουμε το Linux, τον πρώτο ελεύθερο πυρήνα, κάθε πρόγραμμα είχε εξάρτηση από έναν μη-ελεύθερο πυρήνα. Πριν αποκτήσουμε το BASH, κάθε κώδικας κελύφους (shell script) έπρεπε να ερμηνευθεί από ένα μη-ελεύθερο κέλυφος. Ήταν αναπόφευκτο ότι τα πρώτα προγράμματά μας θα παρακωλύονταν αρχικά από αυτές τις εξαρτήσεις, αλλά το δεχτήκαμε επειδή το σχέδιό μας συμπεριλάμβανε να τα διασώσει στη συνέχεια. Ο συνολικός στόχος μας, ένα αυτο-φιλοξενούμενο λειτουργικό σύστημα GNU, συμπεριλάμβανε ελεύθερες αντικαταστάσεις για όλες εκείνες τις εξαρτήσεις· εάν πετυχαίναμε το στόχο, όλα τα προγράμματά μας θα διασώζονταν. Έτσι κι έγινε: με το σύστημα GNU/Linux, μπορούμε τώρα να εκτελέσουμε αυτά τα προγράμματα σε ελεύθερες πλατφόρμες.
Η κατάσταση σήμερα είναι διαφορετική. Πλέον έχουμε ισχυρά ελεύθερα λειτουργικά συστήματα και πολλά ελεύθερα εργαλεία προγραμματισμού. Οποιαδήποτε εργασία κι αν θέλετε να κάνετε, μπορείτε να την κάνετε σε μια ελεύθερη πλατφόρμα. Δεν υπάρχει καμία ανάγκη να γίνει αποδεκτή μια μη-ελεύθερη εξάρτηση ακόμα και προσωρινά. Ο κύριος λόγος της πτώσης των ανθρώπων στην παγίδα της Java σήμερα είναι επειδή δεν το σκέφτονται. Η ευκολότερη λύση στο πρόβλημα είναι να διδαχθούν οι άνθρωποι να το αναγνωρίζουν ώστε να μην πέφτουν σε αυτήν.
Για να κρατήσετε τον Java κώδικά σας ασφαλή από την παγίδα της Java, εγκαταστήστε ένα ελεύθερο περιβάλλον ανάπτυξης της Java και χρησιμοποιήστε το. Γενικότερα, οποιαδήποτε γλώσσα κι αν χρησιμοποιείτε, κρατήστε τα μάτια σας ανοικτά, και ελέγξτε την ελεύθερη κατάσταση των προγραμμάτων από τα οποία εξαρτάται ο κώδικάς σας. Ο ευκολότερος τρόπος να εξακριβωθεί ότι κάποιο πρόγραμμα είναι ελεύθερο είναι αναζητώντας το στον Κατάλογο Ελεύθερου Λογισμικού. Εάν ένα πρόγραμμα δεν είναι στον κατάλογο, μπορείτε να ελέγξετε την(τις) άδειά(ές) του σε σχέση με την λίστα αδειών ελεύθερου λογισμικού.
Προσπαθούμε να διασώσουμε τα παγιδευμένα προγράμματα της Java, έτσι εάν συμπαθείτε τη γλώσσα Java, σας προσκαλούμε να βοηθήσετε στην ανάπτυξη του GNU Classpath. Δοκιμάζοντας τα προγράμματά σας με το μεταγλωττιστή GCJ και το GNU Classpath, και εκθέτοντας οποιαδήποτε προβλήματα αντιμετωπίζετε στις κλάσεις που υλοποιήθηκαν ήδη, γίνεστε χρήσιμοι. Εντούτοις, η ολοκλήρωση του GNU Classpath θα πάρει χρόνο. Εάν περισσότερες ανελεύθερες βιβλιοθήκες συνεχίζουν να προστίθενται, ίσως να μην μπορέσουμε να τις έχουμε ποτέ όλες. Για αυτό παρακαλούμε μην βάλετε το ελεύθερο λογισμικό σας σε δεσμούς. Όταν γράφετε ένα πρόγραμμα εφαρμογών σήμερα, γράψτε το ώστε να εκτελείται σε ελεύθερες πλατφόρμες εξ' αρχής.