2015-06-26
Scala2.11.7からのJava8に対応した新しいコンパイルオプションを試してみた
scala | |
"新しい" とは、今まで全部無名classにコンパイルしてたラムダを、invoke dynamic使って動的に生成するようになるとかそういうやつ。
ラムダ以外の最適化もやってるようですが?詳しくは知りません。
Scala 2.12から正式に入るらしいですが、(これ書いてる時点から見て)つい昨日くらい(2015/06/25)に出たScala2.11.7でも、明示的にオプションを指定すれば、実験的オプションとして使えるそうです。
内部の仕組みは、以下のScaladays2015のスライド見るとか、あとは各自ググってください
公式に書いてありますが、2.11.7においてJava8のバックエンドを最大限(?)に有効活用する方法は
- Scala2.11.7以上に設定する
- いくつかコンパイルオプションを指定
- libraryDependenciesに専用の依存指定
で、つまりsbtのbuild.sbtで言うと以下のような感じ
libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.5.0" scalacOptions ++= List("-Ybackend:GenBCode", "-Ydelambdafy:method", "-target:jvm-1.8") scalaVersion := "2.11.7"
コンパイルオプション追加だけではあまり意味なくて(それでも新しいバックエンド使われて一部最適化されるらしいが)、2.11.7時点ではscala-java8-compatの依存を明示的に追加しないとラムダがinvoke dynamicになってjarサイズ削減の効果が得られないようです、注意しましょう。
コンパイラ側が
「コンパイルオプションが指定されていて、かつscala-java8-compatがpathにある場合」
という条件で最適化するようです
(つまりscala-java8-compatが存在するかどうかで動作が全然異なるという挙動)
さて、それでjarサイズが大きいことで有名な(?) Scalazをこれでコンパイルしてみました。使ったのは、これ書いてる現在の最新のtreeです。
結果、
- 普通にコンパイル 10401808 byte
- Java8用オプション指定でコンパイル 6686854 byte
という結果でした。
- https://github.com/xuwei-k/scalaz/commit/2ea3e735c1b19554d9de2ed4
- https://travis-ci.org/xuwei-k/scalaz/builds/68410963
36%ほど削減されて、オプション指定なしのときと比べて64%くらいのサイズになりましたね。
3分の1くらいまで減るかな―と、長年期待していたのですが、思ったほどは減らなくて少しがっかりしています・・・(´・ω・`)
これ、まだ最適化の余地あって、2.12.0のfinalが出る頃には3分の1くらいになったりしないんですかね・・・。
まぁそれにしても、36%削減は、他の方法では実現できないのでありがたいです。
さて
「jarのサイズ小さくなるから、scalaz 7.2.x の Scala 2.11 は Java7サポートやめて、このオプション指定するようにしようぜっ!」
と、提案することを以前から考えていたんですが、なんとsbtがこのオプションつけると色々正しく動かないようです!???
https://github.com/sbt/sbt/issues/2076
cleanでも直らない(targetディレクトリ丸ごと削除とか再起動必要?)、というかなり酷い感じで実用的じゃなさそうなので、少なくともsbtがなおるまでは、scalazへのその提案はできないですね・・・。
- 6 http://t.co/VV53BVM5Do
- 4 http://b.hatena.ne.jp/
- 4 http://t.co/WThby8w5tJ
- 3 http://pipes.yahoo.com/pipes/pipe.info?_id=e4c70514b5136c08ae93591f390be2e2
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB8QFjAA&url=http://d.hatena.ne.jp/xuwei/20101005/1286303814&ei=N7mMVamVJMHMmwX71oCABg&usg=AFQjCNHGxqbf4wd7C0gXBJgvwHV-WTZATg&bvm=bv.96782255,d.dGY&cad=rja
- 1 http://api.twitter.com/1/statuses/show/614247022426615808.json
- 1 http://api.twitter.com/1/statuses/show/614247200541937664.json
- 1 http://api.twitter.com/1/statuses/show/614249246770880513.json
- 1 http://api.twitter.com/1/statuses/show/614261626766692352.json
- 1 http://b.hatena.ne.jp/entrylist?url=http://animeanime.jp/