Προγραμματισμός

Οι τρεις τύποι φορητότητας της Java

Η Java έχει δημιουργήσει μεγάλο ενθουσιασμό στην κοινότητα προγραμματισμού επειδή υπόσχεται φορητός εφαρμογές και μικροεφαρμογές. Στην πραγματικότητα, η Java παρέχει τρεις διαφορετικούς τύπους φορητότητας: φορητότητα πηγαίου κώδικα, φορητότητα αρχιτεκτονικής CPU και φορητότητα OS / GUI. Το γεγονός ότι υπάρχουν τρεις διαφορετικοί τύποι φορητότητας είναι κρίσιμο, επειδή μόνο ένας από αυτούς τους τύπους αποτελεί απειλή για τη Microsoft. Η Microsoft αναμένεται να υπονομεύσει αυτόν τον τύπο φορητότητας ενώ αγκαλιάζει τους άλλους δύο - ενώ ταυτόχρονα ισχυρίζεται ότι υποστηρίζει Java. Η κατανόηση των τριών τύπων φορητότητας και ο τρόπος με τον οποίο συνεργάζονται είναι ζωτικής σημασίας για την κατανόηση της απειλής για τη Microsoft και τις πιθανές απαντήσεις της Microsoft.

Πριν προχωρήσουμε σε λεπτομέρειες για καθέναν από αυτούς τους τρεις τύπους φορητότητας, ας εξετάσουμε μερικούς βασικούς όρους.

Ορισμός ορισμένων όρων

Οι ακόλουθοι όροι χρησιμοποιούνται σε αυτό το άρθρο:

Ενδιανισμός
Ο Endianism αναφέρεται στη σειρά αποθήκευσης των byte σε μια ποσότητα πολλαπλών byte σε μια δεδομένη CPU. Για παράδειγμα, το μη υπογεγραμμένο σύντομο 256 (δεκαδικό) απαιτεί δύο byte αποθήκευσης: ένα 0x01 και 0x00. Αυτά τα δύο byte μπορούν να αποθηκευτούν με οποιαδήποτε σειρά: 0x01, 0x00 ή 0x00, 0x01. Ο Endianism καθορίζει τη σειρά με την οποία αποθηκεύονται τα δύο byte. Για πρακτικούς σκοπούς, ο ενδιανισμός συνήθως έχει σημασία μόνο όταν οι επεξεργαστές διαφορετικού ενδιανισμού πρέπει να μοιράζονται δεδομένα.
Ιάβα
Η Java είναι πολλές διαφορετικές τεχνολογίες που συνδυάζονται μαζί - τη γλώσσα προγραμματισμού Java, την εικονική μηχανή Java (JVM) και τις βιβλιοθήκες τάξεων που σχετίζονται με τη γλώσσα. Αυτό το άρθρο ασχολείται με όλες αυτές τις πτυχές.
Εικονική μηχανή Java (JVM)

Το JVM είναι μια φανταστική CPU για την οποία οι περισσότεροι μεταγλωττιστές Java εκπέμπουν κώδικα. Η υποστήριξη αυτής της φανταστικής CPU είναι αυτή που επιτρέπει την εκτέλεση προγραμμάτων Java χωρίς να μεταγλωττιστεί εκ νέου σε διαφορετικές CPU. Τίποτα στη γλώσσα προγραμματισμού Java δεν απαιτεί τον πηγαίο κώδικα Java να μεταγλωττιστεί σε κώδικα για το JVM αντί για εγγενή κώδικα αντικειμένου.

Στην πραγματικότητα, η Asymetrix και η Microsoft ανακοίνωσαν μεταγλωττιστές Java που εκπέμπουν εγγενείς εφαρμογές Microsoft Windows. (Για περισσότερες πληροφορίες, ανατρέξτε στην ενότητα Πόροι αυτού του άρθρου.)

