Download Document

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
JavaScript on the VM
Rory Preddy
“Any application that can be written in JavaScript, will eventually be
written in JavaScript”
- Jeff Atwood (founder, stackoverflow.com)
What we going to discuss today
• Rhino on JDK 1.6 & 1.7
• Nashorn on Java 8
• Avatar.js - aka Node via Java
In the Beginning - JavaScript
• Developed by Netscape as a portable version of
Java offering a lightweight interpreted language
• Developed under the name Mocha, officially
released as LiveScript in September 1995,
• Renamed JavaScript in December 1995 as a
marketing ploy to leverage off Java's popularity
• Even reserved Java’s keywords
• Standardized by ECMA International
JavaScript/Java Timeline
Nashorn and Avatar
invokeDynamic
Rhino
(Separate download)
1.3 1.4
5.0
JDK with Scripting
and built in Rhino
6
7
8
Rhino
In the Beginning - Rhino
• In 1997 Netscape wanted a browser written fully in
Java and so it needed an implementation of
JavaScript written in Java.
• Code named "Javagator", project was canned but
engine lived on
• Compiles JavaScript code to Java bytecodes in
either Interpreted or generated Java class files.
• Suffers from:
• Slow compile time
• Memory leaks
• Very unsecure!!!
Using Rhino - Command line and REPL
• jrunscript -e "print('hello world')“
• jrunscript -l js -f helloWorld.js
• jrunscript
js> print('Hello World\n');
>>Hello World
Using Scripting API - background
• “javax.script” package
• Use any JSR-223 compliant scripting language.
• Java SE 6 & 7 include Scripting API and Mozilla
Rhino as default engine
• Extensive list of available engines: Python, Ruby,
PHP, Groovy …
Script API Basics
1) Create a ScriptEngineManager object.
ScriptEngineManager factory = new ScriptEngineManager();
2) Get a ScriptEngine object from the manager.
ScriptEngine engine = factory.getEngineByName("JavaScript");
3) Evaluate script using the ScriptEngine's eval methods.
engine.eval("print('Hello, World')");
Invoking Script Functions and Methods
String script = "function hello(name) {" +
"
return 'Hello, ' + name; " +
}";
engine.eval(script);
Invocable inv = (Invocable) engine;
String val = (String) inv.invokeFunction("hello", "BBD!!");
System.out.println(val);
>>Hello, BBD!!
Binding Java objects into script space
Bindings bindings = new SimpleBindings();
bindings.put("author", new Person("Rory", "Preddy", 34));
engine.eval("print('Name:' + author.name)", bindings);
>>Name: Rory
Callbacks
…
engine.put("cb", new JsCallback());
engine.eval("println('Doing something in javascript here first');" +
"cb.apply('bar');");
}
public void apply(String s){
System.out.println("Back in java code here: " + s);
}
…
>>Doing something in javascript here first
>>Back in java code here: bar
Implementing Java Interfaces by Scripts
String script =
"function run() { "
+ "println('run called'); "
+ "}";
engine.eval(script);
Runnable r = ((Invocable) engine).getInterface(Runnable.class);
new Thread(r).start();
>>run called
Java Interfaces in JavaScript
var r = new java.lang.Runnable() {
run: function() {
print("running...\n");
}
};
var th = new java.lang.Thread(r);
th.start();
>>running…
Compiling
engine.put("counter", 0);
Compilable compEngine = (Compilable) engine;
CompiledScript script = compEngine.compile(
“ function count(){
counter=counter+1;
return counter;
};
count();");
System.out.println(script.eval());
System.out.println(script.eval());
…
>>1.0
>>2.0
Compiling with Rhino
cat test.js
java.lang.System.out.println("hi, mom!");
java org.mozilla.javascript.tools.jsc.Main test.js
ls *.class
test.class
java test
>>hi, mom!
Optimization
• Rhino optimizer not standard with JDK
• Runtime optimization of compilation can be set from -1 to 9
-1
Interpretive mode is always used. No class files are generated,
0
Basic Compilation.No optimizations are performed. The compiler runs fastest in this
mode, but the generated byte code is less efficient
1-9
All optimizations are performed. Java Class Files generated
Nashorn
InvokeDynamic
Bytecode operations that were available before JDK version 7:
Opcode
Usage
Invokestatic
For static methods
Invokevirtual
For non-private instance methods
Invokespecial
For private instance
Invokeinterface For the receiver that implements the interface
InvokeStatic
The challenge
• JavaScript is dynamic
– Things can change at runtime
• For example, what is the type of:
var x = 500000;
• x *= 500000;
And now?
Enter JSR 292
• Based on an experimental project, the Da
Vinci Machine
• Adds two new concepts to the JVM:
– invokedynamic bytecode instruction
– MethodHandles
• The first bytecode extension since 1999!
InvokeDynamic
Nashorn
• NO COMILATION! - Compiles JavaScript
directly into byte code
• 20x faster than uncompiled Rhino
• Better typing
• Smaller footprint
• 100% compliant with ECMA-262 5.1
• Standard JSR-223 syntax
Nashorn- Command Line
> jjs
jjs> var x = 10, y = 20;
jjs> x + y;
>>30
Or
> jjs example.js
Rhino VS Nashorn - Types
…
engine.eval("function test() { return 1; };");
Object result = ((Invocable)engine).invokeFunction("test");
System.out.println(result.getClass().getName());
//Rhino output
>>>java.lang.Double
// Nashorn output
>>>java.lang.Integer
Rhino VS Nashorn - Exceptions
// in rhino.js !!
try {
java.lang.System.loadLibrary(null)
} catch (e) {
print(e instanceof java.lang.NullPointerException)
//
false!!
print(e.javaException instanceof java.lang.NullPointerException)
//
}
true
Lambdas in Nashorn
var list = java.util.Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
var odd = list.stream().filter(function(i) {
return i % 2 == 0;
});
odd.forEach(function(i) {
print(">>> " + i);
});
>>> 2
>>> 4
>>> 6
>>> 8
Nashorn Vs Rhino
Avatar.js
Node
Avatar.js (Node.jar)
Avatar.js (Node.jar)
Supported module highlights
• Implements the Node
model and API on the
JVM
• Supports most Node
modules
Avatar+ EJB = Avatar EE
Summary – JavaScript Why bother?
Why you care
• Server-side JavaScript
• Leverage Existing
JavaScript Libraries
• Cross Platform scripting –
Rhino runs on Android
• Fast performance with
Nashorn
• Leverage new Node
Libraries with Nashorn
Why Oracle cares
• Atwood’s law
• Node.js
– A real threat to Java’s
server-side growth
• Let developers handle
typing with
invokedynamic
– Jruby, Jython
Demo
Demo overview
• JavaScript coding Demo
• Credit card validation
• Avatar Demo
• Show and tell
• Fibonacci numbers
• Interest calculation
• Groovy Examples
Related documents