Programavimas

„Nashorn“: „JavaScript“ puikiai veikia „Java 8“

Nashornas, tariamas „nass-horn“, vokiečių kalba reiškia „raganosis“, ir tai yra vienas iš vokiečių tankų naikintuvų, naudojamų Antrojo pasaulinio karo metais, pavadinimų. Tai taip pat yra seno, lėtai veikiančio „Rhino JavaScript“ variklio pavadinimo, pristatyto „Java 8“, pavadinimas. „Rhino“ ir „Nashorn“ yra „JavaScript“ kalbos, parašytos paleisti „Java“ virtualioje mašinoje, arba JVM, versijos.

Privalomas pasipiktinimas: „JavaScript“ gali turėti „Java“ pavadinimą, tačiau abi kalbos yra labai skirtingos savo dvasia ir dizainu, taip pat ir jų įgyvendinimu. Nepaisant to, vienas iš „JavaScript“ vertėjo įdiegimo būdų yra sukompiliuoti „JavaScript“ į „Java“ baitų kodus, o tai buvo sukurta „Rhino“ ir „Nashorn“.

Jūs tikriausiai galvojate apie „JavaScript“ kalbėdami apie žiniatinklio naršyklių scenarijų kūrimą ir didžiąja dalimi būtumėte teisūs. Jis taip pat naudojamas serveriams. Pavyzdžiui, „Node.js“ naudojamas kuriant greitus, lengvus serverius, pagrįstus „V8 JavaScript“ varikliu iš „Google Chrome“. „JavaScript“ varikliai žiniatinklio naršyklėse turi prieigą prie HTML dokumento objekto modelio (DOM) ir gali manipuliuoti HTML elementais per DOM. Atsižvelgiant į tai, kad skirtingos žiniatinklio naršyklės turi skirtingus DOM ir „JavaScript“ variklius, tokios sistemos kaip „jQuery“ bando paslėpti išsamią įgyvendinimo informaciją nuo programuotojo.

Nashornas ir Rhino prieš jį aiškiai nepalaiko naršyklės DOM. Įdiegus JVM, jie paprastai pakviečiami į galutinių vartotojų scenarijus „Java“ programose. „Nashorn“ ir „Rhino“ galima įdėti į „Java“ programas ir naudoti kaip komandinės eilutės apvalkalus. Žinoma, papildoma magija, reikalinga, kai rašote „Java“ iš „JavaScript“, sujungia duomenų ir tipų neatitikimus tarp dviejų kalbų.

Problemos su Rhino

Rhino kūrimas prasidėjo „Netscape“ 1997-aisiais dėl nelemto „Javagator“ projekto ir 1998 m. Buvo išleistas į Mozilla.org. Tada jis buvo licencijuotas „Sun“ ir kitiems. Sąžiningai sakant, 1998 m. Taip pat gali būti juros laikotarpis, nes eina interneto plėtra - po 16 metų Rhino aiškiai parodė savo amžių. Pasak Jim Laskey iš „Oracle“, pagrindinio „Nashorn“ kūrėjo:

Esu įsitikinęs, kad visa tai yra tiesa, bet, būdamas įstrigęs kūrėjas ir plėtros vadovas, paskutinis sakinys man atrodo labai linksmas. Juk pagrindiniai perrašymai niekada nėra įdomūs. Pradėti nuo nulio visada yra smagu.

Nashorno tikslai

Laskey apibūdino savo tikslus Nashornui taip:

  • „Nashorn“ bus pagrįstas „ECMAScript-262 Edition 5.1“ kalbos specifikacija ir turi išlaikyti „ECMAScript-262“ atitikties testus.
  • Nashornas palaikys javax.script (JSR 223) API.
  • Bus palaikoma „Java“ kodo iškvietimas iš „JavaScript“ ir „Java“ - „JavaScript“ kodo iškvietimas. Tai apima tiesioginį susiejimą su „JavaBeans“.
  • Nashornas nustatys naują komandų eilutės įrankį, jjs, norint įvertinti „JavaScript“ kodą „shebang“ scenarijuose, pateikite dokumentus ir redaguokite eilutes.
  • „Nashorn“ programų našumas ir atminties naudojimas turėtų būti žymiai geresni nei „Rhino“.
  • „Nashorn“ neatskleis jokios papildomos saugumo rizikos.
  • Tiekiamos bibliotekos turėtų tinkamai veikti lokalizuodamos.
  • Klaidų pranešimai ir dokumentai bus internacionalizuoti.

Laskey taip pat aiškiai apribojo projekto apimtį kai kuriais „ne tikslais“:

  • „Nashorn“ palaikys tik ECMAScript-262 5.1 leidimą. Jis nepalaikys jokių 6 leidimo funkcijų ar nestandartinių funkcijų, kurias teikia kiti „JavaScript“ diegimai.
  • „Nashorn“ neįtrauks naršyklės papildinio API.
  • „Nashorn“ nepalaiko DOM / CSS ar bet kokių susijusių bibliotekų (pvz., „JQuery“, „Prototype“ ar „Dojo“) palaikymo.
  • „Nashorn“ neįtrauks tiesioginio derinimo palaikymo.

