言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

タイムラインのどこが難しいか

楽譜のようにプログラムを書けたらどんなに良いかと、例の TVML の関係で僕も考えていて、しかも、挫折したのでどこが難しいかを書く。

やりたい事。楽譜、コンピュータプログラム、脚本や歴史等を同一の方法で記述する。楽譜に習って言えば、ある表にイベントをパラパラとならば、時間は左から右に流れるとする。同時に起こるべきイベントが縦に並び、これは上下は関係無い。実行時には、現在時刻を示す「カーソル」が左から右へイベントを舐めて行き、下にあるイベントを実行する。

ここまでは簡単。だけど、これだけではわざわざ作る意味が無い。楽譜とカーソルの強力な点は、ランダムアクセス性にある。カーソルを楽譜の中ほどにもって行くと途中から演奏を始める事が出来るし、二倍の速さでカーソルを動かすと音楽は二倍の速度で動くだろう。

これは特に音楽なら簡単だ。なぜなら、音楽には「状態」が無いから、カーソル位置にある音符を鳴らすだけで事足りる。しかしアニメで考えてみよう。あるキャラが右から左へ動く。イベントとしては、最初の座標と最後の座標、そして動作にかかる時間があれば事足りる。もしもカーソルが中ほどを指せば、与えられた情報からキャラの居るべき位置を計算する。カーソルが移動後の時刻を突然指したら? キャラは移動後の位置に居なければならないし、その情報はどこかに記録されていなくてはならない。

ここから、ランダムアクセス可能なタイムラインを実現する為には、システムはまずイベントをすべて「コンパイル」し、タイムラインのあらゆる時刻についてオブジェクトの状態がどのような位置にあるべきかという事を調べておかなくてはならない。これはアニメならまあまあ簡単だ。しかし、

プログラムについて考えてみよう。もしもプログラムが「乱数」を扱う物だったら? マウスイベントを扱う物だったら? 事前にある時刻の状態をシステムは知ることが出来ない。だからある「プログラム楽譜」の任意の場所にカーソルを進めても、意味のある内容を返す事は出来ない。

ふむ、後ろ向きの事がばかり言っていても仕方が無いので、何が可能かを書く。

未来を予測する事は出来ないが、過去になら戻れる。メモリが無限にあると仮定すれば、あらゆる過去に戻る事が出来る。これに何の意味があるのか分からないが、整理するとこうなる。

  • イベントが状態を持たない場合、任意の時刻に到達できる世界が作れる(興味深い事に、イベントが世界に何の状態も残さないのであれば、そもそもそのイベントには何の意味も無いという事になる。しかし、人間は音のつながりを検知して脳の中にイメージを作り上げる。音楽は世界に状態を残さないが脳には残す)。
  • イベントが状態を持つ場合、すべての状態を事前に計算することで任意の時刻に到達できる世界が作れる。
  • イベントが状態と選択肢を持つ場合、過去に戻る事が出来る世界を作れる。