2009年4月29日水曜日

Clojureの紹介

Clojureの特徴。

-JavaVMの上で動く
-Lispの新しい方言
-動的型付けの純粋でない関数型言語
-STMによる並行処理
-豊富でimmutableなデータ型
-遅延シーケンス

というところあたり。

1.JavaVMの上で動く
JavaVMの上で動く言語は、ScalaやGroovy、ABCLなど
たくさんある。

これらの中でClojureは新しいほう。
JavaVMの上での言語開発の利点は、Javaとの連携が容易で
Javaの豊富なライブラリを利用できる点と、
JVMの高いパフォーマンス、マルチプラットフォーム対応
ガーベージコレクタなどの恩恵を受けられる点など。

2.Lispの新しい方言

Common LispやR5RSなどの仕様によらない、
新しく設計されたLispの方言。
当然コードはS式でマクロが使える。
新しいLispという意味では、ポールグレアムのArcなどと同様ですね。
JVM上のLispは、Common Lisp on JVMのABCL、
Scheme on JVM のSISCやKAWAなどがあるが、
新規設計のLisp方言onJVMはClojure以外にいまのところなさそう。
リーダマクロが独自定義できない、
末尾再帰最適化がないなどの理由から、
Common Lispなどからきたユーザには窮屈に感じられそう。

Lisp以外からきたユーザには、Common LispやSchemeより
逆にとっつきが良いかもしれない。

主観的な感想だが、
Common Lispの無骨な感じや歴史からくる複雑さ、
Schemeの原理主義的な感じから比べて、
Clojureには、PythonやRubyのような
ユーザに優しい雰囲気が感じられる。

3.動的型付けの純粋でない関数型言語
Haskellなどのような純粋関数型ではないが、
immutableなデータ型とそれへの参照を使って状態が管理されるので、
Python,Common Lisp などに比べると、
比較的破壊的な操作が少ない。

基本はimmutableで、プロセスディクショナリやetsを持っている
Erlangとポジションは似ているかも。

ここまでは前提条件的なもの。
ここからが、とくにClojureの魅力的な点。

4.STMによる並行処理

STMは、Software Transactional Memory
wikipedia:ソフトウェアトランザクショナルメモリ
複数スレッドからの共有メモリの読み書きを、
データベースのトランザクション処理のように制御する方法。
"Beautiful concurrency" Simon Peyton Jones (PDF)
や、書籍「ビューティフルコード」など。
並行制御として、ErlangやScalaのようなアクターモデルと
このSTMと、あとはロックを使う方法などがあって、
どれが有用なのかについては、議論の的になっているようだ。

5.豊富でimmutableなデータ型

データ型の便利さにPythonに近いものを感じる。
Erlangの持つimmutableでファーストクラスのコンテナは、
リストとタプルしかない。
dictはリストの組み合わせでしかなく、リレラルもない。
これはErlangの弱点だと思われる。
また、immutableなコンテナは、パフォーマンスの低下を
招きかねないが、そこらへんも効率よく実装されているらしい。

6.遅延シーケンス
Clojureはもちろん遅延評価ではないが、
遅延シーケンスが言語レベルでサポートされている。
Pythonのイテレータやジェネレータの感覚にとても近いものを感じるが、
遅延シーケンス自体もimmutableなので、状態を内在している
Pythonのジェネレータより扱いやすい点もありそう。
ここは要調査。

0 件のコメント:

コメントを投稿