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

Εισαγωγή στη δέσμη ενεργειών σε Java, Μέρος 1

Απόσπασμα από Σενάριο σε Java: Γλώσσες, πλαίσια και μοτίβα.

Από τον Dejan Bosanac

Δημοσιεύθηκε από τον Addison Wesley Professional

ISBN-10: 0-321-32193-6

ISBN-13: 978-0-321-32193-0

Μέχρι πρόσφατα, μόνο οι σκληροπυρηνικοί ήταν ενθουσιασμένοι με το σενάριο στην πλατφόρμα Java, αλλά αυτό ήταν πριν η Sun ενίσχυσε την υποστήριξη του JRE για δυναμικά δακτυλογραφημένες γλώσσες όπως Python, Ruby και JavaScript. Σε αυτό το απόσπασμα δύο μερών από την επικείμενη δέσμη ενεργειών σε Java: Γλώσσες, πλαίσια και μοτίβα (Addison Wesley Professional, Αύγουστος 2007) Ο Dejan Bosanac περιορίζει τι διαφοροποιεί τις περισσότερες γλώσσες σεναρίου από μια γλώσσα προγραμματισμού όπως η Java, και στη συνέχεια εξηγεί γιατί το scripting είναι χρονική προσθήκη στην ικανότητα προγραμματισμού Java.

Εισαγωγή στη δέσμη ενεργειών σε Java: Γλώσσες, πλαίσια και μοτίβα

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

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

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

Στο τέλος αυτού του κεφαλαίου, συζητώ τις διαφορές μεταξύ των γλωσσών σεναρίου και προγραμματισμού συστήματος και πώς αυτές οι διαφορές τις καθιστούν κατάλληλες για ορισμένους ρόλους στην ανάπτυξη.

Ιστορικό

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

Ας ξεκινήσουμε από την αρχή. Οι επεξεργαστές εκτελούν οδηγίες μηχανής, τα οποία λειτουργούν σε δεδομένα είτε στα μητρώα του επεξεργαστή είτε σε εξωτερική μνήμη. Με απλά λόγια, μια εντολή μηχανής αποτελείται από μια ακολουθία δυαδικών ψηφίων (0s και 1s) και είναι συγκεκριμένη για τον συγκεκριμένο επεξεργαστή στον οποίο εκτελείται. Οι οδηγίες του μηχανήματος αποτελούνται από το κωδικός λειτουργίας λέγοντας στον επεξεργαστή ποια λειτουργία πρέπει να εκτελεί και τελεστές αντιπροσωπεύοντας τα δεδομένα στα οποία πρέπει να εκτελεστεί η λειτουργία.

Για παράδειγμα, σκεφτείτε την απλή λειτουργία της προσθήκης μιας τιμής που περιέχεται σε έναν καταχωρητή στην τιμή που περιέχεται σε έναν άλλο. Ας φανταστούμε τώρα έναν απλό επεξεργαστή με ένα σύνολο εντολών 8-bit, όπου τα πρώτα 5 bit αντιπροσωπεύουν τον κωδικό λειτουργίας (ας πούμε, 00111 για προσθήκη αξίας μητρώου) και οι καταχωρητές αντιμετωπίζονται με ένα μοτίβο 3-bit. Μπορούμε να γράψουμε αυτό το απλό παράδειγμα ως εξής:

00111 001 010

Σε αυτό το παράδειγμα, χρησιμοποίησα τα 001 και 010 για να διευθύνω τους καταχωρητές νούμερο ένα και δύο (R1 και R2, αντίστοιχα) του επεξεργαστή.

Αυτή η βασική μέθοδος υπολογιστών ήταν γνωστή εδώ και δεκαετίες και είμαι βέβαιος ότι γνωρίζετε. Διάφορα είδη επεξεργαστών έχουν διαφορετικές στρατηγικές σχετικά με τον τρόπο εμφάνισης των συνόλων οδηγιών τους (αρχιτεκτονική RISC ή CISC), αλλά από την άποψη του προγραμματιστή λογισμικού, το μόνο σημαντικό γεγονός είναι ότι ο επεξεργαστής είναι ικανός να εκτελεί μόνο δυαδικές οδηγίες. Ανεξάρτητα από τη γλώσσα προγραμματισμού που χρησιμοποιείται, η προκύπτουσα εφαρμογή είναι μια ακολουθία οδηγιών του μηχανήματος που εκτελούνται από τον επεξεργαστή.

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