Κωδικός J
J-code είναι η έξοδος που εκπέμπουν οι περισσότεροι μεταγλωττιστές Java στα αρχεία κλάσης. Ο κώδικας J μπορεί να θεωρηθεί ως κώδικας αντικειμένου για την εικονική μηχανή Java.
Φορητότητα
Η φορητότητα αναφέρεται στην ικανότητα εκτέλεσης ενός προγράμματος σε διαφορετικά μηχανήματα. Η εκτέλεση ενός δεδομένου προγράμματος σε διαφορετικά μηχανήματα μπορεί να απαιτεί διαφορετικές ποσότητες εργασίας (για παράδειγμα, καμία απολύτως δουλειά, ανακατασκευή ή πραγματοποίηση μικρών αλλαγών στον πηγαίο κώδικα). Όταν οι χρήστες αναφέρονται σε εφαρμογές Java και μικροεφαρμογές ως φορητές, συνήθως σημαίνουν ότι οι εφαρμογές και οι μικροεφαρμογές εκτελούνται σε διαφορετικούς τύπους μηχανημάτων χωρίς αλλαγές (όπως ανασύνθεση ή τροποποιήσεις στον πηγαίο κώδικα).

Τώρα που έχουμε καλύψει ορισμένους βασικούς όρους, θα εξηγήσουμε καθέναν από τους τρεις τύπους φορητότητας Java.

Java ως γλώσσα: φορητότητα πηγαίου κώδικα

Ως γλώσσα προγραμματισμού, η Java παρέχει την απλούστερη και πιο οικεία μορφή φορητότητας - φορητότητα πηγαίου κώδικα. Ένα δεδομένο πρόγραμμα Java πρέπει παράγουν ίδια αποτελέσματα ανεξάρτητα από την υποκείμενη CPU, το λειτουργικό σύστημα ή τον μεταγλωττιστή Java. Αυτή η ιδέα δεν είναι νέα. γλώσσες όπως οι C και C ++ έχουν δώσει την ευκαιρία για αυτό το επίπεδο φορητότητας για πολλά χρόνια. Ωστόσο, οι C και C ++ παρέχουν επίσης πολλές ευκαιρίες για τη δημιουργία μη φορητού κώδικα. Εάν τα προγράμματα που γράφονται στα C και C ++ δεν έχουν σχεδιαστεί για να είναι φορητά από την αρχή, η ικανότητα μετάβασης σε διαφορετικά μηχανήματα είναι πιο θεωρητική από πρακτική. Οι C και C ++ αφήνουν απροσδιόριστες λεπτομέρειες, όπως το μέγεθος και ο ενδανισμός των τύπων ατομικών δεδομένων, η συμπεριφορά των μαθηματικών κυμαινόμενων σημείων, η τιμή των μη αρχικοποιημένων μεταβλητών και η συμπεριφορά κατά την πρόσβαση στη μνήμη που ελευθερώνεται.

Εν ολίγοις, αν και η σύνταξη των C και C ++ είναι καλά καθορισμένη, η σημασιολογία δεν είναι. Αυτή η σημασιολογική χαλαρότητα επιτρέπει σε ένα μπλοκ πηγαίου κώδικα C ή C ++ να μεταγλωττιστεί σε προγράμματα που δίνουν διαφορετικά αποτελέσματα όταν εκτελούνται σε διαφορετικούς επεξεργαστές, λειτουργικά συστήματα, μεταγλωττιστές, ακόμη και σε έναν συνδυασμό μεταγλωττιστή / CPU / OS, ανάλογα με διάφορες ρυθμίσεις μεταγλωττιστή. (Δείτε την πλευρική γραμμή Σύνταξη έναντι σημασιολογίας για μια συζήτηση για τις διαφορές μεταξύ σημασιολογίας και σύνταξης.)

Η Java είναι διαφορετική. Η Java παρέχει πολύ πιο αυστηρή σημασιολογία και αφήνει λιγότερα στον υλοποιητή. Σε αντίθεση με τα C και C ++, η Java έχει καθορισμένα μεγέθη και ενδιανισμό για τους ατομικούς τύπους, καθώς και καθορισμένη συμπεριφορά κυμαινόμενου σημείου.

