1
JavaScript Running On JavaVM: Nashorn NISHIKAWA, Akihiro Oracle Corporation Japan jdt2014_d1
以 下 の 事 項 は 弊 社 の 一 般 的 な 製 品 の 方 向 性 に 関 する 概 要 を 説 明 するも のです また 情 報 提 供 を 唯 一 の 目 的 とするものであり いかなる 契 約 に も 組 み 込 むことはできません 以 下 の 事 項 は マテリアルやコード 機 能 を 提 供 することをコミットメント( 確 約 )するものではないため 購 買 決 定 を 行 う 際 の 判 断 材 料 になさらないで 下 さい オラクル 製 品 に 関 して 記 載 されてい る 機 能 の 開 発 リリースおよび 時 期 については 弊 社 の 裁 量 により 決 定 さ れます OracleとJavaは Oracle Corporation 及 びその 子 会 社 関 連 会 社 の 米 国 及 びその 他 の 国 における 登 録 商 標 です 文 中 の 社 名 商 品 名 等 は 各 社 の 商 標 または 登 録 商 標 である 場 合 があります 3
Agenda Nashorn Server Side JavaScript Nashornの 今 後 4 Copyright 2014, 2013, Oracle and/or its affiliates. All rights reserved.
Nashorn 5
Nashorn Compact1 Profileでも 使 えるJavaScript Engine 6
登 場 の 背 景 Rhinoの 置 き 換 え セキュリティ パフォーマンス InvokeDynamic (JSR-292) のProof of Concept アトウッドの 法 則 Any application that can be written in JavaScript will eventually be written in JavaScript. 7
Project Nashornの 主 なスコープ JEP 174 ECMAScript-262 Edition 5.1 javax.script (JSR 223) API JavaとJavaScript 間 での 相 互 呼 び 出 し 新 しいコマンドラインツール(jjs)の 導 入 8
Java code Other APIs Other runtime JavaScript code Scripting API jjs (JSR-223) Scripting Engine (Nashorn) Java VM 9
$JAVA_HOME/bin/jjs $JAVA_HOME/jre/lib/ext/nashorn.jar 10
ECMAScript-262 Edition 5.1に100% 対 応 11
未 実 装 未 サポート ECMAScript 6 (Harmony) Generators 分 割 代 入 (Destructuring assignment) const, let,... DOM/CSSおよびDOM/CSS 関 連 ライブラリ jquery, Prototype, Dojo, ブラウザAPIやブラウザエミュレータ HTML5 canvas, HTML5 audio, WebGL, WebWorkers... 12
実 行 例 13
JavaからNashorn ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getenginebyname("nashorn"); engine.eval("print('hello world')"); engine.eval(new FileReader("hello.js")); 14
JavaからNashorn JavaからScript functionを 呼 び 出 す engine.eval("function hello(name) { print('hello, ' + name); }"); Invocable inv=(invocable)engine; Object obj= inv.invokefunction("hello","taro"); 15
JavaからNashorn Script functionでinterfaceを 実 装 する engine.eval("function run(){ print('run() called'); }"); Invocable inv =(Invocable)engine; Runnable r=inv.getinterface(runnable.class); Thread th=new Threads(r); th.start(); th.join(); 16
NashornからJava print(java.lang.system.currenttimemillis()); jjs -fx... 17
Nashorn for Scripting Scripting 用 途 で 使 えるように 機 能 追 加 -scriptingオプション Here document Back quote String Interpolation... 18
Nashorn Extensions 19
Nashorn Extensions 今 日 ご 紹 介 するのは Java typeの 参 照 を 取 得 Javaオブジェクトのプロパティアクセス Lamda SAM Script 関 数 の 関 係 スコープおよびコンテキスト 20
Java type 21
Java.type Rhinoでの 表 記 (Nashornでも 利 用 可 ) var hashmap=new java.util.hashmap(); または var HashMap=java.util.HashMap; var hashmap=new HashMap(); 22
Java.type Nashornで 推 奨 する 表 記 var HashMap=Java.type('java.util.HashMap'); var hashmap=new HashMap(); 23
Java.type Class or Package? java.util.arraylist java.util.arraylist 24
Java 配 列 Rhinoでの 表 記 var intarray= java.lang.reflect.array.newinstance( java.lang.integer.type, 5); var Array=java.lang.reflect.Array; var intclass=java.lang.integer.type; var array=array.newinstance(intclass, 5); 25
Java 配 列 Nashornでの 表 記 var intarray=new(java.type("int[]"))(5); var intarraytype=java.type("int[]"); var intarray=new intarraytype(5); 26
プロパティへのアクセス 27
getter/setter var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map.put('size', 2); print(map.get('size')); // 2 28
プロパティ var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map.size=3; print(map.size); // 3 print(map.size()); // 1 29
連 想 配 列 var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map['size']=4; print(map['size']); // 4 print(map['size']()); // 1 30
Lambda, SAM, and Script function 31
Lambda, SAM, and Script function Script functionをlambdaオブジェクトやsamインターフェースを 実 装 するオブ ジェクトに 自 動 変 換 var timer=new java.util.timer(); timer.schedule( function() { print('tick') }, 0, 1000); java.lang.thread.sleep(5000); timer.cancel(); 32
Lambda, SAM, and Script function Lambda typeのインスタンスであるオブジェクトを Script functionのように 取 り 扱 う var JFunction= Java.type('java.util.function.Function'); var obj=new JFunction() { // x->print(x*x) apply: function(x) { print(x*x) } } print(typeof obj); //function obj(9); // 81 Script functionっぽく 33
Scope and Context 34
Scope and Context load と loadwithnewglobal load 同 じグローバル スコープにScriptをロード ロードしたScriptにロード 元 のScriptと 同 じ 名 称 の 変 数 が 存 在 する 場 合 変 数 が 衝 突 する 可 能 性 がある loadwithnewglobal グローバル スコープを 新 規 作 成 し そのスコープに JavaScriptをロード ロード 元 に 同 じ 名 前 の 変 数 があっても 衝 突 しない 35
Scope and Context ScriptContextはBindingに 紐 付 いた 複 数 のスコープをサポート ScriptContext ctx=new SimpleScriptContext(); ctx.setbindings(engine.createbindings(), ScriptContext.ENGINE_SCOPE); Bindings enginescope= ctx.getbindings(scriptcontext.engine_scope); enginescope.put("x", "world"); engine.eval("print(x)", ctx); 36
Scope and Context スコープを 区 切 るためにJavaImporterをwithと 共 に 利 用 with(new JavaImporter(java.util, java.io)){ var map=new HashMap(); //java.util.hashmap map.put("js", "javascript"); map.put("java", "java"); print(map);... } 37
その 他 のNashorn Extensions Java 配 列 とJavaScript 配 列 の 変 換 Java.from Java.to Javaクラスの 拡 張 スーパークラス オブジェクトの 取 得 Java.extend Java.super など 38
Server Side JavaScript 39
Java EE for Next Generation Applications HTML5に 対 応 した 動 的 かつスケーラブルなアプリケーション 提 供 のために WebSockets Avatar 40
Webアプリケーションアーキテクチャの 進 化 Request-Response and Multi-page application Browser Presentation (Servlet/JSP) Business Logic Backend Connectivity Java EE/JVM 41
Webアプリケーションアーキテクチャの 進 化 Ajax (JavaScript) の 利 用 JavaScript Browser Connectivity (REST, SSE) Presentation (Servlet/JSP, JSF) Business Logic Backend Connectivity Java EE/JVM 42
今 風 のWebアプリケーションアーキテクチャ Presentationよりはむしろ 接 続 性 JavaScript View Controller Browser Connectivity (WebSocket, REST, SSE) Presentation (Servlet/JSP, JSF) Business Logic Backend Connectivity Java EE/JVM 43
How about using Node.js? 44
既 存 サービスのモバイル 対 応 例 JavaScript View Controller REST SSE WebSocket Node.js Browser JavaScript 45
Java EEと 並 べてJava VM 上 で Nodeを 動 かすのは? 46
既 存 サービスのモバイル 対 応 例 NodeをJava VMで 動 作 させてみる Client Server JavaScript View Controller Browser Node JavaScript Java EE/JVM Business Logic Backend Connectivity 47
Avatar.js 48
Avatar.js Node.jsで 利 用 できるモジュールをほぼそのまま 利 用 可 能 Express async socket.ioなど npmで 取 り 込 んだモジュールを 認 識 利 点 Nodeプログラミングモデルの 利 用 既 存 資 産 ナレッジ ツールの 活 用 49
Avatar.js = Node + Java Threadも 含 めたJavaテクノロジーを 活 用 require( async ) JavaScript Java Node App com.myorg.myobj postevent java.lang.thread java.util.sortedset 50
Avatar 51
Avatar サーバーサイドJavaScriptサービスフレームワーク REST WebSocket Server Sent Event (SSE) での データ 送 受 信 に 特 化 Node.jsのイベント 駆 動 プログラミングモデルや プログラミングモジュールを 活 用 エンタープライズ 機 能 (Java EE)との 統 合 52
Avatar (Avatar EE) *.html *.js *.css REST/WebSocket/SSE HTTP Application Views Avatar Runtime Application Services Avatar Modules Node Modules Avatar.js Avatar Compiler Server Runtime (Java EE) JDK 8 / Nashorn データ 変 更 通 知 53
アーキテクチャ(Server) *.html *.js *.css REST/WebSocket/SSE HTTP Application Views Avatar Runtime Application Services Avatar Modules Node Modules Avatar.js Avatar Compiler Server Runtime (Java EE) JDK 8 / Nashorn データ 変 更 通 知 54
Avatar Service HTTP Load Balancer JavaScript Services Services Services データ 変 更 通 知 Shared State Java 55
アーキテクチャ(Client) *.html *.js *.css REST/WebSocket/SSE HTTP Application Views Avatar Runtime Application Services Avatar Modules Node Modules Avatar.js Avatar Compiler Server Runtime (Java EE) JDK 8 / Nashorn データ 変 更 通 知 56
Avatar is not dead! 57
Nashornの 今 後 58
Nashornの 今 後 Bytecode Persistence (JEP 194) http://openjdk.java.net/jeps/194 Optimistic Typing その 他 59
まとめ 60
まとめ Nashorn Javaと 緊 密 に 統 合 Rhinoからの 移 行 にあたっては 表 記 方 法 が 変 わっている 箇 所 があるので 注 意 今 後 も 性 能 向 上 機 能 追 加 新 しい 仕 様 に 対 応 Server Side JavaScript Avatar.js Avatarは 鋭 意 開 発 中 ぜひFeedbackを! 61
Appendix 62
ソースコード Shell 主 としてjjsで 利 用 Compiler ソースからバイトコード (class) を 生 成 Scanner ソースからトークンを 作 成 Parser トークンからAST/IRを 作 成 IR スクリプトの 要 素 Codegen AST/IRからscript classのバイトコードを 生 成 Objects ランタイム 要 素 (Object String Number Date RegExp) Scripts スクリプト 用 のコードを 含 むclass Runtime ランタイムタスク 処 理 Linker JSR-292 (InvokeDynamic) に 基 づきランタイムで 呼 び 出 し 先 をバインド Dynalink 最 適 なメソッドを 検 索 ( 言 語 間 で 動 作 ) 63
Nashorn Documents http://wiki.openjdk.java.net/display/nashorn/nashorn+documentation Java Platform, Standard Edition Nashorn User's Guide http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nash orn/ Scripting for the Java Platform http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/ Oracle Java Platform, Standard Edition Java Scripting Programmer's Guide http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_ guide/ 64
Nashorn http://openjdk.java.net/projects/nashorn/ OpenJDK wiki Nashorn https://wiki.openjdk.java.net/display/nashorn/main Mailing List nashorn-dev@openjdk.java.net Blogs Nashorn - JavaScript for the JVM http://blogs.oracle.com/nashorn/ Nashorn Japan https://blogs.oracle.com/nashorn_ja/ 65
Avatar.js Project Page https://avatar-js.java.net/ Mailing List users@avatar-js.java.net 66
Avatar Project Page https://avatar.java.net/ Mailing List users@avatar.java.net 67
68
69