昨日の記事で書いた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の視覚にマップするレイヤを作ればロボットを作るのに使えるかも。