Επιπλέον, η Java ορίζει περισσότερη συμπεριφορά από τα C και C ++. Στην Java, η μνήμη δεν ελευθερώνεται έως ότου δεν είναι πλέον δυνατή η πρόσβαση και η γλώσσα δεν έχει μη αρχικοποιημένες μεταβλητές. Όλες αυτές οι δυνατότητες συμβάλλουν στη μείωση της διαφοράς στη συμπεριφορά ενός προγράμματος Java από πλατφόρμα σε πλατφόρμα και υλοποίηση έως υλοποίηση. Ακόμη και χωρίς το JVM, τα προγράμματα που είναι γραμμένα στη γλώσσα Java αναμένεται να μεταφερθούν (μετά την επανασυγκέντρωση) σε διαφορετικούς επεξεργαστές και λειτουργικά συστήματα πολύ καλύτερα από τα αντίστοιχα προγράμματα C ή C ++.

Δυστυχώς, τα χαρακτηριστικά που κάνουν την Java τόσο φορητή έχουν μειονέκτημα. Η Java αναλαμβάνει μηχανή 32-bit με 8-bit byte και μαθηματικά IEEE754 floating-point. Μηχανές που δεν ταιριάζουν σε αυτό το μοντέλο, συμπεριλαμβανομένων μικροελεγκτών 8-bit και υπερυπολογιστών Cray, δεν μπορούν να εκτελέσουν αποτελεσματικά την Java. Για αυτόν τον λόγο, θα πρέπει να περιμένουμε ότι τα C και C ++ θα χρησιμοποιούνται σε περισσότερες πλατφόρμες από τη γλώσσα Java. Θα πρέπει επίσης να περιμένουμε ευκολότερη μεταφορά προγραμμάτων Java από το C ή C ++ μεταξύ αυτών των πλατφορμών που υποστηρίζουν και τα δύο.

Java ως εικονική μηχανή: φορητότητα CPU

Οι περισσότεροι μεταγλωττιστές παράγουν κώδικα αντικειμένου που εκτελείται σε μια οικογένεια CPU (για παράδειγμα, η οικογένεια Intel x86). Ακόμη και μεταγλωττιστές που παράγουν κώδικα αντικειμένου για πολλές διαφορετικές οικογένειες CPU (για παράδειγμα, x86, MIPS και SPARC) παράγουν μόνο κωδικό αντικειμένου για έναν τύπο CPU κάθε φορά. Εάν χρειάζεστε κωδικό αντικειμένου για τρεις διαφορετικές οικογένειες CPU, πρέπει να μεταγλωττίσετε τον πηγαίο κώδικα τρεις φορές.

Οι τρέχοντες μεταγλωττιστές Java είναι διαφορετικοί. Αντί να παράγουν έξοδο για κάθε διαφορετική οικογένεια CPU στην οποία πρόκειται να εκτελεστεί το πρόγραμμα Java, οι τρέχοντες μεταγλωττιστές Java παράγουν κώδικα αντικειμένου (που ονομάζεται J-code) για μια CPU που δεν υπάρχει ακόμη.

(Ήλιος έχει ανακοίνωσε έναν επεξεργαστή που θα εκτελέσει απευθείας τον κώδικα J, αλλά δείχνει ότι τα πρώτα δείγματα των τσιπ Java δεν θα εμφανιστούν μέχρι το δεύτερο εξάμηνο του τρέχοντος έτους. Η πλήρης παραγωγή τέτοιων τσιπ θα ξεκινήσει τον επόμενο χρόνο. Η βασική τεχνολογία picoJavaI της Sun Microelectronics θα βρίσκεται στην καρδιά της γραμμής επεξεργαστή microJava της Sun, η οποία θα στοχεύει υπολογιστές δικτύου. Οι κάτοχοι άδειας όπως η LG Semicon, η Toshiba Corp. και η Rockwell Collins Inc. σχεδιάζουν επίσης να παράγουν τσιπ Java με βάση τον πυρήνα picoJavaI.)

