1 / 39

The Evolution of JavaScript: From Rhino to Nashorn & Beyond

Learn about the history of JavaScript, from its origins as a lightweight interpreted language to its advanced implementations like Rhino and Nashorn. Explore scripting basics, invoking functions, utilizing callbacks, and implementing Java interfaces in JavaScript. Discover the optimization and bytecode operations in Nashorn, invoking dynamic, and the dynamic nature of JavaScript in the JVM with JSR-292. Dive into Nashorn’s advantages over Rhino with direct bytecode compilation, faster performance, and improved typing.

jolenes
Download Presentation

The Evolution of JavaScript: From Rhino to Nashorn & Beyond

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. JavaScript on the VM Rory Preddy

  2. “Any application that can be written in JavaScript, will eventually be written in JavaScript” - Jeff Atwood (founder, stackoverflow.com)

  3. What we going to discuss today • Rhino on JDK 1.6 & 1.7 • Nashorn on Java 8 • Avatar.js - aka Node via Java

  4. 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

  5. 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

  6. Rhino

  7. 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!!!

  8. 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

  9. 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 …

  10. 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')");

  11. 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!!

  12. 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

  13. 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

  14. 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

  15. Java Interfaces in JavaScript var r = newjava.lang.Runnable() { run: function() { print("running...\n"); } }; varth = newjava.lang.Thread(r); th.start(); >>running…

  16. 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

  17. 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!

  18. 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

  19. Nashorn

  20. InvokeDynamic Bytecode operations that were available before JDK version 7:

  21. InvokeStatic

  22. The challenge • JavaScript is dynamic • Things can change at runtime • For example, what is the type of:var x =500000; • x *=500000; And now?

  23. 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!

  24. InvokeDynamic

  25. 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

  26. > jjs jjs> var x = 10, y = 20; jjs> x + y; >>30 Or > jjsexample.js Nashorn- Command Line

  27. 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

  28. 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 }

  29. 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

  30. Nashorn Vs Rhino

  31. Avatar.js

  32. Node

  33. Avatar.js (Node.jar)

  34. Avatar.js (Node.jar) Supported module highlights • Implements the Node model and API on the JVM • Supports most Node modules

  35. Avatar+ EJB = Avatar EE

  36. 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

  37. Demo

  38. Demo overview • JavaScript coding Demo • Credit card validation • Avatar Demo • Show and tell • Fibonacci numbers • Interest calculation • Groovy Examples

More Related