Ohjelmointi

Nashorn: JavaScript on loistava Java 8: ssa

Nashorn, lausutaan "nass-horn", on saksankielinen "sarvikuono", ja se on yksi saksalaisen säiliötuhoojan eläinnimistä, jota käytettiin toisessa maailmansodassa. Se on myös vanhan, hitaan Rhino JavaScript -moottorin korvaavan tuotteen nimi - Java 8: lla. Sekä Rhino että Nashorn ovat Java-virtuaalikoneessa tai JVM: ssä suoritettavaksi kirjoitetun JavaScript-kielen toteutuksia.

Pakollinen huhu: JavaScriptin nimessä voi olla Java, mutta nämä kaksi kieltä ovat hyvin erilaisia ​​hengeltään ja ulkoasultaan sekä toteutukseltaan. Yksi tapa toteuttaa JavaScript-tulkki on kuitenkin koota JavaScript Java-tavukoodeiksi, mikä Rhino ja Nashorn on suunniteltu tekemään.

Luultavasti ajattelet JavaScriptiä verkkoselaimien komentosarjojen suhteen, ja olisit oikeassa suurimmaksi osaksi. Sitä käytetään myös palvelimille. Esimerkiksi Node.js: ää käytetään rakentamaan nopeita, kevyitä palvelimia, jotka perustuvat Google Chromen V8-JavaScript-moottoriin. Web-selainten JavaScript-moottoreilla on pääsy HTML-dokumenttimallimalliin (DOM), ja ne voivat manipuloida HTML-elementtejä DOM: n kautta. Koska eri verkkoselaimilla on erilaiset DOM: t ja JavaScript-moottorit, kehykset, kuten jQuery, yrittävät piilottaa toteutustiedot ohjelmoijalta.

Nashorn ja Rhino ennen sitä eivät nimenomaisesti tue selaimen DOMia. JVM: ssä toteutetut käyttäjät kutsutaan tyypillisesti loppukäyttäjien komentosarjoja varten Java-sovelluksissa. Nashorn ja Rhino voidaan upottaa Java-ohjelmiin ja käyttää komentorivikuorina. Tietysti ylimääräinen taika, jota tarvitaan Java-komentosarjaan JavaScriptiä käytettäessä, yhdistää kahden kielen tietojen ja tyyppien ristiriidat.

Rhino-ongelmat

Sarvikuonokehitys alkoi Netscapessa vuonna 1997 epäonnistuneelle "Javagator" -projektille, ja se julkaistiin Mozilla.org-sivustolle vuonna 1998. Sen jälkeen se lisensoitiin Sunille ja muille. Rehellisesti, vuosi 1998 voi yhtä hyvin olla Jurassic period, kuten Internet-kehitys jatkuu - Rhino on 16 vuotta myöhemmin osoittanut selvästi ikänsä. Nashornin pääkehittäjä Jim Laskey Oraclen mukaan:

Olen varma, että tämä kaikki on totta, mutta vankana kehittäjänä ja kehityspäällikkönä pidän viimeistä virkettä erittäin huvittavana. Loppujen lopuksi suuret uudelleenkirjoitukset eivät ole koskaan hauskoja. Aloittaminen tyhjästä on aina hauskaa.

Nashornin tavoitteet

Laskey kuvasi tavoitteitaan Nashornille seuraavasti:

  • Nashorn perustuu ECMAScript-262 Edition 5.1 -kielten määrittelyyn ja sen on läpäistävä ECMAScript-262-yhteensopivuustestit.
  • Nashorn tukee javax.script (JSR 223) -sovellusliittymä.
  • Tukea annetaan Java-koodin kutsumiselle JavaScriptiä ja Java-koodin kutsumiselle JavaScript-koodille. Tähän sisältyy suora kartoitus JavaBeans-järjestelmään.
  • Nashorn määrittelee uuden komentorivityökalun, jjs, JavaScript-koodin arvioimiseksi "shebang" -skripteissä, kirjoita tähän ja muokkaa merkkijonoja.
  • Nashorn-sovellusten suorituskyvyn ja muistin käytön pitäisi olla huomattavasti parempi kuin Rhino.
  • Nashorn ei altista muita turvallisuusriskejä.
  • Toimitettujen kirjastojen tulisi toimia oikein lokalisoinnin aikana.
  • Virheilmoitukset ja dokumentaatio kansainvälistetään.

Laskey rajoitti myös nimenomaisesti projektin laajuutta joillakin "ei-tavoitteilla":

  • Nashorn tukee vain ECMAScript-262 Edition 5.1: tä. Se ei tue mitään version 6 ominaisuuksia tai muita JavaScript-toteutusten tarjoamia epätyypillisiä ominaisuuksia.
  • Nashorn ei sisällä selaimen laajennussovellusliittymää.
  • Nashorn ei sisällä tukea DOM / CSS: lle tai vastaaville kirjastoille (kuten jQuery, Prototype tai Dojo).
  • Nashorn ei sisällä suoraa virheenkorjaustukea.

