Programovanie

Nashorn: JavaScript je v prostredí Java 8 vynikajúci

Nashorn, vyslovovaný ako „nass-horn“, je nemčina pre „nosorožec“ a je to jeden zo zvieracích mien pre nemecký stíhač tankov používaný v druhej svetovej vojne. Je to tiež názov náhrady, ktorá bola predstavená v prostredí Java 8, za starý, pomalý JavaScriptový stroj Rhino. Rhino aj Nashorn sú implementácie jazyka JavaScript napísaného na spustenie na virtuálnom stroji Java alebo JVM.

Povinná reč: JavaScript môže mať ako súčasť názvu Java, ale oba jazyky sa veľmi líšia v duchu a dizajne, ako aj vo svojich implementáciách. Jedným zo spôsobov implementácie tlmočníka jazyka JavaScript je však kompilácia kódu JavaScript do bajtových kódov Java, na čo boli určené programy Rhino a Nashorn.

Pravdepodobne si myslíte o JavaScripte, čo sa týka skriptovania webových prehľadávačov, a z väčšej časti by ste mali pravdu. Používa sa tiež pre servery. Napríklad Node.js sa používa na vytváranie rýchlych a ľahkých serverov založených na stroji JavaScript V8 z prehliadača Google Chrome. Stroje JavaScriptu vo webových prehľadávačoch majú prístup k objektovému modelu dokumentu HTML (DOM) a môžu manipulovať s prvkami HTML prostredníctvom modelu DOM. Vzhľadom na to, že rôzne webové prehľadávače majú rôzne DOMs a motory JavaScriptu, rámce ako jQuery sa snažia skryť podrobnosti implementácie pred programátorom.

Nashorn a Rhino pred ním výslovne nepodporujú DOM prehliadača. Implementované na JVM sa zvyčajne vyvolávajú pre skriptovanie koncových používateľov v aplikáciách Java. Nashorn a Rhino môžu byť vložené do programov Java a použité ako škrupiny príkazového riadku. Dodatočné kúzlo potrebné pri skriptovaní Javy z JavaScriptu samozrejme preklenuje nezhody údajov a typov medzi týmito dvoma jazykmi.

Problémy s Rhinom

Vývoj Rhina sa začal v spoločnosti Netscape v roku 1997 pre nešťastný projekt „Javagator“ a bol uvedený na web Mozilla.org v roku 1998. Potom bol licencovaný spoločnosti Sun a ďalším. Úprimne, rok 1998 by mohol byť pokojom jurského obdobia, keďže vývoj internetu pokračuje - o 16 rokov neskôr Rhino jasne ukázal svoj vek. Podľa Jima Laskeyho z Oracle, hlavného vývojára Nashornu:

Som si istý, že je to všetko pravda, ale ako vyčerpaného vývojára a vývojového manažéra považujem poslednú vetu za veľmi zábavnú. Hlavné prepisovania nie sú koniec koncov nikdy zábavné. Začínať od nuly je vždy zábava.

Ciele Nashornu

Laskey opísal svoje ciele pre Nashorn nasledovne:

  • Nashorn bude založený na jazykovej špecifikácii ECMAScript-262, vydanie 5.1 a musí vyhovieť testom zhody s ECMAScript-262.
  • Nashorn bude podporovať javax.script (JSR 223) API.
  • Poskytne sa podpora pre vyvolanie kódu Java z JavaScriptu a pre Java pre vyvolanie kódu JavaScript. Patrí sem priame mapovanie na JavaBeans.
  • Nashorn definuje nový nástroj príkazového riadku, jjs, na vyhodnotenie kódu JavaScript v skriptoch „shebang“, tu dokumenty a úpravy reťazcov.
  • Výkon a využitie pamäte aplikácií Nashorn by mali byť výrazne lepšie ako Rhino.
  • Nashorn nebude vystavovať žiadne ďalšie bezpečnostné riziká.
  • Dodávané knižnice by pri lokalizácii mali fungovať správne.
  • Chybové správy a dokumentácia budú internacionalizované.

Laskey tiež výslovne obmedzil rozsah projektu niekoľkými „necieľmi“:

  • Nashorn bude podporovať iba ECMAScript-262 vydanie 5.1. Nebude podporovať žiadne funkcie verzie 6 ani neštandardné funkcie poskytované inými implementáciami JavaScriptu.
  • Nashorn nebude obsahovať API doplnku prehľadávača.
  • Nashorn nebude obsahovať podporu pre DOM / CSS ani žiadne súvisiace knižnice (napríklad jQuery, Prototype alebo Dojo).
  • Nashorn nebude obsahovať priamu podporu ladenia.

