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

Nashorn: Η JavaScript έγινε εξαιρετική στην Java 8

Το Nashorn, προφέρεται "nass-horn", είναι γερμανικά για τον "ρινόκερο", και είναι ένα από τα ονόματα των ζώων για ένα γερμανικό αντιτορπιλικό που χρησιμοποιείται στον Β 'Παγκόσμιο Πόλεμο. Είναι επίσης το όνομα της αντικατάστασης - που εισήχθη με το Java 8 - για την παλιά, αργή μηχανή Rhino JavaScript. Τόσο το Rhino όσο και το Nashorn είναι υλοποιήσεις της γλώσσας JavaScript που έχει γραφτεί για εκτέλεση στην εικονική μηχανή Java ή JVM.

Υποχρεωτικό σχόλιο: Η JavaScript μπορεί να έχει την Java ως μέρος του ονόματός της, αλλά οι δύο γλώσσες είναι πολύ διαφορετικές στο πνεύμα και στο σχεδιασμό, καθώς και στις εφαρμογές τους. Παρ 'όλα αυτά, ένας τρόπος εφαρμογής ενός διερμηνέα JavaScript είναι να συγκεντρώσετε JavaScript σε κώδικες byte Java, κάτι που σχεδιάστηκαν για να κάνουν οι Rhino και Nashorn.

Πιθανότατα σκέφτεστε τη JavaScript από την άποψη της δημιουργίας σεναρίων σε προγράμματα περιήγησης Ιστού, και θα έχετε δίκιο στο μεγαλύτερο μέρος. Χρησιμοποιείται επίσης για διακομιστές. Για παράδειγμα, το Node.js χρησιμοποιείται για τη δημιουργία γρήγορων, ελαφρών διακομιστών με βάση τη μηχανή JavaScript V8 από το Google Chrome. Οι μηχανές JavaScript στα προγράμματα περιήγησης στο Web έχουν πρόσβαση στο μοντέλο αντικειμένου εγγράφου HTML (DOM) και μπορούν να χειριστούν στοιχεία HTML μέσω του DOM. Δεδομένου ότι διαφορετικά προγράμματα περιήγησης στο Web έχουν διαφορετικούς μηχανισμούς DOM και JavaScript, πλαίσια όπως το jQuery προσπαθούν να αποκρύψουν τις λεπτομέρειες εφαρμογής από τον προγραμματιστή.

Nashorn και Rhino πριν από αυτό, ρητά δεν υποστηρίζουν το πρόγραμμα περιήγησης DOM. Εφαρμόζονται στο JVM, συνήθως καλούνται για scripting τελικού χρήστη σε εφαρμογές Java. Το Nashorn και το Rhino μπορούν να ενσωματωθούν σε προγράμματα Java και να χρησιμοποιηθούν ως κελύφη γραμμής εντολών. Φυσικά, η πρόσθετη μαγεία που απαιτείται όταν γράφετε Java από JavaScript είναι γεφυρώνοντας τα δεδομένα και πληκτρολογήστε αναντιστοιχίες μεταξύ των δύο γλωσσών.

Προβλήματα με τον ρινόκερο

Η ανάπτυξη του ρινοκέρου ξεκίνησε στο Netscape το 1997 για ένα άθλιο έργο "Javagator" και κυκλοφόρησε στο Mozilla.org το 1998. Στη συνέχεια χορηγήθηκε άδεια στην Sun και σε άλλους. Ειλικρινά, το 1998 θα μπορούσε επίσης να είναι η Ιουρασική Περίοδος, καθώς η ανάπτυξη του Διαδικτύου πηγαίνει - 16 χρόνια αργότερα, ο Ρινόκερος έχει δείξει ξεκάθαρα την ηλικία του. Σύμφωνα με τον Jim Laskey της Oracle, τον κύριο προγραμματιστή του Nashorn:

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

Γκολ του Νάσορν

