Nashorn, izrunātais "nass-horn", vācu valodā nozīmē "degunradzis", un tas ir viens no vācu tanku iznīcinātāja nosaukumiem, kas izmantots Otrajā pasaules karā. Tas ir arī vecā, lēnā Rhino JavaScript dzinēja aizstājēja nosaukums - ieviests ar Java 8. Gan Rhino, gan Nashorn ir JavaScript valodas ieviešana, kas rakstīta, lai palaistu Java virtuālajā mašīnā jeb JVM.
Obligāts skaņdarbs: JavaScript nosaukumā var būt Java, taču abas valodas garā un noformējumā, kā arī to ieviešanā ir ļoti atšķirīgas. Neskatoties uz to, viens no JavaScript tulka ieviešanas veidiem ir JavaScript apkopošana Java baitu kodos, kas bija paredzēts Rhino un Nashorn.
Jūs, iespējams, domājat par JavaScript tīmekļa pārlūkprogrammu skriptu ziņā, un lielākoties jums būtu taisnība. To izmanto arī serveriem. Piemēram, Node.js tiek izmantots ātru, vieglu serveru izveidošanai, pamatojoties uz Google Chrome V8 JavaScript dzinēju. Tīmekļa pārlūkprogrammās esošajiem JavaScript dzinējiem ir piekļuve HTML dokumenta objekta modelim (DOM), un tie var manipulēt ar HTML elementiem, izmantojot DOM. Ņemot vērā to, ka dažādās tīmekļa pārlūkprogrammās ir atšķirīgi DOM un JavaScript dzinēji, tādi ietvari kā jQuery mēģina slēpt ieviešanas detaļas no programmētāja.
Nešorns un Rhino pirms tā nepārprotami neatbalsta pārlūkprogrammu DOM. Ieviešot JVM, tos parasti izsauc galalietotāju skriptiem Java lietojumprogrammās. Nashorn un Rhino var iestrādāt Java programmās un izmantot kā komandrindas čaulas. Protams, papildu burvība, kas nepieciešama, kad jūs skriptu Java veidojat Java, ir savienot datu un tipu neatbilstību starp abām valodām.
Problēmas ar degunradzi
Rhino izstrāde tika uzsākta Netscape 1997. gadā ar neveiksmīgu "Javagator" projektu un 1998. gadā tika izlaista vietnē Mozilla.org. Pēc tam tā tika licencēta Sun un citiem. Godīgi sakot, 1998. gads varētu būt arī juras periods, kā notiek interneta attīstība - pēc 16 gadiem Rhino ir skaidri parādījis savu vecumu. Pēc Jim Laskey no Oracle, galvenā Nashorn izstrādātāja teiktā:
Esmu pārliecināts, ka tas viss ir taisnība, bet kā ieslodzīts izstrādātājs un attīstības vadītājs man pēdējais teikums šķiet ļoti uzjautrinošs. Galu galā galvenie pārrakstījumi nekad nav jautri. Sākt no nulles vienmēr ir jautri.
Nešornas mērķi
Laskijs aprakstīja savus mērķus Nešornai šādi:
- Nashorn pamatā būs ECMAScript-262 Edition 5.1 valodas specifikācija, un tai ir jānokārto ECMAScript-262 atbilstības testi.
- Nešorns atbalstīs
javax.script
(JSR 223) API. - Tiks nodrošināts atbalsts Java koda izsaukšanai no JavaScript un Java Java koda izsaukšanai. Tas ietver tiešu kartēšanu ar JavaBeans.
- Nešorns definēs jaunu komandrindas rīku,
jjs
, lai novērtētu JavaScript kodu "shebang" skriptos, šeit dokumentējiet un rediģējiet virknes. - Nashorn lietojumprogrammu veiktspējai un atmiņas izmantošanai vajadzētu būt ievērojami labākai par Rhino.
- Nešorns neatklās nekādus papildu drošības riskus.
- Piegādātajām bibliotēkām lokalizācijas gadījumā jādarbojas pareizi.
- Kļūdu ziņojumi un dokumentācija tiks internacionalizēta.
Laskey arī skaidri ierobežoja projekta darbības jomu ar dažiem "mērķiem, kas nav mērķi":
- Nešorns atbalstīs tikai ECMAScript-262 Edition 5.1. Tas neatbalstīs nekādas 6. izdevuma funkcijas vai nestandarta funkcijas, ko nodrošina citas JavaScript ieviešanas.
- Nashorn neiekļaus pārlūkprogrammas spraudņa API.
- Nešorns neietver atbalstu DOM / CSS vai citām saistītajām bibliotēkām (piemēram, jQuery, Prototype vai Dojo).
- Nešorns neietvers tiešu atkļūdošanas atbalstu.
Tātad, ko nozīmē balstīties uz ECMAScript-262 Edition 5.1? Šeit atšķirība ir tāda, ka Rhino pamatā bija vecākais, mazāk spējīgais 3. izdevums javax.script
(JSR 223) API ir paredzēta Java izsaukšanai uz JavaScript.
Atkļūdošanas atbalsta trūkums Nešornā ir solis atpakaļ no Rhino, kuram ir savs JavaScript atkļūdotājs. Tomēr vismaz divos populāros IDE jūs atradīsit risinājumus šai apzinātai izlaidībai.
Nashorn komandrindas rīki: jjs un jrunscript instalēšana
Izlasījis par Nashorn komandrindas rīku, jjs
, Es ļoti vēlējos izmēģināt sava iMac apvalku, taču pēc Java 8 instalēšanas tas nebija pieejams bash apvalkam. Izrādās, dokumentācija un ieviešana nebija pilnībā sinhronizēta.
Es zināju, ka instalēšana bija veiksmīga:
> java -version java versija "1.8.0" Java (TM) SE izpildlaika vide (būvējums 1.8.0-b132) Java HotSpot (TM) 64 bitu servera VM (būvējums 25.0-b70, jaukts režīms)
bet skrien jjs
atgriezās -bash: jjs: komanda nav atrasta
. Neliela bakstīšana apkārt mani noveda pie / usr / bin /
direktorijs:
> kura java / usr / bin / java
Tur es atradu kaut ko sauc jrunscript
, kas izrādījās jjs
kas palaiž papildu startēšanas skriptu. Tam vajadzēja mani apmierināt, bet es biju neizpratnē, kāpēc dokumentēts jjs
rīks netika instalēts / usr / bin /
ar pārējo Java 8 izpildlaiku. Neliels pētījums lika man apskatīt JavaVirtualMachines
instalēšana Java 8. Mac datorā meklējiet jjs
iekšā /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/
vai /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/
.
Varat definēt aizstājvārdu jjs
pēdējā direktorijā un pievienojiet to čaulas konfigurācijai, ja tas ir nepieciešams skriptu izveidei Mac vai Linux. Datorā varat pievienot pareizo jre / bin /
direktoriju CELS
. Savā video no Java 8 palaišanas Džims Laskijs iesaka kopēt jjs
uz / usr / bin /
direktoriju, bet kad es to izdarīju, es to atradu jjs
izpildes laikā nevarēja pareizi atrast JRE.
Darbojas JavaScript skripti
Kāpēc divi komandrindas rīki JavaScript skriptu darbināšanai? Man nav pilnīgi skaidrs, par ko domāja attīstības komanda, bet jjs
ir iespējas, kas jrunscript
nav, un jrunscript
ir inicializācijas fails. Tālāk ir sniegti daži vienkārši piemēri jjs
un jrunscript
izmantot.
$ jrunscript nashorn> alert ("sveiki,"); skripta kļūda: ReferenceError: "alert" nav definēts 1. rindā
Tas nedarbojas, jo brīdinājums ()
ir pārlūka / DOM funkcija. D'oh! Es tomēr būtu varējis zvērēt, ka tas darbojas Rhino.
nashorn> print ("Sveiki,"); Sveiki,
Tas patiešām darbojas, jo print () ir galvenā JavaScript funkcija.
našorns> var a = 1; nashorn> var b = "1"; našorns> druka (a + b); 11 nashorn> druka (a + a); 2 nashorn> atmest (); $
Citiem vārdiem sakot, šeit mums ir JavaScript REPL (read-execute-print-loop komandrindas) vide. Ja esat pārsteigts par atbildi uz a + b
, apsveriet šo:
nashorn> print (typeof (a + b)); virkne
Tas ir burvīgs blakusefekts, kas saistīts ar vaļīgu rakstīšanu un operētājsistēmas "+" pārlādēšanu JavaScript. Tā ir pareiza rīcība saskaņā ar JavaScript specifikāciju, nevis kļūda.
Nešorns atbalsta rakstzīmi "#" kā vadošās rindas komentāru marķieri, tātad jjs
un jrunscript
var izmantot izpildāmos "shebang" skriptos, kas rakstīti JavaScript. Mac vai Linux operētājsistēmā JavaScript fails ir jāatzīmē kā izpildāms ar utilītu chmod, lai tas būtu palaists.
Skriptu režīmu atradīsit jjs
to jrunscript
šķiet, ka pietrūkst. Skriptu režīmā izteiksmes muguras ērču iekšpusē tiek nodotas ārējam apvalkam novērtēšanai:
$ jjs -scripting jjs> print ('ls'); Lietojumprogrammas Lietojumprogrammas (paralēles) Creative Cloud Files Desktop ... darbs jjs>
Skriptu režīms ļauj paplašināt arī "heredocs", kas būtībā ir daudzrindu virknes Perl un Ruby programmētājiem pazīstamā formātā.
Starp citu, Mac tastatūras bulttaustiņi nedarbojas pareizi līniju rediģēšanai jjs
apvalks. Bet tam ir hakeris: jūs varat pagatavot instalēt rlwrap
un izmantojiet to kā daļu no sava aizstājvārda jjs
jūsu .bashrc
vai .zshrc
failu.
Zvanīšana JavaScript no Java
Lai izsauktu Nashorn JavaScript no Java 8 programmas, jums galvenokārt ir jāizveido jauns ScriptEngineManager
gadījumu un izmantojiet to ScriptEngineManager
lai ielādētu Nashorn skriptu dzinēju pēc nosaukuma. (Skatiet šo kaudzes pārpildes jautājumu, lai iegūtu Nashorn ielādes un atkļūdošanas kopsavilkumu.)
Visbeidzot, jūs varat nodot Nashorn motoram failu vai virkni, lai novērtētu:
importēt javax.script.Invocable; importēt javax.script.ScriptEngine; importēt javax.script.ScriptEngineManager; importēt javax.script.ScriptException; ... mēģiniet {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("ielādēt (\" "+" src "+" / "+" javascript_sample "+" / "+" test1.js "+" \ ");"); } catch (izņēmums ex) {// ...} ... mēģiniet {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("function hi () {\ nvar a = 'PROSPER'.toLowerCase (); \ nmiddle (); \ nprint (' Live long and '+ a)} \ n function middle () {\ n var b = 1; par (var i = 0, max = 5; i
Ņemiet vērā, ka skriptus vienmēr var ģenerēt ScriptException
kļūdas, tāpēc jums tās jānoķer.
Zvanīšana uz Java no JavaScript
Zvanīt Java no Nashorn ir aptuveni tikpat viegli, cik tas var būt, jo Java 8 klases bibliotēkas ir iebūvētas Nashorn:
drukāt (java.lang.System.currentTimeMillis ()); var fails = jauns java.io.File ("sample.js"); drukāt (file.getAbsolutePath ()); drukāt (file.absolutePath);
Ņemiet vērā, ka Nashorn neimportē java
pakotni pēc noklusējuma, jo atsauces uz Stīga
vai Objekts
ir pretrunā ar atbilstošajiem JavaScript veidiem. Tādējādi Java virkne ir java.lang.Strings
, nevis Stīga
.
Nashorn un JavaFX
Ja jūs piesaucat jjs
Ar -fx
slēdzi, tas ļaus jums izmantot vizuālās JavaFX klases jūsu Nashorn lietojumprogrammās. Piemēram, šajā Oracle dokumentācijas piemērā tiek parādīta poga JavaFX:
var Button = javafx.scene.control.Button; var StackPane = javafx.scene.layout.StackPane; var Scene = javafx.scene.Scene; funkcija start (primaryStage) {primaryStage.title = "Sveika pasaule!"; poga var = jauna poga (); button.text = "Sakiet" Sveika pasaule ""; button.onAction = function () print ("Sveika pasaule!"); var sakne = jauna StackPane (); sakne.bērni.add (poga); primaryStage.scene = jauna aina (sakne, 300, 250); primaryStage.show (); }
Nashorn atkļūdošana
Es jau iepriekš minēju, ka Nashorn neietver savu atkļūdotāju. Par laimi gan NetBeans 8, gan IntelliJ IDEA 13.1 atbalsta Nashorn JavaScript atkļūdošanu. Iepriekš minētajā Stack Overflow jautājumā ir iekļauts noderīgs NetBeans 8 projekts, kuru varat izmantot kā paraugu. Jūs atradīsit, ka, vienkārši izmantojot atkļūdošanas vienumu no uznirstošās izvēlnes JavaScript failos, varēsit atkļūdot Nashorn kodu.
Programmā IntelliJ IDEA 13 jūs varat iestatīt pārtraukumpunktus Java un Nashorn JavaScript failos, izmantojot to pašu īsinājumtaustiņu (Com / Ctrl-F8). Nospiežot JavaScript pārtraukuma punktu, jūs saņemat visu parasto atkļūdošanas informāciju.
Nashorn tika izstrādāts, lai būtu labāks, ātrāks vecā Rhino dzinēja nomaiņa, un lielākoties tas izdodas. Tam ir dažas nelielas kārpas, kuras, es ceru, tiks labotas nākamajos atjauninājumos, taču pašlaik ir pamatoti uzlaušanas gadījumi, kas ļauj efektīvi izmantot Nashorn savos projektos.