Joten mitä tarkoittaa ECMAScript-262 Edition 5.1: een perustuminen? Eroajana on, että Rhino perustui vanhempaan, vähemmän kykenevään Edition 3: een javax.script (JSR 223) -sovellusliittymä on tarkoitettu Java-käyttöjärjestelmän takaisin kutsumiseen.

Virheenkorjaustuen puute Nashornissa on askel taaksepäin Rhinolta, jolla on oma JavaScript-virheenkorjaaja. Kuitenkin löydät kiertotavat tälle tahalliselle laiminlyönnille ainakin kahdesta suositusta IDE: stä.

Nashornin komentorivityökalut: jjs: n ja jrunscriptin asentaminen

Kun olet lukenut Nashornin komentorivityökalusta, jjs, Olin innokas kokeilemaan iMacin kuorta, mutta Java 8: n asentamisen jälkeen se ei ollut bash-kuoren käytettävissä. On käynyt ilmi, että dokumentaatio ja toteutus eivät olleet täysin synkronoituja.

Tiesin, että asennus oli onnistunut:

 > java -versio java-versio "1.8.0" Java (TM) SE Runtime Environment (koontiversio 1.8.0-b132) Java HotSpot (TM) 64-bittinen palvelimen virtuaalikone (koontiversio 25.0-b70, sekatila) 

mutta juoksemassa jjs palasi -bash: jjs: komentoa ei löydy. Pieni tykkääminen toi minut / usr / bin / hakemisto:

 > mikä java / usr / bin / java 

Sieltä löysin jotain nimeltä jrunscript, joka osoittautui muunnelmaksi jjs joka suorittaa ylimääräisen käynnistyskomentosarjan. Sen olisi pitänyt tyydyttää minua, mutta olin hämmentynyt siitä, miksi dokumentoitu jjs työkalua ei ole asennettu / usr / bin / Java 8: n loppuajan kanssa. Pieni tutkimus johti minut tarkastelemaan JavaVirtualMachines asennus Java 8. Etsi Mac-tietokoneessa jjs sisään /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/ tai /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/.

Voit määrittää aliaksen kohteelle jjs ja lisää se komentotulkkikokoonpanoon, jos tarvitset sitä komentosarjoja varten Macissa tai Linuxissa. PC: llä voit lisätä oikean jre / bin / hakemisto omaan PATH. Jim Laskey ehdottaa videossaan Java 8 -käynnistämisestä kopiointia jjs että / usr / bin / hakemiston, mutta kun tein sen, löysin sen jjs ei löytänyt JRE: tä kunnolla ajon aikana.

Suoritetaan JavaScript-komentosarjoja

Miksi kaksi komentorivityökalua JavaScript-komentosarjojen suorittamiseen? En ole täysin selvillä siitä, mitä kehitystiimi ajatteli, mutta jjs on ominaisuuksia, jotka jrunscript ei, ja jrunscript on alustustiedosto. Alla on muutama yksinkertainen esimerkki jjs ja jrunscript käyttää.

 $ jrunscript nashorn> hälytys ("hei"); komentovirhe: ReferenceError: "hälytystä" ei ole määritelty rivillä numero 1 

Tämä ei toimi, koska hälytys () on selain / DOM-toiminto. Voi! Olisin kuitenkin voinut vannoa, että toimi Rhino.

 nashorn> tulosta ("Hei"); Hei, 

Tämä toimii, koska print () on ydin JavaScript-toiminto.

 nashorn> var a = 1; nashorn> var b = "1"; nashorn> tulosta (a + b); 11 nashorn> tulosta (a + a); 2 nashorn> lopeta (); $ 

Toisin sanoen meillä on täällä JavaScript-perusympäristö REPL (read-execute-print-loop command-line). Jos olet yllättynyt vastauksesta a + b, harkitse tätä:

 nashorn> tulosta (typeof (a + b)); merkkijono 

Se on viehättävä sivuvaikutus "+" -operaattorin löysästä kirjoittamisesta ja ylikuormituksesta JavaScriptissä. Se on oikea toiminta JavaScript-määrityksen mukaan, ei vika.

Nashorn tukee "#" - merkkiä johtavan rivin kommenttimerkkinä, joten jjs ja jrunscript voidaan käyttää suoritettavissa "shebang" -skripteissä, jotka on kirjoitettu JavaScript-muodossa. Macissa tai Linuxissa sinun on merkittävä JavaScript-tiedosto suoritettavaksi chmod-apuohjelmalla, jotta se voidaan ajaa.

Löydät komentosarjatilan jjs että jrunscript näyttää puuttuvan. Komentosarjatilassa takapotkujen sisällä olevat lausekkeet välitetään ulkokuorelle arviointia varten:

 $ jjs -scripting jjs> print ('ls'); Sovellukset Sovellukset (Parallels) Creative Cloud Files Desktop ... work jjs>

