Scala NativeのデモをDocker上で動かす

こんにちは、t-hiroyoshiです。
最近はScala Days 2016 NYCで発表されたScala Nativeにコントリビュートしています。Scalaのような強力な言語がbare metalで動くのは素晴らしい事だと思っているので早く実用レベルで動くようにこれからも積極的に貢献していきたいです。

そんな訳で今回は布教を兼ねてScala NativeのデモをDocker上で簡単に動かす方法を紹介したいと思います。

Scala Native

Scala Nativeとは何かと言うと、ScalaのコードをLLVMのIR経由でコンパイルしてNative実行可能にするAOTコンパイラ(AheadOfTimeCompiler)実装です。
一部低級な処理向けにScalaを拡張しているのである意味別言語と言っても過言ではないかもしれません。
これらの拡張によってScalaをSystem level languageに落とし込めるのでその気になればScalaで何でも作れるわけで、とても未来が楽しみです。

ただREADMEにpre-release stageとあるようにまだ完全にScala-likeには動きません、ですが活発にIssueやPull reqが飛んでいるので近いうちにまともに動くようになると思っています。(まだ完成していない今ならコントリビュートのチャンス?)

現在はLLVM(Clang)とBOEHM GCをローカル環境に依存しているのでデモを動かすまでにそれらのパスが通らなかったり、依存解決で結構躓く人が多いみたいです。
そこでScala Nativeのレポジトリ内にあるDockerfileを使って作ったコンテナ内でデモを動かしてみたいと思います。管理用のスクリプトもきちんとあるので比較的簡単に動かす事が可能です。

手順

docker-machineを立てる(Option)

なるべくローカルの環境を汚染したくないのでdocker-machineでDockerホストを立てます。
driverはvirtualboxを使っていますがvmwarefusionで立てた方がもしかしたら速いかもです(Scalaはcompile時間が長いと言われている)。
メモリを指定しないと1Gしか割り当てられないので増やしておきます。

$ docker-machine create -d virtualbox --virtualbox-memory 2048 scalanative

docker-machineが立ち上がったらsshで繋ぎます。

$ docker-machine ssh scala-native

管理用のスクリプトはbashで動くのですが、Boot2Dockerは標準でbashが入っていないので次に進む前にここを参考にbashをインストールしてください。

Scala Nativeのコンテナイメージをビルドする

まずはともかくScala Nativeのソースをcloneしてきます。

$ git clone https://github.com/scala-native/scala-native.git

scala-native/dockerの中にDockerfileがあるので移動して管理用のスクリプトを叩きます。

$ cd scala-native/docker
$ ./manage.sh build

色々ダウンロードしたりするので結構時間がかかります。

時間がかかります辛抱強く待って下さい、コーヒーでも飲んでいれば良いと思います。
ビルドが終わったらいよいよデモを動かします。

Scala Nativeのデモを実行する

スクリプトを叩いてビルドしたコンテナの中に入ります。

$ ./manage.sh run

ここでエラーが出てsbtプロジェクトが読み込まれない方はscala-native/配下のtargetフォルダを全て削除してみてください。
コンテナに入れたらsbtを起動してデモがあるdemoNativeプロジェクトを指定します。

$ sbt
> project demoNative
> run

後はrunすればデモが動き出してコンパイルされたバイナリがscala-native/demo/native/target/scala-2.11/demonative-outに吐き出されているはずです。

これはそのまま実行できるのでいろいろ試してみてください。