Scala for JSer's
自己紹介
- @kyo_ago
- Scalaの経験は4ヶ月位
- 静的型付け言語はDelphiとTypeScript
Scalaとは
Scalaとは
- scalable language
- 2003年登場
- 強い静的型付け
- Java, Haskell, Standard ML, OCaml, Smalltalk, Erlangの影響
- JavaVM上で動作
- Twitter、Foursquare、LinkedIn等が採用
- 豊富な言語仕様
コードはDartとも似てる
(Perlよりは)
豊富な言語仕様
- 関数型とオブジェクト指向型のマルチパラダイム
- Javaのライブラリが透過的に呼び出せる
- 省略できる部分が多い
- 他の言語があえてサポートしなかったであろう仕様も採用
(implicit系とか)
- JSer的に嬉しい部分も多い
JSer的に嬉しい部分
- Future、ActorはPromiss、Worker
- JavaよりはJSに近い
- 言語仕様的に欲しいものは大抵ある
(マクロとか、ヒアドキュメントとか、文字列リテラルへの式埋め込みとか)
- 言語の強力さと静的型付け言語としてのバランスはいい
- 当然JSerに辛い部分もある
JSerに辛い部分
- 意味不明なほどに強力な言語仕様
- Javaの世界
- デバッガーとかのツール類
- JSに比べると面倒
コードの紹介
object HelloWorld {
def main(args: Array[String]) {
println(hasA("bbb"))
}
def hasA(s:String) = {
for(i <- 0 until s.length) {
if(s(i) == 'a') return "hit"
}
return "miss"
}
}
case class Hoge(huga: String = "huga", foo: String = "foo") {
def bar = foo
}
object HelloWorld {
def main(args: Array[String]) {
val hoge = Hoge(foo = "aaa", huga = "bbb")
println(hoge.bar)
}
}
case class Hoge(huga: String = "huga", foo: String = "foo") {
def bar = foo
}
object HelloWorld {
def main(args: Array[String]) {
implicit val hoge = Hoge(foo = "aaa", huga = "bbb")
println(implicitTest())
}
def implicitTest(implicit huga: Hoge) = {
import huga._
bar // huga.bar()
}
}
case class Hoge(huga: String = "huga", foo: String = "foo")
object HelloWorld {
implicit def hogeToString(h:Hoge):String = h.foo
def main(args: Array[String]) {
val hoge = Hoge(foo = "aaa", huga = "bbb")
println(hoge)
}
}
「すごいのは分かった」
(分かった?)
「でもJSerにはDartの方が良くない?」
(フロントでも動くし)
その意見、もっともです
そこで
Scala.js
「あー、また半端な他言語の移植VM?」
(JavaVMのもあったよねー)
わりとガチ
わりとガチ
- 実行VMではなくTrans compiler(Dartと一緒!)
- Scalaの言語仕様はかなりカバー
「でも、なんか死ぬほど重いんじゃなかったっけ?」
(ランタイムコードが22MBとか)
最新版で改善されました!
(依存関係解決できるようになったので、最小構成で220KB)
使い所
使い所
- サーバサイドとクライアントサイドでロジックの共有
(特にチート対策が必要なゲーム系)
- Scala使いしかいない
- Javaと名のつくものが嫌い
- 関数型で書きたい
(valあるよ)
欠点
欠点
- Javaのコードには入れない
(JavaVMが載ってるわけではない)
- 依存コードが多くなるとランタイムコードも重くなる
- 最適化に時間が掛かる
(本家のScalaに比べれば大したことないのでは)
夢の続きを
ご清聴ありがとうございました