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.