Ένα συγκεκριμένο σύνολο εντολών επεξεργαστή ονομάζεται γλώσσα μηχανής. Οι μηχανικές γλώσσες ταξινομούνται ως γλώσσες προγραμματισμού πρώτης γενιάς. Τα προγράμματα που γράφονται με αυτόν τον τρόπο είναι συνήθως πολύ γρήγορα, επειδή είναι βελτιστοποιημένα για την αρχιτεκτονική του συγκεκριμένου επεξεργαστή. Ωστόσο, παρά το όφελος αυτό, είναι δύσκολο (αν όχι αδύνατο) για τους ανθρώπους να γράφουν μεγάλες και ασφαλείς εφαρμογές σε μηχανολογικές γλώσσες, επειδή οι άνθρωποι δεν είναι καλοί να αντιμετωπίζουν μεγάλες ακολουθίες 0 και 1 δευτερολέπτων.

Σε μια προσπάθεια επίλυσης αυτού του προβλήματος, οι προγραμματιστές άρχισαν να δημιουργούν σύμβολα για ορισμένα δυαδικά μοτίβα και με αυτό, γλώσσες συναρμολόγησης εισήχθησαν. Οι γλώσσες συναρμολόγησης είναι γλώσσες προγραμματισμού δεύτερης γενιάς. Οι οδηγίες σε γλώσσες συναρμολόγησης είναι μόλις ένα επίπεδο πάνω από τις οδηγίες του μηχανήματος, καθώς αντικαθιστούν δυαδικά ψηφία με εύκολες στη μνήμη λέξεις-κλειδιά, όπως ADD, SUB και ούτω καθεξής. Ως εκ τούτου, μπορείτε να ξαναγράψετε το προηγούμενο απλό παράδειγμα εντολής στη γλώσσα συναρμολόγησης ως εξής:

ΠΡΟΣΘΗΚΗ R1, R2

Σε αυτό το παράδειγμα, η λέξη-κλειδί ADD αντιπροσωπεύει τον κωδικό λειτουργίας της εντολής και τα R1 και R2 ορίζουν τους καταχωρητές που εμπλέκονται στη λειτουργία. Ακόμα και αν παρατηρήσετε αυτό το απλό παράδειγμα, είναι προφανές ότι οι γλώσσες συναρμολόγησης διευκόλυναν την ανάγνωση των προγραμμάτων και επέτρεψαν έτσι τη δημιουργία πιο σύνθετων εφαρμογών.

Αν και είναι περισσότερο προσανατολισμένες στον άνθρωπο, ωστόσο, οι γλώσσες δεύτερης γενιάς δεν επεκτείνουν τις δυνατότητες του επεξεργαστή με κανένα τρόπο.

Εισαγω γλώσσες υψηλού επιπέδου, που επιτρέπουν στους προγραμματιστές να εκφραστούν σε σημασιολογικές μορφές υψηλότερου επιπέδου. Όπως ίσως μαντέψατε, αυτές οι γλώσσες αναφέρονται ως γλώσσες προγραμματισμού τρίτης γενιάς. Οι γλώσσες υψηλού επιπέδου παρέχουν διάφορους ισχυρούς βρόχους, δομές δεδομένων, αντικείμενα και ούτω καθεξής, καθιστώντας πολύ πιο εύκολο να δημιουργήσετε πολλές εφαρμογές μαζί τους.

Με την πάροδο του χρόνου, εισήχθη μια μεγάλη ποικιλία γλωσσών προγραμματισμού υψηλού επιπέδου και τα χαρακτηριστικά τους διέφεραν πολύ. Μερικά από αυτά τα χαρακτηριστικά κατηγοριοποιούν τις γλώσσες προγραμματισμού ως scripting (ή δυναμικές) γλώσσες, όπως βλέπουμε στις επόμενες ενότητες.

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

