Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaScript on Scala -Nashorn-

JavaScript on Scala -Nashorn-

Introduction of Nashorn.
JavaScript runtime on JVM, also on Scala.

Avatar for petitviolet

petitviolet

May 16, 2016
Tweet

More Decks by petitviolet

Other Decks in Technology

Transcript

  1. What is Nashorn? • JavaScript runtime on JVM 㱺 JavaScript

    on Scala!!! • Project Nashorn • http://openjdk.java.net/projects/nashorn/
  2. Example https://goo.gl/1KrXoo object NashornExample extends App {
 val ENGINE_NAME =

    "nashorn"
 val engine = new ScriptEngineManager()
 .getEngineByName(ENGINE_NAME)
 .asInstanceOf[ScriptEngine with Invocable]
 
 val fName = "func"
 val f = s"function $fName(a, b) { return a + b; };"
 engine.asInstanceOf[Compilable].compile(f).eval()
 
 val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] }
 val result = engine.invokeFunction(fName, argments:_*)
 println(s"result => $result")
 }
  3. object NashornExample extends App {
 val ENGINE_NAME = "nashorn"
 val

    engine = new ScriptEngineManager()
 .getEngineByName(ENGINE_NAME)
 .asInstanceOf[ScriptEngine with Invocable]
 
 val fName = "func"
 val f = s"function $fName(a, b) { return a + b; };"
 engine.asInstanceOf[Compilable].compile(f).eval()
 
 val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] }
 val result = engine.invokeFunction(fName, argments:_*)
 println(s"result => $result")
 } Preparation Example https://goo.gl/1KrXoo
  4. object NashornExample extends App {
 val ENGINE_NAME = "nashorn"
 val

    engine = new ScriptEngineManager()
 .getEngineByName(ENGINE_NAME)
 .asInstanceOf[ScriptEngine with Invocable]
 
 val fName = "func"
 val f = s"function $fName(a, b) { return a + b; };"
 engine.asInstanceOf[Compilable].compile(f).eval()
 
 val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] }
 val result = engine.invokeFunction(fName, argments:_*)
 println(s"result => $result")
 } Compilation Example https://goo.gl/1KrXoo
  5. object NashornExample extends App {
 val ENGINE_NAME = "nashorn"
 val

    engine = new ScriptEngineManager()
 .getEngineByName(ENGINE_NAME)
 .asInstanceOf[ScriptEngine with Invocable]
 
 val fName = "func"
 val f = s"function $fName(a, b) { return a + b; };"
 engine.asInstanceOf[Compilable].compile(f).eval()
 
 val argments = Seq(1, 2) map { _.asInstanceOf[AnyRef] }
 val result = engine.invokeFunction(fName, argments:_*)
 println(s"result => $result")
 } Execution Example https://goo.gl/1KrXoo
  6. Procedure • Preparation • create ScriptEngine • Compilation • compile

    String as a JavaScript function • Execution • feed AnyRef arguments to ScriptEngine
  7. ↑↑↑ʘ(^o^)ʗ↑↑↑ • Store JavaScript functions in DB as Strings •

    Use stored functions as Scala function! • Enable replacing algorithms dynamically • e.g. Scoring, Sorting, Selection, …
  8. ↓↓↓ʗ(^o^)ʘ↓↓↓ • Static typing(Scala) <=> Dynamic typing(JS) • lose type

    information • Unexpected input causes unexpected output • e.g. null, NaN, Infinity, ReferenceError, … • Cannot avoid such results with compilation • Runtime!!!
  9. Lose type information? • No • Can use Java types

    in JavaScript • Java.Type(“<package.className>”) • https://docs.oracle.com/javase/jp/8/docs/technotes/guides/scripting/nashorn/api.html • Enable casting a result of execution • asInstanceOf[T] • https://gist.github.com/petitviolet/4c446066da25c150a0eb50b39b4522d3