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

    @petitviolet
  2. Nashorn

  3. Nashorn 㱺 +7.

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

    on Scala!!! • Project Nashorn • http://openjdk.java.net/projects/nashorn/
  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")
 }
  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
  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
  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
  9. Procedure • Preparation • create ScriptEngine • Compilation • compile

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

    Use stored functions as Scala function! • Enable replacing algorithms dynamically • e.g. Scoring, Sorting, Selection, …
  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!!!
  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
  13. Happy Hacking! We’re hiring!