Programování

Nashorn: JavaScript byl v Javě 8 skvělý

Nashorn, vyslovovaný jako „nass-horn“, je německý výraz pro „nosorožce“, a je to jeden z názvů zvířat pro německý stíhač tanků používaný ve druhé světové válce. Je to také název náhrady - zavedené v Javě 8 - za starý pomalý JavaScriptový stroj Rhino. Rhino i Nashorn jsou implementace jazyka JavaScript napsaného pro provoz na virtuálním stroji Java nebo JVM.

Povinná rantovka: JavaScript může mít jako součást názvu Java, ale oba jazyky se velmi liší v duchu a designu, stejně jako ve svých implementacích. Jedním ze způsobů implementace interpretů JavaScriptu je však kompilace JavaScriptu do bajtových kódů Java, k čemuž byly navrženy Rhino a Nashorn.

Pravděpodobně myslíte na JavaScript, pokud jde o skriptování webových prohlížečů, a z větší části byste měli pravdu. Používá se také pro servery. Například Node.js se používá k vytváření rychlých a lehkých serverů založených na enginu JavaScript V8 z Google Chrome. Stroje JavaScriptu ve webových prohlížečích mají přístup k modelu objektu dokumentu HTML (DOM) a mohou manipulovat s prvky HTML prostřednictvím modelu DOM. Vzhledem k tomu, že různé webové prohlížeče mají různé DOMs a JavaScriptové jádra, snaží se rámce jako jQuery skrýt podrobnosti implementace před programátorem.

Nashorn a Rhino před ním výslovně nepodporují DOM prohlížeče. Implementovány na JVM, jsou obvykle vyvolány pro skriptování koncových uživatelů v aplikacích Java. Nashorn a Rhino lze zabudovat do programů Java a použít jako skořápky příkazového řádku. Samozřejmě, další kouzlo, které potřebujete, když skriptujete Javu z JavaScriptu, překlenuje nesoulad dat a typů mezi těmito dvěma jazyky.

Problémy s Rhino

Vývoj Rhina začal v Netscape v roce 1997 kvůli nešťastnému projektu „Javagator“ a byl vydán na Mozilla.org v roce 1998. Poté byl licencován společnosti Sun a dalším. Upřímně, rok 1998 by mohl být obdobím Jurassic, jak pokračuje vývoj internetu - o 16 let později Rhino jasně ukázal svůj věk. Podle Jima Laskeyho z Oracle, hlavního vývojáře Nashornu:

Jsem si jistý, že je to všechno pravda, ale jako unaveného vývojáře a manažera vývoje považuji poslední větu za velmi zábavnou. Koneckonců, zásadní přepisy nejsou nikdy zábavné. Začít od nuly je vždy zábava.

Cíle Nashornu

Laskey popsal své cíle pro Nashorn následovně:

  • Nashorn bude založen na jazykové specifikaci ECMAScript-262 Edition 5.1 a musí projít testy shody ECMAScript-262.
  • Nashorn bude podporovat javax.script (JSR 223) API.
  • Bude poskytována podpora pro vyvolání kódu Java z JavaScriptu a pro Java pro vyvolání kódu JavaScript. To zahrnuje přímé mapování na JavaBeans.
  • Nashorn definuje nový nástroj příkazového řádku, jjs, pro vyhodnocení kódu JavaScript ve skriptech „shebang“, zde dokumenty a úpravy řetězců.
  • Výkon a využití paměti aplikací Nashorn by měly být výrazně lepší než u Rhina.
  • Nashorn nebude vystavovat žádná další bezpečnostní rizika.
  • Dodávané knihovny by měly při lokalizaci správně fungovat.
  • Chybové zprávy a dokumentace budou internacionalizovány.

Laskey také výslovně omezil rozsah projektu několika „necíli“:

  • Nashorn bude podporovat pouze ECMAScript-262 Edition 5.1. Nebude podporovat žádné funkce vydání 6 ani nestandardní funkce poskytované jinými implementacemi JavaScriptu.
  • Nashorn nebude obsahovat API plug-in prohlížeče.
  • Nashorn nebude zahrnovat podporu pro DOM / CSS ani žádné související knihovny (například jQuery, Prototype nebo Dojo).
  • Nashorn nezahrnuje podporu přímého ladění.

Co to znamená být založen na ECMAScript-262 vydání 5.1? Zde se odlišuje to, že Rhino bylo založeno na starší, méně schopné edici 3. The javax.script (JSR 223) API je pro zpětné volání do JavaScriptu z Javy.

Nedostatek podpory ladění v Nashornu je krok zpět od Rhina, které má svůj vlastní debugger JavaScriptu. Řešení tohoto záměrného vynechání však najdete alespoň ve dvou populárních IDE.

Nástroje příkazového řádku Nashorn: Instalace jjs a jrunscript

Po přečtení o nástroji příkazového řádku Nashorn, jjs, Dychtil jsem vyzkoušet shell na mém iMacu, ale po instalaci Java 8 nebyl k dispozici pro bash shell. Ukázalo se, že dokumentace a implementace nebyly úplně synchronizované.

