Programmēšana

Nešorns: JavaScript ir lieliski izveidots Java 8

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.

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