Ο Λάσκι περιγράφει τους στόχους του για τον Νάσορν ως εξής:

  • Το Nashorn θα βασίζεται στις προδιαγραφές γλώσσας ECMAScript-262 Edition 5.1 και πρέπει να περάσει τις δοκιμές συμμόρφωσης ECMAScript-262.
  • Ο Nashorn θα υποστηρίξει το javax.script (JSR 223) API.
  • Θα παρέχεται υποστήριξη για την επίκληση κώδικα Java από τη JavaScript και για την Java για επίκληση κώδικα JavaScript. Αυτό περιλαμβάνει άμεση χαρτογράφηση σε JavaBeans.
  • Το Nashorn θα ορίσει ένα νέο εργαλείο γραμμής εντολών, jjs, για αξιολόγηση κώδικα JavaScript σε σενάρια "shebang", εδώ έγγραφα και επεξεργασία συμβολοσειρών.
  • Η απόδοση και η χρήση μνήμης των εφαρμογών Nashorn θα πρέπει να είναι σημαντικά καλύτερη από το Rhino.
  • Το Nashorn δεν θα εκθέσει επιπλέον κινδύνους ασφαλείας.
  • Οι παρεχόμενες βιβλιοθήκες θα πρέπει να λειτουργούν σωστά κάτω από τον εντοπισμό.
  • Τα μηνύματα σφάλματος και η τεκμηρίωση θα διεθνοποιηθούν.

Η Laskey περιόρισε επίσης ρητά το πεδίο εφαρμογής του έργου με κάποιους "μη στόχους":

  • Το Nashorn θα υποστηρίζει μόνο το ECMAScript-262 Edition 5.1. Δεν θα υποστηρίζει οποιεσδήποτε δυνατότητες της έκδοσης 6 ή οποιεσδήποτε μη τυπικές δυνατότητες που παρέχονται από άλλες εφαρμογές JavaScript.
  • Το Nashorn δεν θα περιλαμβάνει API προσθήκης προγράμματος περιήγησης.
  • Το Nashorn δεν θα περιλαμβάνει υποστήριξη για DOM / CSS ή οποιεσδήποτε σχετικές βιβλιοθήκες (όπως jQuery, Prototype ή Dojo).
  • Το Nashorn δεν θα περιλαμβάνει υποστήριξη άμεσου εντοπισμού σφαλμάτων.

Τι σημαίνει λοιπόν να βασίζεσαι στο ECMAScript-262 Edition 5.1; Ο διαφοροποιητής εδώ είναι ότι ο Rhino βασίστηκε στην παλαιότερη, λιγότερο ικανή Έκδοση 3. Η javax.script (JSR 223) Το API προορίζεται για επαναφορά σε JavaScript από την Java.

Η έλλειψη υποστήριξης εντοπισμού σφαλμάτων στο Nashorn είναι ένα βήμα πίσω από τον Rhino, ο οποίος διαθέτει το δικό του πρόγραμμα εντοπισμού σφαλμάτων JavaScript. Ωστόσο, θα βρείτε λύσεις για αυτήν τη σκόπιμη παράλειψη σε τουλάχιστον δύο δημοφιλή IDE.

Εργαλεία γραμμής εντολών Nashorn: Εγκατάσταση jjs και jrunscript

Αφού διαβάσατε για το εργαλείο γραμμής εντολών του Nashorn, jjsΉμουν πρόθυμος να δοκιμάσω το κέλυφος στο iMac μου, αλλά μετά την εγκατάσταση του Java 8 δεν ήταν διαθέσιμο στο κέλυφος bash. Αποδεικνύεται ότι η τεκμηρίωση και η εφαρμογή δεν ήταν πλήρως συγχρονισμένες.