Για κάθε πραγματική CPU στην οποία προορίζονται να εκτελούνται προγράμματα Java, ένας διερμηνέας Java ή μια εικονική μηχανή, "εκτελεί" τον κώδικα J. Αυτή η ανύπαρκτη CPU επιτρέπει την εκτέλεση του ίδιου κώδικα αντικειμένου σε οποιαδήποτε CPU για την οποία υπάρχει διερμηνέας Java.

Η παραγωγή εξόδου για μια φανταστική CPU δεν είναι καινούργια με την Java: Οι μεταγλωττιστές του Pascal παρήγαγαν κωδικούς P UCSD (University of California στο Σαν Ντιέγκο) πριν από χρόνια. Η Limbo, μια νέα γλώσσα προγραμματισμού υπό ανάπτυξη της Lucent Technologies, παράγει κώδικα αντικειμένου για μια φανταστική CPU. και η Perl δημιουργεί μια ενδιάμεση αναπαράσταση προγράμματος και εκτελεί αυτήν την ενδιάμεση αναπαράσταση αντί να δημιουργεί εγγενή εκτελέσιμο κώδικα. Το JVM που καταλαβαίνει το Διαδίκτυο ξεχωρίζει από αυτές τις άλλες εικονικές εφαρμογές CPU με σκόπιμο σχεδιασμό ώστε να επιτρέπει τη δημιουργία ενός ασφαλώς ασφαλούς κώδικα χωρίς ιούς. Πριν από το Διαδίκτυο, δεν υπήρχε ανάγκη για εικονικές μηχανές να αποδείξουν ότι τα προγράμματα είναι ασφαλή και χωρίς ιούς. Αυτό το χαρακτηριστικό ασφάλειας, σε συνδυασμό με μια πολύ καλύτερη κατανόηση του τρόπου γρήγορης εκτέλεσης προγραμμάτων για φανταστικούς επεξεργαστές, έχει οδηγήσει σε γρήγορη, ευρεία αποδοχή του JVM. Σήμερα, τα περισσότερα μεγάλα λειτουργικά συστήματα, συμπεριλαμβανομένων των OS / 2, MacOS, Windows 95 / NT και Novell Netware, είτε διαθέτουν, είτε αναμένεται να έχουν, ενσωματωμένη υποστήριξη για προγράμματα J-code.

Το JVM, που είναι ουσιαστικά ένα φανταστικό CPU, είναι ανεξάρτητο από τη γλώσσα του πηγαίου κώδικα. Η γλώσσα Java μπορεί να παράγει κώδικα J. Αλλά και το Ada95. Στην πραγματικότητα, οι διερμηνείς που φιλοξενούνται σε κώδικα J έχουν γραφτεί για πολλές γλώσσες, συμπεριλαμβανομένων των BASIC, Forth, Lisp και Scheme, και είναι σχεδόν βέβαιο ότι οι υλοποιήσεις άλλων γλωσσών θα εκπέμπουν J-code στο μέλλον. Μόλις ο πηγαίος κώδικας μετατραπεί σε κώδικα J, ο διερμηνέας Java δεν μπορεί να πει ποια γλώσσα προγραμματισμού δημιούργησε τον κώδικα J που εκτελεί. Το αποτέλεσμα: φορητότητα μεταξύ διαφορετικών CPU.

Το πλεονέκτημα για τη σύνταξη προγραμμάτων (σε οποιαδήποτε γλώσσα) στον κώδικα J είναι ότι ο ίδιος κώδικας εκτελείται σε διαφορετικές οικογένειες CPU. Το μειονέκτημα είναι ότι ο κώδικας J δεν λειτουργεί τόσο γρήγορα όσο ο εγγενής κώδικας. Για τις περισσότερες εφαρμογές, αυτό δεν θα έχει σημασία, αλλά για τα υψηλότερα προγράμματα υψηλών προδιαγραφών - αυτά που χρειάζονται κάθε τελευταίο ποσοστό της CPU - το κόστος απόδοσης του κώδικα J δεν θα είναι αποδεκτό.

