社内 Scala Meetup 2016-05-26
scala-nativeࢼͯ͠Έͨ@atty303
View Slide
scala-native ͱ?4 ωΠςΟϒόΠφϦΛు͘ Scala ίϯύΠϥ4 LLVM ϕʔε4 LLVM ͷ Scala ϑϩϯτΤϯυ4 ϝϞϦཧ Bohem GC
LLVM IR Λు͘·Ͱ
LLVM IR Ҏ߱
ϥϯλΠϜϥΠϒϥϦ4 scala-native/javalib4 scala-js ͔Β͖࣋ͬͯͨ Java API ࣮4 io, lang, math, util ͙Β͍4 scala-native/nativelib4 scala-native ϥϯλΠϜ4 Annotation ఆٛϙΠϯλܕͳͲ4 scala-native/scalalib4 Scala ϥϯλΠϜϥΠϒϥϦ4 scala-native/clib4 C ͷඪ४ϥΠϒϥϦ (stdlib.h, stdio.h ͱ͔)
ϥϯλΠϜϥΠϒϥϦ4 ࠓͷͱ͜Ζ .a .so ࡞Εͳ͍Α͏Ͱɺશ෦ιʔε͔ΒϏϧυͯ͠ϦϯΫͯ͠Δ4 Java API ͕جૅతͳͷ͔͠ͳ͍ → طଘͷ Java ࢿ࢈͑ͳ͍4 JVM Ͱͳ͍ͷͰ .class ͑ͳ͍ → .jar ͑ͳ͍4 Pure Scala ͷϥΠϒϥϦ͑Δ4 C ͷϥΠϒϥϦ͑ΔͷͰؤுΔ4 ঢ়گతʹ scala-js ͱಉ͡?
ݴޠ༷4 ΄ͱΜͲ Scala ͱಉ͡4 ωΠςΟϒͷͨΊͷ֦ு͕͋Δ
ߏମએݴ@struct class Vec(val x: Double,val y: Double,val z: Double)4 C ͷ struct ͱͷ૬ޓӡ༻ͷͨΊ ?4 ελοΫʹஔͰ͖Δ class Λએݴ͢ΔͨΊ ?4 C# ͷ class(ࢀরܕ)/struct(ܕ) ͷΑ͏ͳৼ͍?
ελοΫͱϙΠϯλ@struct class Rect(val w: Double, val h: Double) {def area: Double = w * h}def main(args: Array[String]): Unit = {val p: Ptr[Rect] = stackalloc[Rect] // ελοΫׂΓͯͷϙΠϯλ!p = new Rect(2, 3) // ϙΠϯλ͕ࢦ͢ϝϞϦͷ֨ೲfprintf(stdout, c"%f\n", (!p).area) // ϙΠϯλͷࢀর֎͠}4 Scala ͰϙΠϯλૢ࡞!!!
C ؔͷݺͼग़͠@extern object stdio {def printf(format: CString, args: Vararg*): CInt = extern}def main(args: Array[String]): Unit = {stdio.printf(c"hello, world!")}4 CString = Ptr[Byte] ͳͲͷΑ͏ʹ C ͷܕͱޓੑͷ͋ΔScala ܕ͕͋Δ
ಈ͔͢scala-native ͷ demo ϓϩδΣΫτͷ࣮ߦ࣌ؒΛൺֱͯ͠ΈΔ4 ϨΠτϨʔγϯάͷϓϩάϥϜ
Ϗϧυ$ git clone [email protected]:scala-native/scala-native.git$ cd scala-native/docker$ ./manage.sh build$ ./manage.sh run4 scala ϥΠϒϥϦͷ git clone ʹࣦഊͨ͠Γͨ͠ͷͰbuild.sbt ͷ༰ΛखಈͰ࣮ߦͨ͠Γ…
࣮ߦ࣌ؒnative | 12.2008clang | 10.9654jvm | 10.7632gcc | 7.32184 time ίϚϯυͰ 5 ճܭଌͨ͠ͱ͖ͷฏۉ4 ࣮ߦॳظஈ֊ͷׂʹ݈ಆ͍ͯ͠Δ4 LLVM ͍͢͝!
ىಈ࣌ؒjvm | 0.2758native | 0.0044 ىಈ͍࣌ؒ!4 ͚Ͳ JVM ͷ 0.3 ඵऑผʹ͍ͱ͍͏΄ͲͰͳ͍…
͍Ͳ͜Ζ4 PC (Desktop / Server) ʹඞཁͳͦ͞͏͔ͳ…4 ARM ʹϏϧυͰ͖ΔΑ͏ʹͳΕ…4 JVM Λಈ͔͢΄ͲϦιʔεͷͳ͍Ϛγϯ(IoT)͚ͷϓϩάϥϜΛ Scala Ͱॻ͚Δͱ͔4 iOS ͷωΠςΟϒΞϓϦΛ Scala Ͱॻ͚ΔՄೳੑ?
ࢀߟ4 ࡞ऀ Denys Shabalin ࢯͷϓϨθϯhttps://github.com/densh/talks/blob/517b20c30dd4aaf390785039cdd002f623eaa91e/2016-05-11-scala-goes-native.pdf