昨日の記事で書いたVOC (Vision Oriented Communication) の実装を支援するライブラリを作った。
READMEを英語で書いたのでここに日本語版を書いとく。
VOCのコンセプト
- オブジェクト指向やアクターはpushベースだけど、実世界のコミュニケーションの多くはpullベースだ。
- 僕らはレシーバを指定したメッセージを送らない。
- 僕らは自分の見た目(e.g. 表情)や自分の周りの状態(e.g. 声)を変える能力を持っている。
- 僕らは自分の周りの景色を見て、情報を引き出して、それに基づいて行動する。
- 僕らはそれぞれバラバラに勝手に非同期に行動している
僕らは赤信号が見えたらブレーキを踏むわけで、赤信号が僕らのbrakeメソッドを呼んでくれるわけじゃない。
実装
VOC.Visual(state)
は見た目を作る。- 見た目は状態への参照で状態はイミュータブルなマップ (e.g.
{address: {}, recognized_as "apple", mass: 5}
) VOC.Visual#deref()
は見た目の状態のコピーを返すVOC.Visual#swap(fn)
で見た目の状態をアップデート出来るVOC.Space
は複数の見た目を格納する場所を作るVOC.Space#see(fn)
は視界を表す関数を取って、視界の中にある見た目の配列を返す- Dumb Object(バカなオブジェクト e.g. りんご,椅子)は見た目で表現する
- Intelligent Object(計算能力を持つオブジェクト e.g. 動物,ロボット,ドライバーが乗った車)は、見た目と、視覚の情報を元に見た目を更新するループ(AI)で表現する
表現力
VOCは関数型プログラミングと相性のいいインターフェースを持っている。
例えば自分の周りに赤信号があるか調べるコードは以下のように簡潔に書ける。
vision = space.see(U.sight360(MYADDRESS, 30)); //30m以内の範囲を見る vision .filter(U.recognize("traffic light")) //視覚の中から信号を全て見つける .some(U.propEq("color", "red")); //赤いものはあるか調べる
デモ
- 交通のシミュレーション: http://ympbyc.github.io/VOC/examples/traffic.html
- ソースコード: https://github.com/ympbyc/VOC/blob/master/examples/traffic.js
VOCの利点
- N感(視覚、嗅覚、聴覚、触覚、味覚など)と計算能力を持った物を自然に、僕らが普段無意識にしているように書ける。
- それぞれの物がループを持っていて、コミュニケーションが非同期に行われるモデルは、各自がそれぞれ勝手に行動する現実に即している。
VOCの欠点
- プルベースなので、プッシュベースのオブジェクト指向とかアクターとかイベント駆動に比べて無駄が多い。並列化は容易なのでコアが増えるにつれて気にならなくなっていくはず。
用途
現時点でVOCはオブジェクト指向とか関数型みたいなパラダイムを置き換えるものではない。
用途として思いつくのははシミュレーションとかゲームくらい。ウェブカメラの映像からVOCの視覚にマップするレイヤを作ればロボットを作るのに使えるかも。
[追記 6/14/2014]
種明かし
大げさに書いたけど、VOC.jsの中身はスッカスカで、ごく単純なオンメモリのNoSQL DBと見ることもできる。Space
に、address
を持っているってこと以外スキーマレスなオブジェクトをばかばか突っ込んでいって、Space#see
でサブセットを配列として取得するってとこまでしかやらない。
address
は別に{x: 0, y: 0, z: 0}
みたいな形じゃなくても良くて、例えばツイートを突っ込みたかったらnew Visual({address: "ympbyc", text: "wot up", recognized_as: "tweet"})
みたいなのを突っ込んで、Space#see
に自分がフォローしてる人ならtrueを返す述語を渡せば自分のタイムラインを取得したりってことはできなくもない。
だからVOC.js自体は全然たいしたライブラリじゃない。視覚指向コミュニケーションていうのは結局、僕らが既に "DBをバックエンドに持ったAPIサーバと、それを使う複数のアプリ" っていうでかい規模でやっていることの規模を小さくして、一つのアプリの中に突っ込むと面白いことができるよっていう話なんだ。
VOCは技術的な進歩じゃなくて、これを視覚と見た目っていう視点で捉えたところだけが新しいんだと思う。