390 likes | 831 Views
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.
E N D
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 JDK with Scripting and built in Rhino Rhino (Separate download) 1.3 1.4 5.0 67 8
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 = newScriptEngineManager(); 2) Get a ScriptEngine object from the manager. ScriptEngineengine = factory.getEngineByName("JavaScript"); 3) Evaluate script using the ScriptEngine'seval methods. engine.eval("print('Hello, World')");
Invoking Script Functions and Methods String script = "function hello(name) {" + " return 'Hello, ' + name; " + }"; engine.eval(script); Invocableinv = (Invocable) engine; String val = (String) inv.invokeFunction("hello", "BBD!!"); System.out.println(val); >>Hello, BBD!!
Binding Java objects into script space Bindings bindings = newSimpleBindings(); bindings.put("author", new Person("Rory", "Preddy", 34)); engine.eval("print('Name:' + author.name)", bindings); >>Name: Rory
Callbacks … engine.put("cb", newJsCallback()); engine.eval("println('Doing something in javascript here first');" + "cb.apply('bar');"); } publicvoid 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); • newThread(r).start(); >>run called
Java Interfaces in JavaScript var r = newjava.lang.Runnable() { run: function() { print("running...\n"); } }; varth = newjava.lang.Thread(r); th.start(); >>running…
Compiling engine.put("counter", 0); CompilablecompEngine = (Compilable) engine; CompiledScriptscript = 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.Nooptimizations 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
InvokeDynamic Bytecode operations that were available before JDK version 7:
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: • invokedynamicbytecode instruction • MethodHandles • The first bytecode extension since 1999!
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
> jjs jjs> var x = 10, y = 20; jjs> x + y; >>30 Or > jjsexample.js Nashorn- Command Line
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 instanceofjava.lang.NullPointerException) // false!! print(e.javaExceptioninstanceofjava.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
Avatar.js (Node.jar) Supported module highlights • Implements the Node model and API on the JVM • Supports most Node modules
Summary – JavaScript Why bother? Why you care 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 • Server-side JavaScript • Leverage Existing JavaScript Libraries • Cross Platform scripting – Rhino runs on Android • Fast performance with Nashorn • Leverage new Node Libraries with Nashorn
Demo overview • JavaScript coding Demo • Credit card validation • Avatar Demo • Show and tell • Fibonacci numbers • Interest calculation • Groovy Examples