なんでこれから Scala? 08:06

Posted at 2010/01/22 08:06, Modified at 2010/01/22 23:00

去年から Scala を勉強していて、お正月には Martin Odersky の『Scala スケーラブルプログラミング』(コップ本、と呼ぶらしい) も読んだ。Scala はかなり良い。私が言語を選べる立場にあるときに、いままで好き好んで使っていた言語は Ruby だった。でも、これからは Scala も積極的に検討していこうと思っている。

プログラミングの間違いが静的にみつかる

Scala を推す一番の理由はここだ。型がちがうとか、引数の個数がちがうとか、存在しないメソッドを呼び出しているとか、そういう間違いは静的にみつかるべきだと最近は思っている。型をいちいち書くのはだるいけど、Scala には型推論があるので比較的だるさは軽減される。また、実行時例外として名高い NullPointerException についても、Option 型を適切につかうことで未然に防ぐことができる、と思う。

自動テストで動的にみつける方法もあるけど、これは

  • 書かない人と同じコードベースで作業することがある
  • 書かないどころか、人の書いた物を失敗させても気にしない人もいる
  • 自分でも、ここは書きにくいな、と書かないことがある

と、試してみたらいろいろ大変だった。原則としてテストは書くけど、テストのない場所におけるセーフティネットとして静的な検査もあるよ、というのはかなりありがたい。

Java の資産がつかえる

たとえば Tokyo Cabinet や memcached を使いたいといったときに、Java むけに用意されたライブラリを簡単に使える。Java のライブラリは、インターフェースが個人的に好みじゃないものもあるけど (最近は Apache HttpComponents がよくわからなかった) ライブラリ全体を書くのと、薄いラッパーですむのとだったら、断然後者のほうが楽だ。

Google AppEngine で動く

Scala は Google AppEngine for Java で動く。AppEngine はすごく便利で、エラーログすら見れないサーバーに FTP でアップロードしたファイルを CGI で、みたいな「はじめての Web プログラミング」をおじいちゃんの昔話にしうると思う。

便利な言語仕様

静的な検査は Java の文化を、次の2つは Java の VM をうけついでいる。Java と設計意図からして差異を感じるのは Scala の「便利」な言語仕様だ。if が値をかえしたり、return を省略できたり、匿名関数を _ で短く書けたり、val と書くだけで再代入できない変数をつくれたりする。ここらへんの「最初は混乱するかもしれないけどまあ慣れれば便利じゃん」というのは、個人的にはあまり Java っぽくないと思う。

ちなみに再代入できる変数は var で一文字しかちがわない。Scala の短さを追い求める姿勢はやや過激で、例えば、いわゆる "fold left" が "/:", "fold right" が ":\" という名前のメソッドとして定義されていたりする。最初にふれた本には「スラッシュの向きが木構造の左右の傾き方をグラフィカルに描いたものに似ている」と由来があった。

Perl?

そもそも Scala をやる理由を書こうと思ったのは それでも私が Perl5 を使いつづける理由または、Why I still use Perl5? 的な。それでも私が Perl を使いつづける理由 を読んだからだ。Perl は最近よく書いている。ただ、これからも使うかとか、人に勧めるかとかは、かなりつらい。

理由は文法まわりが大きい。やっぱり「$@%* 」は気になる。行末の ; も、関数の頭で @_ から自分で引数をおろすのも面倒だ。コンテキストは失敗だった。ただ、使える環境は多いので書けるほうが生活上便利だとは思う。最近 ruby -e … とワンライナーで大作を書いたら Ruby がはいっていなくて悲しかった。Linux Standard Base に関していうと 3.2 では Perl と Python が、4.0 で Java がはいったらしい。

CPAN については微妙な立場だ。たくさんモジュールはあるけど、実際に私が使うものはそんなに多くなく、個々のライブラリを単体でみれば他言語にも代わりになるものがあると思う。試しに Perl で有名なものについて Ruby での代替を表にしてみた。

ここで Scala が出てこないのは勉強中だからです。

Perl Ruby
AnyEvent EventMachine
Catalyst Merb or Rails
DBIx::Class DataMapper or Rails (ActiveRecord)
DateTime, Time::Piece Time (言語の一部)
List::Util Enumerable, Enumerator (言語の一部)
Coro Fiber (言語の一部)
WWW::Mechanize Mechanize
Plack Rack

テストをつけておくと様々な OS x 様々なバージョンの Perl で実行してくれるとか、ミラーサイトが多いとか、そういう全体としての CPAN はまだすごい。"7904 authors 17293 modules" みたいな量については、前述の理由と、あと Catalyst::Plugin::* ブームとかもあったのであんまり。

0 comments
riddle for guest comment authorization:
Where is the capital city of Japan? ...

blog.8-p.info加藤和良 の個人的なブログで、プログラミングのはなしが多めです。