Ήξερα ότι η εγκατάσταση ήταν επιτυχής:

 > java -version java version "1.8.0" Java (TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot (TM) 64-Bit Server VM (build 25.0-b70, μικτή λειτουργία) 

αλλά τρέχει jjs Επέστρεψαν -bash: jjs: η εντολή δεν βρέθηκε. Λίγο στρίψιμο με έφερε στο / usr / bin / Ευρετήριο:

 > που java / usr / bin / java 

Εκεί βρήκα κάτι που λέγεται jrunscript, που αποδείχθηκε μια παραλλαγή του jjs που τρέχει ένα επιπλέον σενάριο εκκίνησης. Αυτό θα με ικανοποίησε, αλλά με προβλημάτισε γιατί το τεκμηριωμένο jjs το εργαλείο δεν εγκαταστάθηκε στο / usr / bin / με τον υπόλοιπο χρόνο εκτέλεσης Java 8. Μια μικρή έρευνα με οδήγησε να κοιτάξω το JavaVirtualMachines εγκατάσταση για Java 8. Σε Mac, αναζητήστε jjs σε /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/ ή /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/.

Μπορείτε να ορίσετε ένα ψευδώνυμο για jjs στον τελευταίο κατάλογο και προσθέστε τον στη διαμόρφωση του κελύφους σας εάν το χρειάζεστε για δέσμες ενεργειών σε Mac ή Linux. Σε υπολογιστή, μπορείτε να προσθέσετε το σωστό jre / κάδος / κατάλογο στο δικό σας ΜΟΝΟΠΑΤΙ. Στο βίντεό του από την κυκλοφορία Java 8, ο Jim Laskey προτείνει αντιγραφή jjs στο / usr / bin / κατάλογο, αλλά όταν το έκανα αυτό το βρήκα jjs δεν μπόρεσα να βρω το JRE σωστά στο χρόνο εκτέλεσης.

Εκτέλεση σεναρίων JavaScript

Γιατί τα δύο εργαλεία της γραμμής εντολών για την εκτέλεση σεναρίων JavaScript; Δεν είμαι απολύτως σαφής για το τι σκέφτηκε η ομάδα ανάπτυξης, αλλά jjs έχει δυνατότητες που jrunscript δεν, και jrunscript έχει ένα αρχείο αρχικοποίησης. Ακολουθούν μερικά απλά παραδείγματα jjs και jrunscript χρήση.

 $ jrunscript nashorn> ειδοποίηση ("γεια,"); σφάλμα σεναρίου: ReferenceError: "alert" δεν ορίζεται στον αριθμό γραμμής 1 

Αυτό δεν λειτουργεί γιατί συναγερμός() είναι μια λειτουργία προγράμματος περιήγησης / DOM. Ντο! Ωστόσο, θα μπορούσα να ορκιστώ ότι δούλευε στον Ρινόκερο.

 nashorn> εκτύπωση ("Γεια σας"); Γεια, 

Αυτό λειτουργεί γιατί η εκτύπωση () είναι μια βασική συνάρτηση JavaScript.

 nashorn> var a = 1; nashorn> var b = "1"; nashorn> εκτύπωση (a + b); 11 nashorn> εκτύπωση (a + a); 2 nashorn> διακοπή (); $ 

Με άλλα λόγια, έχουμε ένα βασικό περιβάλλον εντολής REPL (read-execute-print-loop-line) για JavaScript εδώ. Εάν εκπλαγείτε από την απάντηση στο α + β, σκεφτείτε το:

 nashorn> εκτύπωση (typeof (a + b)); σειρά 

Αυτή είναι μια γοητευτική παρενέργεια της χαλαρής πληκτρολόγησης και υπερφόρτωσης του χειριστή "+" σε JavaScript. Είναι σωστή συμπεριφορά σύμφωνα με τις προδιαγραφές JavaScript και όχι σφάλμα.

Ο Nashorn υποστηρίζει τον χαρακτήρα "#" ως δείκτη σχολίων κορυφαίας γραμμής, έτσι jjs και jrunscript μπορεί να χρησιμοποιηθεί σε εκτελέσιμα σενάρια "shebang" γραμμένα σε JavaScript. Σε Mac ή Linux, θα πρέπει να επισημάνετε το αρχείο JavaScript ως εκτελέσιμο με το βοηθητικό πρόγραμμα chmod για να το εκτελέσετε.

Θα βρείτε μια λειτουργία δέσμης ενεργειών σε jjs ότι jrunscript φαίνεται να λείπει. Στη λειτουργία δέσμης ενεργειών, οι εκφράσεις μέσα στα πίσω-κρότων περνούν στο εξωτερικό κέλυφος για αξιολόγηση:

 $ jjs -scripting jjs> print ('ls'); Εφαρμογές Εφαρμογές (Παράλληλοι) Creative Cloud Files Desktop ... jjs εργασίας>

Η λειτουργία δέσμης ενεργειών επιτρέπει επίσης μια επέκταση για "heredocs", οι οποίες είναι βασικά πολυγραμμικές συμβολοσειρές σε μορφή γνωστή στους προγραμματιστές Perl και Ruby.

Παρεμπιπτόντως, τα πλήκτρα βέλους στο πληκτρολόγιο Mac δεν λειτουργούν σωστά για επεξεργασία γραμμής στο jjs κέλυφος. Αλλά υπάρχει μια χαρά για αυτό: Μπορείτε να ετοιμάσετε εγκατάσταση rlwrap και χρησιμοποιήστε το ως μέρος του ψευδωνύμου σας για jjs στο δικό σας .bashrc ή .zshrc αρχείο.

Κλήση JavaScript από Java

Για να καλέσετε το Nashorn JavaScript από ένα πρόγραμμα Java 8, βασικά πρέπει να δημιουργήσετε ένα νέο ScriptEngineManager παράδειγμα και χρησιμοποιήστε αυτό ScriptEngineManager για να φορτώσετε τη μηχανή σεναρίων Nashorn με το όνομα. (Δείτε αυτήν την ερώτηση Stack Overflow για μια σύντομη περίληψη φόρτωσης και εντοπισμού σφαλμάτων του Nashorn.)

Τέλος, μπορείτε να μεταβιβάσετε στον κινητήρα Nashorn ένα αρχείο ή μια συμβολοσειρά για να αξιολογήσετε:

 εισαγωγή javax.script.Invocable; εισαγωγή javax.script.ScriptEngine; εισαγωγή javax.script.ScriptEngineManager; εισαγωγή javax.script.ScriptException; ... δοκιμάστε το {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("load (\" "+" src "+" / "+" javascript_sample "+" / "+" test1.js "+" \ ");"); } catch (Exception ex) {// ...} ... δοκιμάστε το {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("function hi () {\ nvar a = 'PROSPER'.toLowerCase (); \ nmiddle (); \ nprint (' Live long and '+ a)} \ n λειτουργία μέσης () {\ n var b = 1; για (var i = 0, max = 5; i

Σημειώστε ότι τα σενάρια μπορούν πάντα να δημιουργούν ScriptException λάθη, οπότε πρέπει να τα πιάσετε.

Κλήση Java από JavaScript

Η κλήση της Java από το Nashorn είναι τόσο εύκολη όσο μπορεί, καθώς οι βιβλιοθήκες κλάσης Java 8 είναι ενσωματωμένες στο Nashorn:

 εκτύπωση (java.lang.System.currentTimeMillis ()); var file = new java.io.File ("sample.js"); εκτύπωση (file.getAbsolutePath ()); εκτύπωση (file.absolutePath); 

Σημειώστε ότι το Nashorn δεν εισάγει το Ιάβα από προεπιλογή, επειδή αναφέρονται σε Σειρά ή Αντικείμενο σε διένεξη με τους αντίστοιχους τύπους στο JavaScript. Ως εκ τούτου, μια συμβολοσειρά Java είναι java.lang.String, δεν Σειρά.

Nashorn και JavaFX

Εάν επικαλεσθείτε jjs με την -fx διακόπτη, θα σας επιτρέψει να χρησιμοποιήσετε οπτικές τάξεις JavaFX στις εφαρμογές Nashorn. Για παράδειγμα, το ακόλουθο παράδειγμα από την τεκμηρίωση της Oracle εμφανίζει ένα κουμπί JavaFX:

 var Button = javafx.scene.control.Button; var StackPane = javafx.scene.layout.StackPane; var Scene = javafx.scene.Scene; έναρξη λειτουργίας (primaryStage) {primStage.title = "Γεια σου Κόσμος!"; κουμπί var = νέο κουμπί (); button.text = "Πείτε" Γεια σας Κόσμος ""; button.onAction = function () print ("Hello World!"); var root = νέο StackPane (); root.children.add (κουμπί); primaryStage.scene = νέα σκηνή (root, 300, 250); primaryStage.show (); } 

Εντοπισμός σφαλμάτων Nashorn

Ανέφερα νωρίτερα ότι το Nashorn δεν περιλαμβάνει δικό του πρόγραμμα εντοπισμού σφαλμάτων. Ευτυχώς, τόσο το NetBeans 8 όσο και το IntelliJ IDEA 13.1 υποστηρίζουν τον εντοπισμό σφαλμάτων του Nashorn JavaScript. Η ερώτηση Stack Overflow που ανέφερα προηγουμένως περιλαμβάνει ένα χρήσιμο έργο NetBeans 8 που μπορείτε να χρησιμοποιήσετε ως δείγμα. Θα διαπιστώσετε ότι η απλή χρήση του στοιχείου εντοπισμού σφαλμάτων από το αναδυόμενο μενού σε αρχεία JavaScript θα σας επιτρέψει να εντοπίσετε τον κώδικα Nashorn.

Στο IntelliJ IDEA 13, μπορείτε να ορίσετε σημεία διακοπής στα αρχεία JavaScript Java και Nashorn χρησιμοποιώντας το ίδιο πλήκτρο συντόμευσης (Com / Ctrl-F8). Όταν χτυπάτε ένα σημείο διακοπής JavaScript, λαμβάνετε όλες τις συνήθεις πληροφορίες εντοπισμού σφαλμάτων.

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

$config[zx-auto] not found$config[zx-overlay] not found