JavaScript on Scala -Nashorn-

JavaScript on Scala -Nashorn-

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

93bc8fb48f57c11e417dad9d26a2fb8a?s=128

petitviolet

May 16, 2016
Tweet

Transcript

  1. 2.
  2. 4.

    What is Nashorn? • JavaScript runtime on JVM 㱺 JavaScript

    on Scala!!! • Project Nashorn • http://openjdk.java.net/projects/nashorn/
  3. 5.

    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")
 }
  4. 6.

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

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

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

    Procedure • Preparation • create ScriptEngine • Compilation • compile

    String as a JavaScript function • Execution • feed AnyRef arguments to ScriptEngine
  8. 10.

    ↑↑↑ʘ(^o^)ʗ↑↑↑ • Store JavaScript functions in DB as Strings •

    Use stored functions as Scala function! • Enable replacing algorithms dynamically • e.g. Scoring, Sorting, Selection, …
  9. 11.

    ↓↓↓ʗ(^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!!!
  10. 12.

    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