Java ως εικονικό λειτουργικό σύστημα και GUI: φορητότητα λειτουργικού συστήματος

Τα περισσότερα προγράμματα Microsoft Windows που είναι γραμμένα σε C ή C ++ δεν μεταφέρονται εύκολα στα περιβάλλοντα Macintosh ή Unix, ακόμη και μετά την ανασύσταση. Ακόμα κι αν οι προγραμματιστές προσέχουν ιδιαίτερα για να αντιμετωπίσουν τις σημασιολογικές αδυναμίες C ή C ++, η θύρα είναι δύσκολη. Αυτή η δυσκολία παρουσιάζεται ακόμη και όταν πραγματοποιείται η θύρα στο λειτουργικό σύστημα που δεν είναι Windows χωρίς αλλαγή CPU. Γιατί η δυσκολία;

Μετά την εξάλειψη των σημασιολογικών προβλημάτων στα C και C ++ και τα προβλήματα μεταφοράς CPU, οι προγραμματιστές πρέπει ακόμη να αντιμετωπίζουν το διαφορετικό λειτουργικό σύστημα και τις διαφορετικές κλήσεις API GUI.

Τα προγράμματα των Windows πραγματοποιούν πολύ διαφορετικές κλήσεις στο λειτουργικό σύστημα από τα προγράμματα Macintosh και Unix. Αυτές οι κλήσεις είναι ζωτικής σημασίας για τη σύνταξη μη ασήμαντων προγραμμάτων, οπότε μέχρι να αντιμετωπιστεί αυτό το πρόβλημα φορητότητας, η μεταφορά θα παραμείνει δύσκολη.

Η Java επιλύει αυτό το πρόβλημα παρέχοντας ένα σύνολο λειτουργιών βιβλιοθήκης (που περιέχονται σε βιβλιοθήκες που παρέχονται από Java όπως καλά, χρησιμοποιήστε, και lang) που μιλούν σε ένα φανταστικό λειτουργικό σύστημα και ένα φανταστικό GUI. Ακριβώς όπως το JVM παρουσιάζει μια εικονική CPU, οι βιβλιοθήκες Java παρουσιάζουν ένα εικονικό OS / GUI. Κάθε εφαρμογή Java παρέχει βιβλιοθήκες που εφαρμόζουν αυτό το εικονικό λειτουργικό σύστημα / GUI. Προγράμματα Java που χρησιμοποιούν αυτές τις βιβλιοθήκες για να παρέχουν την απαιτούμενη θύρα λειτουργικότητας OS και GUI αρκετά εύκολα.

Η χρήση βιβλιοθήκης φορητότητας αντί για εγγενείς κλήσεις OS / GUI δεν είναι νέα ιδέα. Προϊόντα όπως το Galaxy της Visix Software και ο ψευδάργυρος της Protools Software παρέχουν αυτή τη δυνατότητα για C και C ++. Μια άλλη προσέγγιση, που δεν ακολουθείται από την Java, είναι να επιλέξετε ένα μόνο OS / GUI ως κύριο και να παρέχετε βιβλιοθήκες περιτυλίγματος που υποστηρίζουν αυτό το κύριο OS / GUI σε όλα τα μηχανήματα στα οποία θέλετε να μεταφέρετε. Το πρόβλημα με την κύρια προσέγγιση OS / GUI είναι ότι οι εφαρμογές που μεταφέρονται συχνά φαίνονται ξένες σε άλλα μηχανήματα. Οι χρήστες Macintosh, για παράδειγμα, παραπονέθηκαν για μια πρόσφατη έκδοση του Microsoft Word για Macintosh επειδή έμοιαζαν και συμπεριφέρθηκαν σαν πρόγραμμα Windows, όχι σαν πρόγραμμα Macintosh. Δυστυχώς, η προσέγγιση που ακολουθεί η Java έχει επίσης προβλήματα.

