読者です 読者をやめる 読者になる 読者になる

Play Frameworkを使ってみて知ったScalaの正体

Scalaは使った事もないけどいいものなんだろうという雰囲気は感じていた。
Javaを極めたわけでもないのに、みんながScalaナウいというとScalaにしなきゃいけないんじゃないかと思ってしまうタイプです。
よく分かんないけどScala使ったほうがいいんでしょう?みたいな。
TwitterがScalaになったとか、JavaよりScalaの方が生産性が高いとか、とChatworkが新言語として採用したとかとかね。

Scalaとの出会い

急遽、他の部署の新人研修のお手伝いをすることになり、お題がJavaを使ってPlay Frameworkで開発だからアプリケーションのひな形を作らなきゃいけなくなった。
Play Frameworkは初めてなのと、そもそもJavaで1からWebアプリケーション作った経験ってなかったのでこりゃやってみなきゃってことで早速試して見ることにした。 まずは、Play Frameworkの公式サイトからダウンロードして解凍。さぁPlayとやらはどこにある?

$ ls activator-1.2.3-minimal
activator                  activator-launch-1.2.3.jar activator.bat

activator?

おれは、Playを落としたはずだが、、、

まぁ、なんかPlay 2.3から、よく分かんないけどこのactivatorというプログラムで色々できるようになったらしい。とりあえず言われた通り、activator uiを打ってみる。
そうすると、なんかいろいろダウンロードがだーーーっと始まって、終わるとなんかブラウザが開いて、管理画面みたいの出てきた。

f:id:masato47744:20140719222501p:plain

色々サンプルプログラムのひながたっぽいメニューあるし、Yaomenみたいなジェネレータをおしゃれにした感じ?と思ったけど、よく見ると、この画面上で、IDE、はたまたプロジェクトの管理、テスト、サーバーの実行などもできてしまう末恐ろしいもののようだった。

便利なのは分かったけど、ちょっと待って欲しい。俺はただ、単にPlay Frameworkを始めたかっただけなんだ。なのに、なんでこんな大掛かりなことになってしまったんだろうか。。
なんか、ホーム配下に、.activatorと.sbtと.ivy2とかってできてるし。 一体何が起きてるんだ。

sbtってScalaのやつじゃないの?それぐらいは聞いたことあるぞ。
っていうか、そもそもScalaとかinstallしたこと一度もないんだけど、、whichしても出てこないし。
なぜお前らは勝手に動いているんだ?これは調べないと先に進めなさそうだ。

Scalaを落としてみる

Scalaの公式ページからScala本体を落としてきて中身を見てみます。

$ ls scala-2.11.1/*
bin:
fsc          scala        scalac       scaladoc     scalap
fsc.bat      scala.bat    scalac.bat   scaladoc.bat scalap.bat

doc:
LICENSE.md  License.rtf README      licenses    tools

lib:
akka-actor_2.11-2.3.3.jar                   scala-continuations-plugin_2.11.1-1.0.2.jar
config-1.2.1.jar                            scala-library.jar
jline-2.11.jar                              scala-parser-combinators_2.11-1.0.1.jar
scala-actors-2.11.0.jar                     scala-reflect.jar
scala-actors-migration_2.11-1.1.0.jar       scala-swing_2.11-1.0.1.jar
scala-compiler.jar                          scala-xml_2.11-1.0.2.jar
scala-continuations-library_2.11-1.0.2.jar

man:
man1

ふむふむ。bin/scalaが実行プログラムっぽいな。バイナリかなと思いながら中身をおもむろにvimで見てみたらただのシェルだった。この時点でえ、シェル?と思った。さらに、中身を見て実行してる部分を見るとこうなってた。

中略

if [[ -z "$JAVACMD" && -n "$JAVA_HOME" && -x "$JAVA_HOME/bin/java" ]]; then
    JAVACMD="$JAVA_HOME/bin/java"
fi

execCommand "${JAVACMD:=java}" $JAVA_OPTS ....略

中身は単にjavaを実行してるだけじゃん!!!1

そういえばclasspathとして読み込まれるlib配下にscala-compiler.jarなんてのもあった。Scalaの正体ってただのjavaで書かれたコンパイラだったのか!JVM上で動くってことは聞いてたけどなんていうか、左の耳から右の耳へ抜けていったみたいな感じだったけど、やっと意味が分かった!!
てっきり、ScalaってJavaとは全く関係ない全く新しいものだけど、Scalaがお情けで無理矢理JVM上で動かすことにも成功した!みたいなものだとイメージしてたけど全然違うねこりゃ。むしろScalaJavaがないと生きられない体なんだ。

要は、ScalaJavaよりもモダンな文法や関数型でプログラミングできるんだけど、そのコンパイラJavaでできててしかも最終的にただのJVMで動くクラスファイルになるだけってことだよね。 分かる人には当たり前なのかもしれないけど、勝手にすごくアハ体験できた。


ここまできて、あれ、これってどっかで見た事あるなとふと思った。

Objective-CSwiftだ!

Swiftも結局はコンパイルした結果は、Objective-Cと同じものになるし、Scalaも最終的には、JVMで動くやつになる。
Swiftも、Objective-C型推論とか関数型のパラダイムを追加したものだし、ScalaJava型推論とか関数型のパラダイムを追加したやつ。
SwiftObjective-C共存可能だし、ScalaJava共存可能。
まぁでも、JavaはJava8が出てきて、JavaJavaで進化しようとしてるあたりが違う感じだけど。

何はともあれ、Scalaのことがなんとなく分かったというかイメージがわきましたという話でした。Scalaのコードはまだ1行も書いてませんがw