Slide 1

Slide 1 text

JavaScript on Scala AdTech ✕ Scala MeetUp Fringe81 Co., Ltd. @petitviolet

Slide 2

Slide 2 text

Nashorn

Slide 3

Slide 3 text

Nashorn 㱺 +7.

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Happy Hacking! We’re hiring!