Věděl jsem, že instalace byla úspěšná:

 > java -version java verze "1.8.0" Java (TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot (TM) 64bitový serverový VM (build 25.0-b70, smíšený režim) 

ale běží jjs vrátil -bash: jjs: příkaz nebyl nalezen. Trochu poskakování mě přivedlo k / usr / bin / adresář:

 > který java / usr / bin / java 

Tam jsem našel něco, čemu se říká jrunscript, který se ukázal být variantou jjs který spouští další spouštěcí skript. To mě mělo uspokojit, ale byl jsem zmatený, proč to zdokumentováno jjs nástroj nebyl nainstalován v / usr / bin / se zbytkem běhového prostředí Java 8. Malý průzkum mě vedl k pohledu na JavaVirtualMachines instalace pro Java 8. Na počítači Mac vyhledejte jjs v /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/ nebo /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/bin/.

Můžete definovat alias pro jjs v druhém adresáři a přidejte jej do své konfigurace shellu, pokud ji potřebujete pro skriptování v systému Mac nebo Linux. Na PC můžete přidat správné jre / bin / adresář do vašeho CESTA. Ve svém videu ze spuštění Java 8 navrhuje Jim Laskey kopírování jjs do / usr / bin / adresář, ale když jsem to udělal, našel jsem to jjs za běhu nemohl správně najít JRE.

Spouštění skriptů JavaScript

Proč dva nástroje příkazového řádku pro spouštění skriptů JavaScript? Nejsem si úplně jistý, co si vývojový tým myslel, ale jjs má schopnosti, které jrunscript ne, a jrunscript má inicializační soubor. Níže uvádíme několik jednoduchých příkladů jjs a jrunscript použití.

 $ jrunscript nashorn> alert ("ahoj,"); chyba skriptu: ReferenceError: "upozornění" není definováno v řádku číslo 1 

To nefunguje, protože výstraha () je funkce prohlížeče / DOM. D'oh! Mohl jsem však přísahat, že to v Rhinu fungovalo.

 nashorn> print ("Dobrý den,"); Ahoj, 

To funguje, protože print () je základní funkce JavaScriptu.

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

Jinými slovy, zde máme základní prostředí REPL (read-execute-print-loop command-line) pro JavaScript. Pokud vás odpověď překvapila a + b, zvaž toto:

 nashorn> print (typeof (a + b)); tětiva 

To je okouzlující vedlejší efekt volného psaní a přetížení operátoru „+“ v JavaScriptu. Je to správné chování podle specifikace JavaScriptu, ne chyba.

Nashorn podporuje znak „#“ jako značku komentáře na začátku řádku jjs a jrunscript lze použít ve spustitelných skriptech „shebang“ napsaných v JavaScriptu. V systému Mac nebo Linux budete muset označit soubor JavaScript jako spustitelný pomocí nástroje chmod, aby byl spustitelný.

Skriptovací režim najdete v jjs že jrunscript Zdá se, že chybí. Ve skriptovacím režimu jsou výrazy uvnitř zpětných značek předávány do vnějšího prostředí pro vyhodnocení:

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

Režim skriptování také umožňuje rozšíření pro „heredocs“, což jsou v podstatě víceřádkové řetězce ve formátu známém programátorům Perl a Ruby.

Mimochodem, klávesy se šipkami na klávesnici Mac nefungují správně pro úpravy řádků v jjs skořápka. Ale je tu hack za to: Můžete vařit nainstalovat rlwrap a použijte to jako součást svého aliasu pro jjs ve vašem .bashrc nebo .zshrc soubor.

Volání JavaScriptu z Javy

Chcete-li volat Nashorn JavaScript z programu Java 8, musíte v zásadě vytvořit nový ScriptEngineManager instance a použít to ScriptEngineManager načíst skriptovací stroj Nashorn podle názvu. (Podívejte se na tuto otázku přetečení zásobníku, kde najdete stručné shrnutí načítání a ladění Nashornu.)

Nakonec můžete motoru Nashorn předat soubor nebo řetězec k vyhodnocení:

 import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; ... zkuste {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 ("funkce hi () {\ nvar a = 'PROSPER'.toLowerCase (); \ nmiddle (); \ nprint (' Live long a '+ a)} \ n funkce middle () {\ n var b = 1; pro (var i = 0, max = 5; i

Skripty lze generovat vždy ScriptException chyby, takže je musíte chytit.

Volání Javy z JavaScriptu

Volání Javy z Nashornu je asi tak snadné, jak to může být, protože do Nashornu jsou zabudovány knihovny tříd Java 8:

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

Všimněte si, že Nashorn neimportuje Jáva balíček ve výchozím nastavení, protože odkazy na Tětiva nebo Objekt konflikt s odpovídajícími typy v JavaScriptu. Proto je řetězec Java řetězec java.lang, ne Tětiva.

Nashorn a JavaFX

Pokud vyvoláte jjs s -fx přepínač, umožní vám ve vašich aplikacích Nashorn používat vizuální třídy JavaFX. Například následující příklad z dokumentace Oracle zobrazuje tlačítko JavaFX:

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

Ladění Nashornu

Už jsem zmínil, že Nashorn neobsahuje vlastní debugger. Naštěstí jak NetBeans 8, tak IntelliJ IDEA 13.1 podporují ladění JavaScript Nashorn. Otázka přetečení zásobníku, kterou jsem zmínil dříve, obsahuje užitečný projekt NetBeans 8, který můžete použít jako ukázku. Zjistíte, že pouhé použití položky ladění z rozbalovací nabídky souborů JavaScriptu vám umožní ladit kód Nashorn.

V IntelliJ IDEA 13 můžete nastavit zarážky v souborech Java a Nashorn JavaScript pomocí stejné klávesové zkratky (Com / Ctrl-F8). Když narazíte na bod zlomu JavaScriptu, získáte všechny obvyklé informace o ladění.

Nashorn byl navržen jako lepší a rychlejší náhrada za starý motor Rhino a podle většiny opatření uspěl. Má několik menších bradavic, které, jak doufám, budou v budoucích aktualizacích opraveny, ale zatím existují rozumné hackery, které vám umožní efektivně používat Nashorn ve vašich projektech.

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