ScalaについてRuby開発者が知っておくべき5つのこと
ScalaについてRuby開発者が知っておくべき5つのこと
OK、じゃあ君はRuby開発者って事だ。You groove on Ruby and all of Ruby's goodness (and there's much goodness in Ruby.)Rubyと同じように、Scalaも表現力豊かで読みやすいシンタックスを持ってて(Rubyのシンタックスの方がまだ少し優れてると思うけど)、OOと関数型パラダイムをうまく融合してる。うん、Scalaにはクロージャーも、mixinもパラメーターとしての関数も、その他いろいろも、ある。ScalaをWeb開発で使った場合はRuby/Railsと同じように「コードを変更して、ページをリロードすると、変更が確認でき」たりもする。Scalaには同じくらい乗れるものがある。私にとってはそれは次のものだ:
- パフォーマンスとスケーラビリティ。Scalaは速い。とても高速だ。(僕が実験したところ)Rubyの10-100倍は高速に動作する。Scalaは生産性を犠牲にすることなく高速化を実現できてるけど、その理由はScalaにはRubyの"関数型"の側面のよさを全て引き継いでいるからだ。ScalaはOSのネイティブスレッドをサポートしているので、マシンにある全てのコアとCPUの力を利用したScalaプログラムを書くことができる。またScalaはクラッシュすることも無い。僕はいままで[BUG]もプログラムが異常終了するのも見たことが無い(僕のRubyプロジェクトの一つで並列に計算ジョブをするものがあって、10のマシンで実行していたけど、ジョブの0.5%でランダムにエラーが起きてた。大体が浮動小数点演算中のクラッシュなんだけど)。もちろんYARVとかその他いろいろがもうすぐ(2007年のクリスマス)やってくるけど、Scalaだといますぐに手に入るんだ。
- 豊富なXMLとコレクションクラス群。Scalaでは組み込みのXML記法(eRbが言語の一部に含まれるようなもの)がサポートされていてXMLクラスはRubyのものよりも機能が豊富(でずっとずっと高速)だ。ScalaのコレクションクラスもRubyのそれより豊富(変更可・不可・リンクリストなど)なのでアプリケーションを実現する手段の選択肢が広い。
- より関数型っぽい。Scalaだと関数型スタイルでコードを書くのが簡単(で直感的)だ。「それで?」って君は言うかもしれないけど、「Rubyの美しさと生産性は関数型の側面のおかげ」だと僕は思ってる。Scalaでは集合を操作する再帰関数が簡単に書ける(Rubyのループの概念がfor (x = 0; x < 10; x++)よりもずっと強力だと気づいた時のことを思い出してほしい)。要するに今までよりも「副作用のないコードを書く」ことができて、コードのメンテナンスが簡単になるってことだ。
- DSLを書くのにもっと適した機能。Scalaの構文はRubyよりも柔軟で表現力が豊かだ。Scalaを使ったドメイン特化言語は(Rubyのような)既存の言語要素から構成できる。例えば例は次のようになる:
val query = select fields ("first" of characterVarying(50)) from "person" where ("last" in "person")=="'D.'"
Scalaコードの中で次にBNF形式の表現を使用できるようにするScalaのパーサライブラリを見てみよう。Textile Parser(which has a similar line count to RedCloth)の中では、次のようなScalaコードがある:
def lineElem : Parser[Textile] = not(blankLine) &&& (beginingOfLine ||| endOfLine ||| image ||| footnote_def ||| anchor ||| dimension ||| elipsis ||| copyright ||| trademark ||| registered ||| emDash ||| enDash ||| italic ||| emph ||| cite ||| span ||| code ||| delete ||| insert ||| sup ||| sub ||| bold ||| html||| single_quote ||| quote ||| acronym ||| charBlock)
- 明記しなくていい静的型付。Scalaは強く型付けされているけど、醜くは無いし何度も何度も何度も同じ事を繰り返す必要は無い。関数(メソッド)パラメーターの型は宣言する必要があるけど、それ以外のモノはほとんど全部コンパイラが自分で何とかしてくれる。myList.map {i => i.toString}.toList.mkString("{",",","}") はlegal constructだ。他方、Scalaの型付けは「目の前に出て」来ないけど、変数名の間違いなんかの馬鹿げたミスをちゃんと教えてくれる。
もちろんRubyがScalaより優れている部分もある。スクリプティングに関してはRubyはScalaよりずっといい。Scalaには言語レベルの正規表現はない(ライブラリはある)。Ruby scores big time in my book for having Regex in the language. Rubyの構文はScalaよりもずっと分かりやすいと思う。RubyのオープンクラスはScalaの暗黙の型変換よりよさそうだ。ただ、暗黙的型変換はオープンクラスと比べてもっとセキュアでメンテナンスも簡単になる。Scalaもランタイムでのクラス生成はサポートしてるけど、Rubyのメタプログラミング機構はScalaよりも簡単だ。でも関数チェインやカリー化のほうがRubyのメタプログラミングよりもメンテナンスやデバッグが簡単だとは思う。