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
を打ってみる。
そうすると、なんかいろいろダウンロードがだーーーっと始まって、終わるとなんかブラウザが開いて、管理画面みたいの出てきた。
色々サンプルプログラムのひながたっぽいメニューあるし、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上で動かすことにも成功した!みたいなものだとイメージしてたけど全然違うねこりゃ。むしろScalaはJavaがないと生きられない体なんだ。
要は、ScalaはJavaよりもモダンな文法や関数型でプログラミングできるんだけど、そのコンパイラはJavaでできててしかも最終的にただのJVMで動くクラスファイルになるだけってことだよね。 分かる人には当たり前なのかもしれないけど、勝手にすごくアハ体験できた。
ここまできて、あれ、これってどっかで見た事あるなとふと思った。
Swiftも結局はコンパイルした結果は、Objective-Cと同じものになるし、Scalaも最終的には、JVMで動くやつになる。
Swiftも、Objective-Cに型推論とか関数型のパラダイムを追加したものだし、ScalaもJavaに型推論とか関数型のパラダイムを追加したやつ。
SwiftもObjective-Cも共存可能だし、ScalaとJavaも共存可能。
まぁでも、JavaはJava8が出てきて、JavaはJavaで進化しようとしてるあたりが違う感じだけど。
何はともあれ、Scalaのことがなんとなく分かったというかイメージがわきましたという話でした。Scalaのコードはまだ1行も書いてませんがw