Taigi ką reiškia remtis ECMAScript-262 5.1 leidimu? Čia skiriamasis dalykas yra tai, kad Rhino buvo paremtas senesniu, mažiau pajėgiu 3 leidimu javax.script (JSR 223) API skirta paskambinti atgal į „JavaScript“ iš „Java“.

Nešorno derinimo palaikymo trūkumas yra žingsnis atgal nuo Rhino, kuris turi savo „JavaScript“ derintuvą. Tačiau šio tyčinio praleidimo sprendimo būdus rasite bent dviejuose populiariuose IDE.

„Nashorn“ komandinės eilutės įrankiai: „jjs“ ir „jrunscript“ diegimas

Perskaitę apie „Nashorn“ komandinės eilutės įrankį, jjs, Norėjau išbandyti „iMac“ apvalkalą, tačiau įdiegus „Java 8“ jis nebuvo prieinamas „bash“ apvalkalui. Pasirodo, dokumentacija ir įgyvendinimas nebuvo visiškai sinchronizuoti.

Žinojau, kad diegimas buvo sėkmingas:

 > „java“ versija „Java“ versija „1.8.0“ „Java“ (TM) SE vykdymo trukmės aplinka (1.8.0 – b132 komponavimo versija) 

bet bėga jjs grįžo -bash: jjs: komanda nerasta. Truputį baksnodama atvedžiau mane į / usr / bin / katalogas:

 > kuri java / usr / bin / java 

Ten radau ką nors vadinamą jrunscript, kuris pasirodė esąs jjs kuriame veikia papildomas paleisties scenarijus. Tai turėjo mane tenkinti, bet buvau suglumęs, kodėl dokumentuotas jjs įrankis nebuvo įdiegtas / usr / bin / su likusiu „Java 8“ vykdymo laiku. Šiek tiek tyrimų paskatino mane pažvelgti į „JavaVirtualMachines“ diegimas „Java 8.“. „Mac“ sistemoje ieškokite jjs į /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/ arba /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/.

Galite apibrėžti slapyvardį jjs pastarajame kataloge ir pridėkite jį prie savo apvalkalo konfigūracijos, jei jums to reikia scenarijams „Mac“ ar „Linux“. Kompiuteryje galite pridėti teisingą jre / bin / katalogą į jūsų KELIS. Savo vaizdo įraše iš „Java 8“ paleidimo Jimas Laskey siūlo nukopijuoti jjs į / usr / bin / katalogą, bet tai padaręs radau jjs vykdymo metu nepavyko tinkamai rasti JRE.

Vykdomas „JavaScript“ scenarijus

Kodėl reikalingi du komandinės eilutės įrankiai, skirti paleisti „JavaScript“ scenarijus? Man nėra visiškai aišku, ką kūrėjo komanda galvojo, bet jjs turi tokių galimybių jrunscript neturi ir jrunscript turi inicializavimo failą. Žemiau pateikiami keli paprasti pavyzdžiai jjs ir jrunscript naudoti.

 $ jrunscript nashorn> alert ("labas"); scenarijaus klaida: ReferenceError: „įspėjimas“ nėra apibrėžtas 1 eilutėje 

Tai neveikia, nes budrus() yra naršyklės / DOM funkcija. Dee! Vis dėlto galėjau prisiekti, kad dirbo Rhino.

 nashorn> print ("Sveiki"); Sveiki, 

Tai tikrai veikia, nes „print“) yra pagrindinė „JavaScript“ funkcija.

 nashorn> var a = 1; nashorn> var b = "1"; nashorn> spausdinti (a + b); 11 nashorn> spausdinti (a + a); 2 nashorn> mesti (); $ 

Kitaip tariant, čia yra pagrindinė „JavaScript“ REPL (read-execute-print-loop komandinės eilutės) aplinka. Jei nustebsite atsakymu į a + b, apsvarstykite tai:

 nashorn> print (typeof (a + b)); stygos 

Tai yra žavus šalutinis poveikis, kai „JavaScript“ operatorius „+“ rašo ir perkrauna. Tai teisinga elgsena pagal „JavaScript“ specifikaciją, o ne klaida.

Nashornas palaiko simbolį „#“ kaip pagrindinės eilutės komentarų žymeklį, taigi jjs ir jrunscript gali būti naudojamas vykdomuosiuose „shebang“ scenarijuose, parašytuose „JavaScript“. „Mac“ ar „Linux“ sistemose turėsite pažymėti „JavaScript“ failą kaip vykdomąjį naudodami „chmod“ įrankį, kad jį būtų galima paleisti.