Čo to znamená byť založený na ECMAScript-262, vydaní 5.1? Tu sa rozlišuje, že Rhino bolo založené na staršom, menej schopnom vydaní 3. The javax.script (JSR 223) API je na spätné volanie do JavaScriptu z Javy.

Chýbajúca podpora ladenia v Nashorne je krokom späť od Rhina, ktoré má svoj vlastný debugger JavaScriptu. Riešenie tohto zámerného vynechania však nájdete minimálne v dvoch populárnych IDE.

Nástroje príkazového riadku Nashorn: Inštalácia súborov jjs a jrunscript

Po prečítaní o nástroji príkazového riadku Nashorn, jjs, Dychtil som vyskúšať shell na mojom iMacu, ale po inštalácii Java 8 nebol k dispozícii pre bash shell. Ukázalo sa, že dokumentácia a implementácia neboli úplne synchronizované.

Vedel som, že inštalácia bola úspešná:

 > java -version java verzia "1.8.0" Java (TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot (TM) 64-bitový server VM (build 25.0-b70, zmiešaný režim) 

ale beh jjs vrátený -bash: jjs: príkaz sa nenašiel. Trochu popichovanie ma priviedlo k / usr / bin / adresár:

 > ktorá java / usr / bin / java 

Tam som našiel niečo, čo sa volá jrunscript, ktorý sa ukázal byť variantom jjs ktorý spúšťa extra štartovací skript. To ma malo uspokojiť, ale bol som zmätený, prečo to zdokumentované jjs nástroj nebol nainštalovaný v / usr / bin / so zvyškom modulu runtime Java 8. Malý výskum ma priviedol k tomu, aby som sa pozrel na JavaVirtualMachines inštalácia pre Java 8. V systéme Mac vyhľadajte jjs v /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/ alebo /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/.

Môžete definovať alias pre jjs v druhom adresári a pridajte ho do svojej konfigurácie shellu, ak ho potrebujete na skriptovanie v systéme Mac alebo Linux. Na PC môžete pridať správne jre / bin / adresár do vášho CESTA. Vo svojom videu zo spustenia Java 8 navrhuje Jim Laskey kopírovanie jjs do / usr / bin / adresár, ale keď som to urobil, našiel som to jjs sa za behu nepodarilo správne nájsť JRE.

Spúšťanie skriptov JavaScript

Prečo dva nástroje príkazového riadku na spúšťanie skriptov JavaScript? Nie je mi úplne jasné, čo si vývojový tím myslel, ale jjs má schopnosti, ktoré jrunscript nie, a jrunscript má inicializačný súbor. Ďalej uvádzame niekoľko jednoduchých príkladov jjs a jrunscript použitie.

 $ jrunscript nashorn> alert ("ahoj"); chyba skriptu: ReferenceError: "výstraha" nie je definovaná v riadku číslo 1 

Toto nefunguje, pretože upozornenie () je funkcia prehliadača / DOM. D'oh! Mohol som však prisahať, že to fungovalo v Rhine.

 nashorn> print ("Dobrý deň,"); Ahoj, 

To funguje, pretože print () je základná funkcia JavaScriptu.

 nashorn> var a = 1; nashorn> var b = "1"; nashorn> print (a + b); 11 nashorn> tlač (a + a); 2 nashorn> quit (); $ 

Inými slovami, pre JavaScript tu máme základné prostredie REPL (príkazový riadok read-execute-print-loop). Ak ste prekvapení odpoveďou na otázku a + b, zváž toto:

 nashorn> print (typ písma (a + b)); struna 

To je očarujúci vedľajší efekt voľného písania a preťaženia operátora „+“ v JavaScripte. Je to správne správanie podľa špecifikácie JavaScriptu, nie chyba.

Nashorn podporuje znak „#“ ako značku komentára na začiatku riadku, takže jjs a jrunscript možno použiť v spustiteľných skriptoch „shebang“ napísaných v JavaScripte. V systéme Mac alebo Linux musíte súbor JavaScript označiť ako spustiteľný pomocou obslužného programu chmod, aby bol spustiteľný.

Skriptovací režim nájdete v jjs že jrunscript Zdá sa, že chýba. V skriptovacom režime sa výrazy vo vnútri zadných kliešťov odovzdávajú do vonkajšieho plášťa na vyhodnotenie:

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

Režim skriptovania tiež umožňuje rozšírenie pre „heredocs“, čo sú v podstate viacriadkové reťazce vo formáte známom programátorom Perl a Ruby.

Mimochodom, klávesy so šípkami na klávesnici Mac nepracujú správne na úpravy riadkov v jjs škrupina. Ale je tu hack za to: Môžete variť nainštalovať rlwrap a použite to ako súčasť svojho aliasu pre jjs vo vašom .bashrc alebo .zshrc spis.

Volanie JavaScriptu z Javy

Ak chcete volať program Nashorn JavaScript z programu Java 8, musíte v zásade vytvoriť nový ScriptEngineManager inštancie a použiť to ScriptEngineManager načítať skriptový stroj Nashorn podľa názvu. (Podrobný súhrn načítania a ladenia Nashornu nájdete v tejto otázke Stack Overflow.)

Nakoniec môžete motoru Nashorn odovzdať súbor alebo reťazec na vyhodnotenie:

 import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; ... vyskúšajte {ScriptEngineManager factory = nový ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("load (\" "+" src "+" / "+" javascript_sample "+" / "+" test1.js "+" \ ");"); } catch (Exception ex) {// ...} ... try {ScriptEngineManager factory = new ScriptEngineManager (); ScriptEngine engine = factory.getEngineByName ("nashorn"); engine.eval ("funkcia hi () {\ nvar a = 'PROSPER'.toLowerCase (); \ nmiddle (); \ nprint (' Live long a '+ a)} \ n funkcia middle () {\ n var b = 1; pre (var i = 0, max = 5; i

Upozorňujeme, že skripty sa dajú kedykoľvek vygenerovať ScriptException chyby, takže ich musíte zachytiť.

Volanie Javy z JavaScriptu

Volanie Javy z Nashornu je asi také ľahké, ako to môže byť, pretože knižnice triedy Java 8 sú zabudované do Nashornu:

 print (java.lang.System.currentTimeMillis ()); var súbor = nový java.io.File ("sample.js"); print (file.getAbsolutePath ()); print (file.absolutePath); 

Upozorňujeme, že Nashorn nedováža java balík štandardne, pretože odkazy na String alebo Objekt konflikt s príslušnými typmi v JavaScripte. Preto je reťazec Java java.lang.String, nie String.

Nashorn a JavaFX

Ak sa dovoláš jjs s -fx prepínač, umožní vám vo vašich aplikáciách Nashorn používať vizuálne triedy JavaFX. Napríklad nasledujúci príklad z dokumentácie Oracle zobrazuje tlačidlo JavaFX:

 var Button = javafx.scene.control.Button; var StackPane = javafx.scene.layout.StackPane; var Scene = javafx.scene.Scene; function start (primaryStage) {primaryStage.title = "Hello World!"; var button = new Button (); button.text = "Povedzte 'Hello World'"; button.onAction = function () print ("Hello World!"); var root = new StackPane (); root.children.add (tlačidlo); primaryStage.scene = nová scéna (root, 300, 250); primaryStage.show (); } 

Ladenie Nashornu

Už som spomenul, že Nashorn neobsahuje vlastný debugger. Našťastie NetBeans 8 aj IntelliJ IDEA 13.1 podporujú ladenie skriptu Nashorn. Otázka Stack Overflow, ktorú som už spomínal, obsahuje užitočný projekt NetBeans 8, ktorý môžete použiť ako ukážku. Zistíte, že jednoduché použitie položky ladenia z rozbaľovacej ponuky súborov JavaScriptu vám umožní ladiť kód Nashorn.

V aplikácii IntelliJ IDEA 13 môžete nastaviť body prerušenia v súboroch Java a Nashorn JavaScript pomocou rovnakej klávesovej skratky (Com / Ctrl-F8). Keď narazíte na bod prerušenia JavaScriptu, získate všetky obvyklé informácie o ladení.

Nashorn bol navrhnutý ako lepšia a rýchlejšia náhrada za starý motor Rhino a je väčšinou úspešný. Má niekoľko menších bradavíc, ktoré dúfam budú v ďalšie aktualizácie opravené, ale zatiaľ existujú rozumné hacky, ktoré vám umožnia efektívne používať Nashorn vo svojich projektoch.

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