Η Java έχει παράσχει μια λειτουργικότητα με τον λιγότερο κοινό παρονομαστή στις βιβλιοθήκες OS / GUI. Οι δυνατότητες που διατίθενται σε ένα μόνο OS / GUI, όπως τα παράθυρα διαλόγου με καρτέλες, παραλείφθηκαν. Το πλεονέκτημα αυτής της προσέγγισης είναι ότι η χαρτογράφηση της κοινής λειτουργικότητας στο εγγενές OS / GUI είναι αρκετά εύκολη και, με προσοχή, μπορεί να παρέχει εφαρμογές που λειτουργούν όπως αναμένεται στα περισσότερα OS / GUI. Το μειονέκτημα είναι ότι θα υπάρχει διαθέσιμη λειτουργικότητα σε εφαρμογές εγγενούς λειτουργίας που δεν είναι διαθέσιμη σε εφαρμογές Java. Μερικές φορές οι προγραμματιστές θα μπορούν να το επιλύσουν επεκτείνοντας το AWT. άλλες φορές δεν θα. Στις περιπτώσεις όπου η επιθυμητή λειτουργικότητα δεν είναι εφικτή με λύσεις, οι προγραμματιστές πιθανότατα θα επιλέξουν να γράψουν μη φορητό κώδικα.

Ποιος νοιάζεται για τη φορητότητα;

Τρεις κύριες περιφέρειες ενδιαφέρονται για τη φορητότητα: προγραμματιστές, τελικούς χρήστες και τμήματα MIS.

Προγραμματιστές: Οι ευκαιρίες και οι απειλές είναι μεγάλες

Οι προγραμματιστές έχουν έννομο συμφέρον στη δημιουργία φορητού λογισμικού. Από την άλλη πλευρά, το φορητό λογισμικό τους επιτρέπει να υποστηρίζουν περισσότερες πλατφόρμες, γεγονός που οδηγεί σε μεγαλύτερη βάση δυνητικών πελατών. Ωστόσο, η ίδια φορητότητα που επιτρέπει στους προγραμματιστές να στοχεύουν νέες αγορές επιτρέπει επίσης στους ανταγωνιστές να στοχεύουν την αγορά τους.

Με λίγα λόγια, η φορητότητα Java σπρώχνει την αγορά λογισμικού εφαρμογών μακριά από διαχωρισμένες αγορές με βάση τα διάφορα λειτουργικά συστήματα και GUI και προς μια μεγάλη αγορά. Στην τρέχουσα αγορά λογισμικού, για παράδειγμα, η Microsoft είναι μια δύναμη που πρέπει να υπολογιστεί στις αγορές λογισμικού εφαρμογών Windows και Macintosh, αλλά σχεδόν δεν έχει παρουσία στις αγορές OS / 2 και Unix. Αυτή η διαμέριση επιτρέπει στις εταιρείες στο OS / 2 και στις αγορές Unix να αγνοήσουν τη Microsoft ως ανταγωνιστή. Η Java διευκολύνει αυτές τις εταιρείες να ανταγωνίζονται στην αγορά των Windows, αλλά επιτρέπει επίσης στη Microsoft ευκολότερη είσοδο στις αγορές OS / 2 και Unix.

Χρήστες: Οι έμμεσοι δικαιούχοι της φορητότητας

Οι χρήστες δεν ενδιαφέρονται για τη φορητότητα. Εάν η φορητότητα κάνει τη ζωή τους ευκολότερη και πιο ευχάριστη, τότε είναι όλοι για αυτό. αν όχι, δεν είναι. Η φορητότητα έχει κάποια θετικά αποτελέσματα για τους χρήστες, αλλά αυτά είναι κάπως έμμεσα. Τα θετικά αποτελέσματα: