Slide 1

Slide 1 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 1 JavaScript Running On JavaVM: Nashorn NISHIKAWA, Akihiro Oracle Corporation Japan

Slide 2

Slide 2 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 2 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するも のです。また、情報提供を唯一の目的とするものであり、いかなる契約に も組み込むことはできません。以下の事項は、マテリアルやコード、機能を 提供することをコミットメント(確約)するものではないため、購買決定を行う 際の判断材料になさらないで下さい。オラクル製品に関して記載されてい る機能の開発、リリースおよび時期については、弊社の裁量により決定さ れます。 OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の 社名、商品名等は各社の商標または登録商標である場合があります。

Slide 3

Slide 3 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 3 Copyright © 2013, Oracle and/or its affiliates. All rights reserved. Agenda  Nashorn  Server Side JavaScript  Nashornの今後

Slide 4

Slide 4 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 4 Nashorn

Slide 5

Slide 5 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 5 Nashorn Compact1 Profileでも使えるJavaScript Engine

Slide 6

Slide 6 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 6 Nashorn Compact1 Profileでも使えるJavaScript Engine

Slide 7

Slide 7 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 7 登場の背景  Rhinoの置き換え – セキュリティ – パフォーマンス  InvokeDynamic (JSR-292) のProof of Concept  アトウッドの法則 Any application that can be written in JavaScript will eventually be written in JavaScript.

Slide 8

Slide 8 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 8 Project Nashornの主なスコープ JEP 174  ECMAScript-262 Edition 5.1  javax.script (JSR 223) API  JavaとJavaScript間での相互呼び出し  新しいコマンドラインツール(jjs)の導入

Slide 9

Slide 9 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 9 Java VM Scripting Engine (Nashorn) Scripting API (JSR-223) JavaScript code Java code Other runtime Other APIs jjs

Slide 10

Slide 10 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 10 $JAVA_HOME/bin/jjs $JAVA_HOME/jre/lib/ext/nashorn.jar

Slide 11

Slide 11 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 11 ECMAScript-262 Edition 5.1に100%対応

Slide 12

Slide 12 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 12 未実装・未サポート  ECMAScript 6 (Harmony) – Generators – 分割代入(Destructuring assignment) – const, let, ...  DOM/CSSおよびDOM/CSS関連ライブラリ – jQuery, Prototype, Dojo, …  ブラウザAPIやブラウザエミュレータ – HTML5 canvas, HTML5 audio, WebGL, WebWorkers...

Slide 13

Slide 13 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 13 実行例

Slide 14

Slide 14 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 14 JavaからNashorn ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); engine.eval("print('hello world')"); engine.eval(new FileReader("hello.js"));

Slide 15

Slide 15 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 15 JavaからNashorn JavaからScript functionを呼び出す engine.eval("function hello(name) { print('Hello, ' + name)}"); Invocable inv=(Invocable)engine; Object obj= inv.invokeFunction("hello","Taro");

Slide 16

Slide 16 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 16 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();

Slide 17

Slide 17 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 17 NashornからJava print(java.lang.System.currentTimeMillis()); jjs -fx ...

Slide 18

Slide 18 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 18 Nashorn for Scripting Scripting用途で使えるように機能追加  -scriptingオプション  Here document  Back quote  String Interpolation ...

Slide 19

Slide 19 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 19 Nashorn Extensions

Slide 20

Slide 20 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 20 Nashorn Extensions 今日ご紹介するのは  Java typeの参照を取得  Javaオブジェクトのプロパティアクセス  Lambda、SAM、Script関数の関係  スコープおよびコンテキスト

Slide 21

Slide 21 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 21 Java type

Slide 22

Slide 22 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 22 Java.type Rhinoでの表記(Nashornでも利用可) var hashmap=new java.util.HashMap(); または var HashMap=java.util.HashMap; var hashmap=new HashMap();

Slide 23

Slide 23 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 23 Java.type Nashornで推奨する表記 var HashMap=Java.type('java.util.HashMap'); var hashmap=new HashMap();

Slide 24

Slide 24 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 24 Java.type Class or Package? java.util.ArrayList java.util.Arraylist

Slide 25

Slide 25 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 25 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);

Slide 26

Slide 26 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 26 Java配列 Nashornでの表記 var intArray=new(Java.type("int[]"))(5); var intArrayType=Java.type("int[]"); var intArray=new intArrayType(5);

Slide 27

Slide 27 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 27 プロパティへのアクセス

Slide 28

Slide 28 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 28 getter/setter var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map.put('size', 2); print(map.get('size')); // 2

Slide 29

Slide 29 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 29 プロパティ var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map.size=3; print(map.size); // 3 print(map.size()); // 1

Slide 30

Slide 30 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 30 連想配列 var HashMap=Java.type('java.util.HashMap'); var map=new HashMap(); map['size']=4; print(map['size']); // 4 print(map['size']()); // 1

Slide 31

Slide 31 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 31 Lambda, SAM, and Script function

Slide 32

Slide 32 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 32 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();

Slide 33

Slide 33 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 33 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っぽく

Slide 34

Slide 34 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 34 Scope and Context

Slide 35

Slide 35 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 35 Scope and Context load と loadWithNewGlobal  load – 同じグローバル・スコープにScriptをロード – ロードしたScriptにロード元のScriptと同じ名称の変数が存 在する場合、変数が衝突する可能性がある  loadWithNewGlobal – グローバル・スコープを新規作成し、そのスコープに JavaScriptをロード – ロード元に同じ名前の変数があっても衝突しない

Slide 36

Slide 36 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 36 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);

