Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 1
JavaScript Running On
JavaVM: Nashorn
NISHIKAWA, Akihiro
Oracle Corporation Japan
♯jdt2014_D1
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 3
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するも
のです。また、情報提供を唯一の目的とするものであり、いかなる契約に
も組み込むことはできません。以下の事項は、マテリアルやコード、機能を
提供することをコミットメント(確約)するものではないため、購買決定を行う
際の判断材料になさらないで下さい。オラクル製品に関して記載されてい
る機能の開発、リリースおよび時期については、弊社の裁量により決定さ
れます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の
社名、商品名等は各社の商標または登録商標である場合があります。
Agenda
Nashorn
Server Side JavaScript
Nashornの今後
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 5
Nashorn
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.
Project Nashornの主なスコープ
JEP 174
ECMAScript-262 Edition 5.1
javax.script (JSR 223) API
JavaとJavaScript間での相互呼び出し
新しいコマンドラインツール(
jjs)の導入
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
$JAVA_HOME/bin/jjs
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 11
未実装・未サポート
ECMAScript 6 (Harmony)
–
Generators
–
分割代入
(Destructuring assignment)
–
const, let, ...
DOM/CSSおよびDOM/CSS関連ライブラリ
–
jQuery, Prototype, Dojo, …
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 13
JavaからNashorn
ScriptEngineManager manager
= new ScriptEngineManager();
ScriptEngine engine
= manager.getEngineByName("nashorn");
engine.eval("print('hello world')");
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=
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();
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 17
NashornからJava
print(java.lang.System.currentTimeMillis());
jjs -fx ...
Nashorn for Scripting
Scripting用途で使えるように機能追加
-scriptingオプション
Here document
Back quote
String Interpolation
...
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 19
Nashorn Extensions
今日ご紹介するのは
Java typeの参照を取得
Javaオブジェクトのプロパティアクセス
Lamda、SAM、Script関数の関係
スコープおよびコンテキスト
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 21
Java.type
Rhinoでの表記(Nashornでも利用可)
var hashmap=new java.util.HashMap();
または
var HashMap=java.util.HashMap;
var hashmap=new HashMap();
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();
Java.type
Class or Package?
java.util.ArrayList
java.util.Array
l
ist
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);
Java配列
Nashornでの表記
var intArray=new(
Java.type
("int[]"))(5);
var intArrayType=
Java.type
("int[]");
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 27
getter/setter
var HashMap=Java.type('java.util.HashMap');
var map=new HashMap();
map.put('size', 2);
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
連想配列
var HashMap=Java.type('java.util.HashMap');
var map=new HashMap();
map['size']
=4;
print(
map['size']
); // 4
print(map['size']()); // 1
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 31
Lambda, SAM,
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);
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
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 35
Scope and Context
load と loadWithNewGlobal
load
–
同じグローバル・スコープに
Scriptをロード
–
ロードした
Scriptにロード元のScriptと同じ名称の変数が存
在する場合、変数が衝突する可能性がある
loadWithNewGlobal
–
グローバル・スコープを新規作成し、そのスコープに
JavaScriptをロード
–
ロード元に同じ名前の変数があっても衝突しない
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");
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);
....
}
その他の
Nashorn Extensions
Java配列とJavaScript配列の変換
–
Java.from
–
Java.to
Javaクラスの拡張、スーパークラス・オブジェクトの取得
–
Java.extend
–
Java.super
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 39
Java EE for Next Generation Applications
HTML5に対応した、動的かつスケーラブルなアプリケーション提供のために
W
ebS
oc
ke
ts
Av
at
ar
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
Webアプリケーションアーキテクチャの進化
Ajax (JavaScript) の利用
Java EE/JVM
Connectivity
(REST, SSE)
Presentation
(Servlet/JSP, JSF)
Business
Logic
Backend
Connectivity
Browser
JavaScript
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
How about
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 45
既存サービスのモバイル対応例
Node.js
JavaScript
REST
SSE
WebSocket
Browser
View
Controller
JavaScript
Java EEと並べてJava
VM上で
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
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 49
Avatar.js
Node.jsで利用できるモジュールをほぼそのまま利用可能
–
Express、async、socket.ioなど
–
npmで取り込んだモジュールを認識
利点
–
Nodeプログラミングモデルの利用
–
既存資産、ナレッジ、ツールの活用
Avatar.js = Node + Java
Threadも含めたJavaテクノロジーを活用
Java
JavaScript
com.myorg.myObj
java.util.SortedSet
require(‘async’)
postEvent
Node App
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 51
Avatar
サーバーサイド
JavaScriptサービスフレームワーク
REST、WebSocket、Server Sent Event (SSE) での
データ送受信に特化
Node.jsのイベント駆動プログラミングモデルや
プログラミングモジュールを活用
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)
変更通知
データ
HTTP
REST/WebSocket/SSE
Avatar Compiler
Application
Views
*.html
*.js
*.css
Application
Services
Avatar Modules
Node Modules
Avatar.js
Avatar Runtime
アーキテクチャ
(Server)
変更通知
データ
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 55
Avatar Service
Java
Ja
va
Scr
ipt
HTTP Load Balancer
Services
Shared State
Services
Services
変更通知
データ
Avatar Runtime
Avatar Modules
Node Modules
Avatar.js
*.html
*.js
*.css
Application
Services
アーキテクチャ
(Client)
変更通知
データ
HTTP
REST/WebSocket/SSE
Application
Views
Avatar Compiler
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 57
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 59
Nashornの今後
Bytecode Persistence (JEP 194)
http://openjdk.java.net/jeps/194
Optimistic Typing
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 61
まとめ
Nashorn
–
Javaと緊密に統合
–
Rhinoからの移行にあたっては表記方法が変わっている箇
所があるので注意
–
今後も性能向上、機能追加、新しい仕様に対応
Server Side JavaScript
–
Avatar.js、Avatarは鋭意開発中
–
ぜひ
Feedbackを!
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) に基づきランタイムで呼び出し先をバインド
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/
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
Avatar.js
Project Page
https://avatar-js.java.net/
Mailing List
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 67
Avatar
Project Page
https://avatar.java.net/
Mailing List
[email protected]
Copyright © 2014, Oracle and/or its affiliates. All rights reserved. 69