Scenarijų režimą rasite jjs kad jrunscript atrodo, kad trūksta. Scenarijų režimu išraiškos nugaros erkių viduje perduodamos į išorinį apvalkalą vertinimui:

 $ jjs -scripting jjs> print ('ls'); Programos Programos (paralelės) „Creative Cloud Files Desktop“ ...

Scenarijų režimas taip pat leidžia išplėsti „heredocs“, kurie iš esmės yra „Perl“ ir „Ruby“ programuotojams žinomo formato kelių eilučių eilutės.

Beje, „Mac“ klaviatūros rodyklių klavišai netinkamai veikia redaguojant „Linux“ jjs apvalkalas. Bet tam yra nulaužimas: galite virti įdiekite rlwrap ir naudokite tai kaip savo slapyvardžio dalį jjs jūsų .bashrc arba .zshrc failą.

Skambinama „Java“ iš „Java“

Norėdami paskambinti „Nashorn JavaScript“ iš „Java 8“ programos, iš esmės turite sukurti naują „ScriptEngineManager“ ir naudokis tuo „ScriptEngineManager“ įkelti „Nashorn“ scenarijų variklį vardu. (Žr. Šį „Stack Overflow“ klausimą, kuriame pateikiama „Nashorn“ įkėlimo ir derinimo santrauka.)

Galiausiai galite perduoti „Nashorn“ varikliui failą arba eilutę, kad įvertintumėte:

 importuoti javax.script.Invocable; importuoti javax.script.ScriptEngine; importuoti javax.script.ScriptEngineManager; importuoti javax.script.ScriptException; ... pabandykite {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("load (\" "+" src "+" / "+" javascript_sample "+" / "+" test1.js "+" \ ");"); } catch (Išimtis ex) {// ...} ... pabandykite {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; už (var i = 0, max = 5; i

Atminkite, kad scenarijus visada galima generuoti Scenarijaus išimtis klaidų, todėl jas reikia sugauti.

Skambinama „Java“ iš „JavaScript“

Skambinti „Java“ iš „Nashorn“ yra maždaug taip paprasta, kaip gali būti, nes „Java 8“ klasės bibliotekos yra integruotos į „Nashorn“:

 spausdinti (java.lang.System.currentTimeMillis ()); var failas = nauja java.io.File ("pavyzdys.js"); spausdinti (file.getAbsolutePath ()); spausdinti (file.absolutePath); 

Atminkite, kad „Nashorn“ neimportuoja java paketą pagal numatytuosius nustatymus, nes nuorodos į Stygos arba Objektas prieštarauja atitinkamiems „JavaScript“ tipams. Vadinasi, „Java“ eilutė yra java.lang.Stringas, ne Stygos.

„Nashorn“ ir „JavaFX“

Jei pasikviesite jjs su -fx jungikliu, tai leis jums naudoti vaizdines „JavaFX“ klases „Nashorn“ programose. Pavyzdžiui, šiame „Oracle“ dokumentacijos pavyzdyje rodomas „JavaFX“ mygtukas:

 var mygtukas = javafx.scene.control.Button; var „StackPane“ = javafx.scene.layout.StackPane; var Scena = javafx.scene.Scene; funkcijos pradžia (pirminis etapas) {pirminis etapas.title = "Sveikas pasaulis!"; var mygtukas = naujas mygtukas (); button.text = "Pasakyk" Sveikas pasaulis ""; button.onAction = function () print ("Sveikas pasaulis!"); var root = nauja „StackPane“ (); šaknis.vaikai.add (mygtukas); primaryStage.scene = nauja scena (šaknis, 300, 250); primaryStage.show (); } 

Derinimas „Nashorn“

Anksčiau minėjau, kad „Nashorn“ nėra savo derintuvo. Laimei, tiek „NetBeans 8“, tiek „IntelliJ IDEA 13.1“ palaiko „Nashorn JavaScript“ derinimą. Anksčiau minėtas „Stack Overflow“ klausimas apima naudingą „NetBeans 8“ projektą, kurį galite naudoti kaip pavyzdį. Pamatysite, kad paprasčiausiai naudodami derinimo elementą iš „JavaScript“ failų iššokančiojo meniu, galėsite derinti „Nashorn“ kodą.

Programoje „IntelliJ IDEA 13“ galite nustatyti pertraukimo taškus „Java“ ir „Nashorn“ „JavaScript“ failuose naudodami tą patį spartųjį klavišą („Com“ / „Ctrl-F8“). Paspaudę „JavaScript“ lūžio tašką, gausite visą įprastą derinimo informaciją.

„Nashorn“ buvo suprojektuotas kaip geresnis, greitesnis senojo „Rhino“ variklio pakeitimas, ir daugeliu atvejų tai pavyksta. Jis turi keletą nedidelių karpų, kurios, tikiuosi, bus ištaisytos būsimuose atnaujinimuose, tačiau kol kas yra pagrįstų įsilaužimų, leidžiančių efektyviai naudoti „Nashorn“ savo projektuose.

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