Slide 37

Slide 37 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 37 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); .... }

Slide 38

Slide 38 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 38 その他のNashorn Extensions  Java配列とJavaScript配列の変換 – Java.from – Java.to  Javaクラスの拡張、スーパークラス・オブジェクトの取得 – Java.extend – Java.super など

Slide 39

Slide 39 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 39 Server Side JavaScript

Slide 40

Slide 40 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 40 Java EE for Next Generation Applications HTML5に対応した、動的かつスケーラブルなアプリケーション提供のために WebSockets Avatar

Slide 41

Slide 41 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 41 Webアプリケーションアーキテクチャの進化 Request-Response and Multi-page application Java EE/JVM Presentation (Servlet/JSP) Business Logic Backend Connectivity Browser

Slide 42

Slide 42 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 42 Webアプリケーションアーキテクチャの進化 Ajax (JavaScript) の利用 Java EE/JVM Connectivity (REST, SSE) Presentation (Servlet/JSP, JSF) Business Logic Backend Connectivity Browser JavaScript

Slide 43

Slide 43 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 43 今風のWebアプリケーションアーキテクチャ Presentationよりはむしろ接続性を重視 Java EE/JVM Connectivity (WebSocket, REST, SSE) Presentation (Servlet/JSP, JSF) Business Logic Backend Connectivity Browser View Controller JavaScript

Slide 44

Slide 44 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 44 How about Node.js?

Slide 45

Slide 45 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 45 既存サービスのモバイル対応例 Node.js JavaScript REST SSE WebSocket Browser View Controller JavaScript

Slide 46

Slide 46 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 46 How about Node.js on JVM?

Slide 47

Slide 47 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 47 既存サービスのモバイル対応例 NodeをJava VMで動作させよう Java EE/JVM Node Server Business Logic Backend Connectivity Client JavaScript Browser View Controller JavaScript

Slide 48

Slide 48 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 48 Avatar.js

Slide 49

Slide 49 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 49 Avatar.js  Node.jsで利用できるモジュールをほぼそのまま利用可能 – Express、async、socket.ioなど – npmで取り込んだモジュールを認識  利点 – Nodeプログラミングモデルの利用 – 既存資産、ナレッジ、ツールの活用

Slide 50

Slide 50 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 50 Avatar.js = Node + Java Threadも含めたJavaテクノロジーを活用 Java JavaScript com.myorg.myObj java.util.SortedSet java.lang.Thread require('async') postEvent Node App

Slide 51

Slide 51 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 51 Avatar

Slide 52

Slide 52 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 52 Avatar サーバーサイドJavaScriptサービスフレームワーク  REST、WebSocket、Server Sent Event (SSE) での データ送受信に特化  Node.jsのイベント駆動プログラミングモデルや プログラミングモジュールを活用  エンタープライズ機能(Java EE)との統合

Slide 53

Slide 53 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 53 *.html *.js *.css HTTP Application Services Avatar Modules Node Modules Avatar.js Avatar Runtime Avatar Compiler Server Runtime (Java EE) JDK 8 / Nashorn Application Views REST/WebSocket/SSE Avatar (Avatar EE) 変更通知 データ

Slide 54

Slide 54 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 54 HTTP REST/WebSocket/SSE Avatar Compiler Application Views *.html *.js *.css Application Services Avatar Modules Node Modules Avatar.js Avatar Runtime Server Runtime (Java EE) JDK 8 / Nashorn アーキテクチャ(Server) 変更通知 データ

Slide 55

Slide 55 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 55 Avatar Service Java JavaScript HTTP Load Balancer Services Shared State Services Services 変更通知 データ

Slide 56

Slide 56 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 56 Avatar Runtime Server Runtime (Java EE) Avatar Modules Node Modules Avatar.js *.html *.js *.css Application Services JDK 8 / Nashorn アーキテクチャ(Client) 変更通知 データ HTTP REST/WebSocket/SSE Application Views Avatar Compiler

Slide 57

Slide 57 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 57 Avatar and Avatar.js progress steadily.

Slide 58

Slide 58 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 58 Nashornの今後

Slide 59

Slide 59 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 59 Nashornの今後  Bytecode Persistence (JEP 194) http://openjdk.java.net/jeps/194  Optimistic Typing  その他

Slide 60

Slide 60 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 60 まとめ

Slide 61

Slide 61 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 61 まとめ  Nashorn – Javaと緊密に統合 – Rhinoからの移行にあたっては表記方法が変わっている箇 所があるので注意 – 今後も性能向上、機能追加、新しい仕様に対応  Server Side JavaScript – Avatar.js、Avatarは鋭意開発中 – ぜひFeedbackを!

Slide 62

Slide 62 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 62 Appendix

Slide 63

Slide 63 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 63 ソースコード 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 最適なメソッドを検索(言語間で動作)

Slide 64

Slide 64 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 64 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/

Slide 65

Slide 65 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 65 Nashorn http://openjdk.java.net/projects/nashorn/  OpenJDK wiki – Nashorn https://wiki.openjdk.java.net/display/Nashorn/Main  Mailing List [email protected]  Blogs – Nashorn - JavaScript for the JVM http://blogs.oracle.com/nashorn/ – Nashorn Japan https://blogs.oracle.com/nashorn_ja/

Slide 66

Slide 66 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 66 Avatar.js  Project Page https://avatar-js.java.net/  Mailing List [email protected]

Slide 67

Slide 67 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 67 Avatar  Project Page https://avatar.java.net/  Mailing List [email protected]

Slide 68

Slide 68 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 68

Slide 69

Slide 69 text

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 69