Contenu connexe
Similaire à Nashorn: JavaScript Running on Java VM (English) (20)
Nashorn: JavaScript Running on Java VM (English)
- 1. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.1
JavaScript Running On
JavaVM: Nashorn
NISHIKAWA, Akihiro
Oracle Corporation Japan
- 2. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.2
The following is intended to outline our general product direction. It
is intended for information purposes only, and may not be
incorporated into any contract.
It is not a commitment to deliver any material, code, or functionality,
and should not be relied upon in making purchasing decisions. The
development, release, and timing of any features or functionality
described for Oracle’s products remains at the sole discretion of
Oracle.
- 3. 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 in the future
- 5. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.5
Nashorn
JavaScript Engine running on Java VM
- 6. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.6
Nashorn
JavaScript Engine running on Java VM
- 7. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.7
Backgrounds
Replacing Rhino
– Concerns about security, performance, and so on
Proof of Concept for InvokeDynamic (JSR-292)
Atwood's law
Any application that can be written in JavaScript will
eventually be written in JavaScript.
- 8. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.8
Scope of Project Nashorn
JEP 174
ECMAScript-262 Edition 5.1 compliant
Support for javax.script (JSR 223) API
Interaction between Java and JavaScript
Newly introduced command line tool (jjs)
- 9. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.9
Java VM
Scripting Engine
(Nashorn)
Scripting API
(JSR-223)
JavaScript codeJava code
Other runtime
Other APIs jjs
- 10. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.10
$JAVA_HOME/bin/jjs
$JAVA_HOME/jre/lib/ext/nashorn.jar
- 11. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.11
ECMAScript-262 Edition 5.1 compliant
- 12. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.12
Out of scope of Project Nashorn
ECMAScript 6 (Harmony)
– Generators
– Destructuring assignment
– const, let, ...
DOM/CSS and related libraries
– jQuery, Prototype, Dojo, …
Browser API and browser emulator
– HTML5 canvas, HTML5 audio, WebGL, WebWorkers...
- 14. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.14
Invoke Nashorn from Java
ScriptEngineManager manager
= new ScriptEngineManager();
ScriptEngine engine
= manager.getEngineByName("nashorn");
engine.eval("print('hello world')");
engine.eval(new FileReader("hello.js"));
- 15. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.15
Invoke Nashorn from Java
Invoke script function from Java
engine.eval("function hello(name) {
print('Hello, ' + name)}");
Invocable inv=(Invocable)engine;
Object obj=
inv.invokeFunction("hello","Taro");
- 16. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.16
Invoke Nashorn from Java
Implement an interface with script function
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();
- 17. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.17
Invoke Java/JavaFX from Nashorn
print(java.lang.System.currentTimeMillis());
jjs -fx ...
- 18. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.18
Nashorn for Scripting
Additional feature for scripting use
-scripting option
Here document
Back quote
String Interpolation
...
- 19. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.19
Nashorn Extensions
- 20. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.20
Nashorn Extensions
The following topics are covered in this session.
How to get references of Java type
How to access properties of Java objects
Relationship among Lambda, SAM, and Script function
Scope and context
- 22. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.22
How to get references of Java type
Expression in Rhino (This expression is valid in Nashorn)
var hashmap=new java.util.HashMap();
Or
var HashMap=java.util.HashMap;
var hashmap=new HashMap();
- 23. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.23
How to get references of Java type
Recommended expression in Nashorn
var HashMap=Java.type('java.util.HashMap');
var hashmap=new HashMap();
- 24. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.24
Java.type
Class or Package?
java.util.ArrayList
java.util.Arraylist
- 25. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.25
Java Array
Expression in 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);
- 26. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.26
Java Array
Expression in Nashorn
var intArray=new(Java.type("int[]"))(5);
var intArrayType=Java.type("int[]");
var intArray=new intArrayType(5);
- 27. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.27
Access properties of
Java objects
- 28. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.28
Using getter and setter
var HashMap=Java.type('java.util.HashMap');
var map=new HashMap();
map.put('size', 2);
print(map.get('size')); // 2
- 29. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.29
Directly
var HashMap=Java.type('java.util.HashMap');
var map=new HashMap();
map.size=3;
print(map.size); // 3
print(map.size()); // 1
- 30. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.30
Using Associative Array
var HashMap=Java.type('java.util.HashMap');
var map=new HashMap();
map['size']=4;
print(map['size']); // 4
print(map['size']()); // 1
- 31. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.31
Lambda, SAM,
and Script function
- 32. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.32
Lambda, SAM, and Script function
Nashorn converts a script function to a lambda object or any SAM
interface implementing object automatically.
var timer=new java.util.Timer();
timer.schedule(
function() { print('Tick') }, 0, 1000);
java.lang.Thread.sleep(5000);
timer.cancel();
- 33. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.33
Lambda, SAM, and Script function
Any Java object which is an instance of lambda type can be treated like a
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 like Script function
- 34. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.34
Scope and Context
- 35. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.35
Scope and Context
load and loadWithNewGlobal
load
– Load scripts in the same global scope.
– If same name variables are in the original scripts and
loaded scripts, Corruption of each variable may happen.
loadWithNewGlobal
– Load scripts in another global scope newly created.
– Even if same name variables are in the original scripts
and loaded scripts, Corruption of each variable may not
happen.
- 36. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.36
Scope and Context
ScriptContext contains one or more Bindings each associated each jsr223
"scope".
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);
- 37. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.37
Scope and Context
Using with clause and JavaImporter
with(new JavaImporter(java.util, java.io)){
var map=new HashMap(); //java.util.HashMap
map.put("js", "javascript");
map.put("java", "java");
print(map);
....
}
- 38. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.38
Others
Convert between Java array and JavaScript array
– Java.from
– Java.to
Extend Java class and access super-class
– Java.extend
– Java.super
and so on...
- 39. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.39
Server Side JavaScript
- 40. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.40
Java EE for Next Generation Applications
Deliver HTML5, Dynamic and Scalable Applications
WebSockets
Avatar
- 41. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.41
Evolution of Web application architecture
Request-Response and Multi-page application
Java EE/JVM
Presentation
(Servlet/JSP)
Business
Logic
Backend
ConnectivityBrowser
- 42. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.42
Evolution of Web application architecture
Use Ajax (JavaScript)
Java EE/JVM
Connectivity
(REST, SSE)
Presentation
(Servlet/JSP, JSF)
Business
Logic
Backend
ConnectivityBrowser
JavaScript
- 43. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.43
Modern Web application architecture
Rather connectivity than Presentation – Single Page Application
Java EE/JVM
Connectivity
(WebSocket,
REST, SSE)
Presentation
(Servlet/JSP, JSF)
Business
Logic
Backend
ConnectivityBrowser
View
Controller
JavaScript
- 44. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.44
How about Node.js?
- 45. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.45
Mobile-enabled existing services with Node.js
Node.js
JavaScript
REST
SSE
WebSocket
Browser
View
Controller
JavaScript
- 46. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.46
How about
Node.js on JVM?
- 47. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.47
Mobile-enabled existing services with Node
Node running on Java VM
Java EE/JVM
Node
Server
Business
Logic
Backend
Connectivity
Client
JavaScriptBrowser
View
Controller
JavaScript
- 49. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.49
Avatar.js
Old name is "node.jar"
Able to use almost all of modules available on Node.js
– Express, async, socket.io, ...
Some modules are required to modify.
– Automatically recognize modules downloaded with
npm.
Pros.
– Leverage node programming model
– Leverage existing Java assets, knowledge, and tools
- 50. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.50
Avatar.js = Node + Java
Leverage Java technologies including Threads
JavaJavaScript
com.myOrg.myObj
java.util.SortedSet
java.lang.Thread
require('async')
postEvent
Node App
- 52. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.52
Avatar
Server side JavaScript services framework
Provide data transmission features via REST, WebSocket,
and Server Sent Event (SSE)
Leverage event-driven programming model and
programming modules of Node.js
Integrate with Enterprise Features (Java EE)
- 53. 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)
Change
Notification
Data
- 54. 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
Architecture (Server Side)
Change
Notification
Data
- 55. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.55
Avatar Service
Java
JavaScript
HTTP Load Balancer
Services
Shared State
Services Services
Change
Notification
Data
- 56. 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
Architecture (Client Side)
Change
Notification
Data
HTTP
REST/WebSocket/SSE
Application
Views
Avatar Compiler
- 57. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.57
Avatar and Avatar.js
progress steadily.
- 58. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.58
Nashorn in the future
- 59. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.59
Nashorn in the future
Bytecode Persistence (JEP 194)
http://openjdk.java.net/jeps/194
Optimistic Typing
Others
- 61. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.61
Key takeaways
Nashorn
– Tightly integrated with Java
– Pay attention to different expression when migrating
artifacts from Rhino to Nashorn
– Progress steadily (performance improvement, new
features, compliant against new standards)
Server Side JavaScript
– Avatar.js and Avatar are on-going.
– Please feedback!
- 63. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.63
Source code walk through
Shell jjs uses mainly.
Compiler generates classes (bytecode) from sources.
Scanner Create tokens from sources.
Parser Create AST/IR from tokens.
IR Elements of scripts
Codegen Create script class bytecode from AST/IR
Objects Runtime elements (Object, String, Number, Date, RegExp)
Scripts Classes including codes for scripts
Runtime Runtime tasks
Linker Binds callees on runtime based on JSR-292 (InvokeDynamic)
Dynalink Searching for best methods (available across languages)
- 64. 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/
- 65. 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
nashorn-dev@openjdk.java.net
Blogs
– Nashorn - JavaScript for the JVM
http://blogs.oracle.com/nashorn/
– Nashorn Japan
https://blogs.oracle.com/nashorn_ja/
- 66. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.66
Avatar.js
Project Page
https://avatar-js.java.net/
Mailing List
users@avatar-js.java.net
- 67. Copyright © 2014, Oracle and/or its affiliates. All rights reserved.67
Avatar
Project Page
https://avatar.java.net/
Mailing List
users@avatar.java.net