[Scala][Java][Lisp][Ruby]プログラミング言語Scala

Scalaというプログラミング言語を調べてみたので、レポート。

どんな言語か?

手続き型オブジェクト指向と関数型のハイブリッド言語。
静的型だが『型推論』をするため、面倒くさい変数の型宣言をある程度省略可能。
LispRubyのようにifやfor、ブロック等も式として扱われる。
クロージャ完備。関数の部分適用(cut)や合成(compose)ができる。
パターンマッチ(destructureing-bindみたいなもの?)ができる。

http://www.scala-lang.org/
http://ja.wikipedia.org/wiki/Scala

JavaVM上で動くインタプリタと、Javaバイトコードに変換するコンパイラの両方がある。
Javaライブラリとの親和性が高い。

性能

RubyPython、(未チューニングの)Lispよりも格段に速い。Javaで書いたのとほぼ同じ性能が出る。

静的型言語なので、コンパイラの最適化が効きやすく、fib(40)は1秒程度。
RubyPython、declareしていないCommon Lispなどの動的型言語だと、30秒〜1分以上かかる。
静的型が速い理由は、コンパイル時に型が決まるため。コンパイル時に型が決まっていれば、変数アクセス、関数呼び出し、算術演算などがほぼマシン語1命令に落とせる。動的型言語だと、(ほぼO(1)オーダだとしても)実行時に探索やディスパッチをする必要がある。

生産性

JavaVMを使っているので、メモリ管理はGC任せ。

クロージャがあるという点で、コードの重複除去はRubyと同じくらいできる。
マクロ相当の機能はないため、Common Lispと同じにはならない。

イメージ的には、Rubyに静的型の面倒臭さを付け加えた感じ。

フールプルーフ

文法要素のボリュームはJavaよりも大きいため、学習コストは比較的高い。従って、Javaすらわからん人に教えるのは難しい。

静的型であり、コンパイル時にある程度バグを弾いてくれるため、多少ユニットテストをサボる人がいても大丈夫。

結論

言語スペクトルの中でのScala
(抽象化・自由) Lisp <-> Ruby <-> Scala <-> Java (実行効率・束縛)
# ちなみに、左に行くほどスーパープログラマ向き、右に行くほどIT土方向きとなる。

groovyは完全にRubyPythonとかぶっていたが、Scalaは中間を行っているので存在意義はある。

JDK7でクロージャが追加されるかもしれないという流れの中では、Javaの将来の姿のようにも見える。