読者です 読者をやめる 読者になる 読者になる

本当は怖い情報科学

情報系大学院生の趣味&実益ブログ。

新しいClojureScript向けライブラリ「Om」がかなり良さそうな件

clojure clojurescript

Lisp meetup #14 において、@takufukushimaさんがOmというClojureScriptライブラリを紹介されていた。気になってはいたが、そのときはOmの強みというか特徴がピンと来ず、積極的には調べずにいた。

ところが先日、Clojure系のPodcastであるThink Relevanceのエピソード54で、Omの作者でありClojure/ClojureScript業界でかなり活躍しているDavid Nolenさんが呼ばれていて(非常に興味深いので是非聞いてみてください)、Omについて話していた。そこで、Omの強力さが理解できたような気がしたので、この記事ではそれを書いてみる。

以下は、そのインタビュー内でのNolenさんの発言の受け売り。そのうち自分の手で直接試してみたい(自分の手で確かめたわけでは無いので、間違いがあれば指摘いただければ幸いです)。

Omは、Facebookが発表したJavascriptライブラリReactのClojureScript向けラッパーだ。Reactの特徴は、なんといってもVirtual DOMである。これは、JavascriptにおいてDOMを直接触ることをなるべく避け、データ構造としての仮想的DOMを裏で用意し、描画時に仮想DOMと実際のDOMの差分のみを描画することによって高速なUI表示を実現する仕組みだ。違う言い方をすると、

実際のDOM描画速度 << (超えられない壁) << データ構造操作速度

であって、DOMの差分を手間を計算に入れても全体としては高速になるというわけだ。

しかも、Omは単なるReactラッパーではない。上記のReactのエンジンを使いつつ、不要な部分は無視して(JSX*1とかね)、独自の拡張が行われている。Clojureに親しんだ人ならわかると思うが、「データ更新時に差分のみ描画」というコンセプトは、Clojureの精神の一つであるimmutability(不変性)と非常に相性が良い。例えば、Virtual DOMをatomとして定義しておけば、atomの更新時にのみ差分チェック処理を走らせれば良いし、それ以外の処理ならVirtual DOMが不変であることを保証できる。Javascriptの場合、データを任意のタイミングで自由に変更できるので、不変性のチェックの手間が余計にかかる。よって、(驚くべきことに)Reactを直接使うよりもさらに高速になる場合がある。

さらに、ClojureScriptのimmutabilityは別の恩恵もある。immutableデータ構造によって、各タイミングでのデータ構造のスナップショットを取ることができるようになる(Clojureのimmutableデータ構造は、内部的には更新処理で差分を計算してデータ量を減らすように工夫されている)。例えば、ユーザーがボタンを押下したときにサーバーへのAjax通信を行うとしよう。そのとき、サーバーへの接続が失敗し、通信できなかったとする。そうしたら、DOMを1つ前のスナップショットへロールバックして、以前の状態へ戻すということができるようになるわけだ(少なくとも潜在的には。現状の実装でどこまで可能かどうかは未調査)。

このように、Omは単なるReactラッパーという枠を超えてかなり大きな可能性を持っていることがわかる。現在、ClojureScriptのメーリングリストは6〜8割くらいがOm関連の話題になっており、Omメーリングリストかと見まがうほどである。近い将来に大化けしそうなライブラリなので、とりあえず試してみたいし、これからも注視していきたい。

*1:ここでいうJSXは、日本のD社で開発されているAltJS言語とは別の物

【広告】