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. JavaScript on Scala
    AdTech ✕ Scala MeetUp
    Fringe81 Co., Ltd.
    @petitviolet

    View Slide

  2. Nashorn

    View Slide

  3. Nashorn 㱺
    +7.

    View Slide

  4. What is Nashorn?
    • JavaScript runtime on JVM
    㱺 JavaScript on Scala!!!
    • Project Nashorn
    • http://openjdk.java.net/projects/nashorn/

    View Slide

  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")

    }

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  9. Procedure
    • Preparation
    • create ScriptEngine
    • Compilation
    • compile String as a JavaScript function
    • Execution
    • feed AnyRef arguments to ScriptEngine

    View Slide

  10. ↑↑↑ʘ(^o^)ʗ↑↑↑
    • Store JavaScript functions in DB as Strings
    • Use stored functions as Scala function!
    • Enable replacing algorithms dynamically
    • e.g. Scoring, Sorting, Selection, …

    View Slide

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

    View Slide

  12. Lose type information?
    • No
    • Can use Java types in JavaScript
    • Java.Type(“”)
    • 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

    View Slide

  13. Happy Hacking!
    We’re hiring!

    View Slide