Komentosarjatila mahdollistaa laajennuksen myös "heredocsille", jotka ovat periaatteessa monirivisiä merkkijonoja Perl- ja Ruby-ohjelmoijille tutussa muodossa.

Muuten, Mac-näppäimistön nuolinäppäimet eivät toimi oikein rivin muokkauksessa jjs kuori. Mutta siihen on hakkerit: Voit valmistaa asenna rlwrap ja käytä sitä osana aliaksiasi jjs omassa .bashrc tai .zshrc tiedosto.

Soitetaan JavaScriptiä

Jos haluat soittaa Nashorn JavaScriptille Java 8 -ohjelmasta, sinun on periaatteessa tehtävä uusi ScriptEngineManager ja käytä sitä ScriptEngineManager ladata Nashorn-komentosarjamoottori nimellä. (Katso tästä pinon ylivuotokysymyksestä nash-yhteenveto Nashornin lataamisesta ja virheenkorjauksesta.)

Lopuksi voit välittää Nashorn-moottorille tiedoston tai merkkijonon arvioitavaksi:

 tuo javax.script.Invocable; tuo javax.script.ScriptEngine; tuo javax.script.ScriptEngineManager; tuo javax.script.ScriptException; ... kokeile {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine-moottori = factory.getEngineByName ("nashorn"); engine.eval ("load (\" "+" src "+" / "+" javascript_sample "+" / "+" test1.js "+" \ ");"); } catch (Exception ex) {// ...} ... kokeile {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine-moottori = factory.getEngineByName ("nashorn"); engine.eval ("function hi () {\ nvar a = 'PROSPER'.toLowerCase (); \ nmiddle (); \ nprint (' Live long and '+ a)} \ n function middle () {\ n var b = 1; for (var i = 0, max = 5; i

Huomaa, että skriptejä voi aina luoda ScriptException virheitä, joten sinun on kiinni ne.

Java-soittaminen JavaScriptiä käyttäen

Java-soittaminen Nashornista on suunnilleen yhtä helppoa kuin se voi olla, koska Java 8 -luokan kirjastot on rakennettu Nashorniin:

 tulosta (java.lang.System.currentTimeMillis ()); var-tiedosto = uusi java.io.File ("näyte.js"); tulosta (file.getAbsolutePath ()); tulosta (file.absolutePath); 

Huomaa, että Nashorn ei tuo java paketti oletuksena, koska viittaukset Merkkijono tai Esine ristiriidassa vastaavien JavaScript-tyyppien kanssa. Näin ollen Java-merkkijono on java.lang.String, ei Merkkijono.

Nashorn ja JavaFX

Jos vedot jjs kanssa -fx kytkimen avulla, sen avulla voit käyttää visuaalisia JavaFX-luokkia Nashorn-sovelluksissa. Esimerkiksi seuraava esimerkki Oracle-ohjeista näyttää JavaFX-painikkeen:

 var Button = javafx.scene.control.Button; var StackPane = javafx.scene.layout.StackPane; var Scene = javafx.scene.Scene; funktion alku (ensisijainen vaihe) {ensisijainen vaihe. otsikko = "Hei maailma!"; var-painike = uusi painike (); button.text = "Sano" Hello World ""; button.onAction = function () print ("Hei maailma!"); var root = uusi StackPane (); root.children.add (painike); primaryStage.scene = uusi kohtaus (juuri, 300, 250); primaryStage.show (); } 

Nashornin virheenkorjaus

Mainitsin aiemmin, että Nashorn ei sisällä omaa virheenkorjainta. Onneksi sekä NetBeans 8 että IntelliJ IDEA 13.1 tukevat Nashorn JavaScriptin virheenkorjausta. Aikaisemmin mainitsemani Stack Overflow -kysymys sisältää hyödyllisen NetBeans 8 -projektin, jota voit käyttää näytteenä. Tulet huomaamaan, että yksinkertaisesti käyttämällä virheenkorjauskohtaa JavaScript-tiedostojen ponnahdusvalikossa, voit debugata Nashorn-koodin.

IntelliJ IDEA 13 -sovelluksessa voit asettaa katkaisupisteet Java- ja Nashorn-JavaScript-tiedostoihin samalla pikanäppäimellä (Com / Ctrl-F8). Kun osut JavaScript-raja-arvoon, saat kaikki tavalliset virheenkorjaustiedot.

Nashorn suunniteltiin paremmaksi, nopeammaksi korvaamaan vanhan Rhino-moottorin, ja useimmilla toimenpiteillä se onnistuu. Siinä on joitain pieniä syyliä, jotka toivottavasti korjataan tulevissa päivityksissä, mutta toistaiseksi on olemassa kohtuullisia hakkereita, joiden avulla voit käyttää Nashornia tehokkaasti projekteissasi.

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