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.

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