Clojure始めます

NLPの下のレイヤー(segmentationやparsing)で公開されているプログラムはC++やJavaであることが多い。XXXの(Ruby|Python|Perl) bindingみたいなのが用意されていることもあるが、そうでないものも多い。あるいはbindingには公開されてない情報も使いたいとかそういうこともある(ここまで真っ当な理由)。C++のプログラムの場合、自分でなんとかできるようになってきたが、Javaはもう5年くらい書いていない。まぁJavaを再度勉強すればいいのだが、それは割と退屈な気もする(こんなことをいうと怒られる)。

Dave Thomas(達人プログラマー―システム開発の職人から名匠への道の人)が「年に一度は新しい言語を習得しましょう」と言っているし、Java以外からJavaの資産を使える言語にしよう(この付近から目的と手段が入れ替わるw)。Javaの資産が使えるものとして、Jython、JRubyなどがあるが、それだとあまり新しい言語を学んでいる感がしない。候補としてScalaとClojureが候補に上がってきた。双方共に並行プログラミングを容易にすることができ、データをばしばし処理したいNLPerとしては嬉しい要素が詰まっている。

ClojureとScala比較

Clojureのほうは

  • かなり関数型言語の要素が強い
  • Javaのオブジェクトを使うときなどにはmutableなものを許すが、基本的にはimmutableなものを使う
    • 変更する際には明示的に書かなければならないようになっている
  • Lispなので「データとしてのコード」の思想が流れている
    • 強力なマクロももちろん使える
  • 並行プログラミングを可能にするためにSTM(ソフトウェアトランザクショナルメモリ)というものを用意している
    • SMTじゃないよ!!!(分かってるって)
  • JVM上で動く制約として末尾再帰の付近がちょっと使いづらい感じになっているが(recurとか)、どうやら遅延評価で解決させることが多いらしい
  • 動的言語である(が、速度を上げるために型の情報を教えてやることもできる)

という感じで、Sclarのほうは

  • シンタックスはJavaに近い感じがするので、Clojureよりはとっつきやすそう
  • Clojureよりオブジェクト指向よりだが、関数型言語の側面も持つハイブリッドな言語
  • Clojure同様、immutableなオブジェクトを普通は使う
  • 並行プログラミングを可能にするためにアクターモデルというものを採用している
    • Erlangもアクターモデルだが*1、そもそもErlangを触ったことがない。。。
  • 型推論(あんまりよく知らない...C++のautoみたいなやつでしょうか)というのをやってくれる
    • 静的型付け言語
  • パーザーのライブラリが標準で付いてる
    • 本質ではないかもしれないけど、id:kisさんが最近やられているみたいで興味がある

という感じらしい。自分が特に気になっている点としては2点あって

  • オブジェクト指向と関数型のバランスの取り方(Sclarのほうがよりオブジェクト指向に近く、Clojureのほうが関数型に近い)
  • 並行プログラミングを可能にしている仕組みの違い(STMとアクターモデル)

静的な言語か動的な言語かも気になる点ではある。昔は動的言語のほうが型とか気にしなくてばしばし書けていいじゃんって思ってたけど、C++をやるようになってから

  • この関数は副作用を起こす関数なのかが分かる(const)
    • Rubyの"!"とかではなく「保証」してくれる
  • 関数の入力に取る型が分かるので、使うときや読むときに(情報が多い分)やりやすい
    • 特に書いてる時間より読む時間のほうが長いので、型の情報は結構ありがたい
  • コンパイル時に分かるエラーはそこで弾いてくれる
    • まぁ、C++のエラーは読めたもんじゃないと思うんですが...
  • 入力時に型を利用した補完ができる
    • 個人的にはEmacsのauto-completeを使うことが多いのであんまり活用してないが...
  • 動的言語、ではないけどテンプレートやgeneriticsもある

と思うようにもなったので、一長一短だが、どちらかというと最近は静的型付け言語のほうが好きかもしれない。使っている人口はSclarのほうが多そうで、Clojureは結構マイナーな感がある*2

完璧な言語などありはしないし、目的に応じて正しくお使いくださいということなので、今回の目的を確認すると

  • NLP関係で公開されているJavaのライブラリを違和感なく触れる
  • 新しい風を自分の中に吹き込んでくれる

という2点が大きい。ScalaもClojureも前者に対してはたぶん大丈夫で(Clojureは前置記法なのでメソッドチェーンとかやりづらそう、と思ったけど、違和感なくできるようにするためのマクロがちゃんと用意されている)、後者も並行プログラミングだったりで色々勉強になりそうなのだが、より自分が知らない要素が強そうなClojureのほうを勉強してみることにしようかと思います。

参考

あれこれ調べたりするのに以下の本をちょっと読みました。Scala、Clojureに限らず色々なパラダイムの言語が出てきて読んでて面白かったです。
7つの言語 7つの世界

7つの言語 7つの世界

  • 作者: Bruce A. Tate,まつもとゆきひろ,田和勝
  • 出版社/メーカー: オーム社
  • 発売日: 2011/07/23
  • メディア: 単行本(ソフトカバー)
  • 購入: 9人 クリック: 230回
  • この商品を含むブログ (64件) を見る

*1:というかSclarのほうが借りてきているのかな

*2:NLPに限るとどっちもあまり使われていない気もするけど...萩原さんがClojure使われているのくらいしか知らないw