Υπάρχει όμως ένας άλλος τρόπος για να μεταμορφώσουμε σημασιολογικές κατασκευές υψηλού επιπέδου σε οδηγίες μηχανής, και αυτός είναι να τις ερμηνεύσουμε καθώς εκτελούνται. Με αυτόν τον τρόπο, οι εφαρμογές σας βρίσκονται σε σενάρια, στην αρχική τους μορφή και οι κατασκευές μετατρέπονται κατά την εκτέλεση από ένα πρόγραμμα που ονομάζεται διερμηνέας. Βασικά, εκτελείτε τον διερμηνέα που διαβάζει δηλώσεις της αίτησής σας και στη συνέχεια τις εκτελεί. Που ονομάζεται δέσμες ενεργειών ή δυναμικές γλώσσες, αυτές οι γλώσσες προσφέρουν ακόμη υψηλότερο επίπεδο αφαίρεσης από αυτό που προσφέρουν οι γλώσσες προγραμματισμού συστήματος και τις συζητούμε λεπτομερώς αργότερα σε αυτό το κεφάλαιο.

Οι γλώσσες με αυτά τα χαρακτηριστικά είναι φυσιολογικές για ορισμένες εργασίες, όπως αυτοματοποίηση διεργασιών, διαχείριση συστήματος και συγκόλληση υπαρχόντων στοιχείων λογισμικού. Εν ολίγοις, οπουδήποτε η αυστηρή σύνταξη και οι περιορισμοί που εισήχθησαν από τις γλώσσες προγραμματισμού συστήματος παρεμποδίζονταν μεταξύ των προγραμματιστών και των εργασιών τους. Μια περιγραφή των συνηθισμένων ρόλων των γλωσσών δέσμης ενεργειών είναι το επίκεντρο του Κεφαλαίου 2, "Κατάλληλες εφαρμογές για γλώσσες δέσμης ενεργειών".

Αλλά τι έχει να κάνει όλα αυτά μαζί σας ως προγραμματιστής Java; Για να απαντήσουμε σε αυτήν την ερώτηση, ας συνοψίσουμε πρώτα σύντομα την ιστορία της πλατφόρμας Java. Καθώς οι πλατφόρμες έγιναν πιο διαφορετικές, έγινε πιο δύσκολο για τους προγραμματιστές να γράφουν λογισμικό που μπορεί να λειτουργεί με την πλειονότητα των διαθέσιμων συστημάτων. Αυτό είναι όταν η Sun ανέπτυξε την Java, η οποία προσφέρει απλότητα «γράψτε μία φορά, τρέξτε οπουδήποτε».

Η κύρια ιδέα πίσω από την πλατφόρμα Java ήταν να εφαρμόσει έναν εικονικό επεξεργαστή ως στοιχείο λογισμικού, που ονομάζεται α εικονική μηχανή. Όταν έχουμε μια τέτοια εικονική μηχανή, μπορούμε να γράψουμε και να συντάξουμε τον κώδικα για αυτόν τον επεξεργαστή, αντί της συγκεκριμένης πλατφόρμας υλικού ή του λειτουργικού συστήματος. Το αποτέλεσμα αυτής της διαδικασίας σύνταξης ονομάζεται bytecodeκαι αντιπροσωπεύει πρακτικά τον κωδικό μηχανής της στοχευμένης εικονικής μηχανής. Όταν εκτελείται η εφαρμογή, ξεκινά η εικονική μηχανή και ερμηνεύεται ο κωδικός bytec. Είναι προφανές ότι μια εφαρμογή που αναπτύχθηκε με αυτόν τον τρόπο μπορεί να εκτελεστεί σε οποιαδήποτε πλατφόρμα με εγκατεστημένη μια κατάλληλη εικονική μηχανή. Αυτή η προσέγγιση στην ανάπτυξη λογισμικού βρήκε πολλές ενδιαφέρουσες χρήσεις.

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

Μία από τις βασικές απαιτήσεις μιας γλώσσας σεναρίου είναι να υπάρχει διερμηνέας ή κάποιο είδος εικονικής μηχανής. Η πλατφόρμα Java συνοδεύεται από την Java Virtual Machine (JVM), η οποία της επιτρέπει να φιλοξενεί διάφορες γλώσσες scripting. Υπάρχει ένα αυξανόμενο ενδιαφέρον σε αυτόν τον τομέα σήμερα στην κοινότητα Java. Λίγα έργα υπάρχουν που προσπαθούν να παρέχουν στους προγραμματιστές Java τις ίδιες δυνατότητες των παραδοσιακών γλωσσών δέσμης ενεργειών. Επίσης, υπάρχει ένας τρόπος για να εκτελέσετε την υπάρχουσα εφαρμογή σας γραμμένη σε μια δυναμική γλώσσα όπως το Python μέσα στο JVM και να την ενσωματώσετε σε μια άλλη εφαρμογή ή λειτουργική μονάδα Java.

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