Imaginantia

思ったことを書きます

雑記240827 健全なノード体系のこと

に「UE/BP の Sequence の挙動が気に食わない」ということを書きました。

それは「直観」に基づくものなのですけど、そういう話をなんとなく書いておこうと思いました。

Get

変数の Get/Set ノードがあります。x は 0 です。

0 と 1 が順に出力されます。違和感はないですね。本当に?

これは? 挙動は変わりません。0 と 1 が順に出力されます。

これは? もちろん変わりません。 0 と 1 が順に出力されます。

ではこれは何ですか?

0 でも 1 でもない。強いて言うなら…「x」そのものでしょうか?つまり変数参照であると。

ならこれは?

1 と 2 が出力されます。ならばあの「線」は何でしょうか? 「参照」ではないですね。

つまり、これまで値が流れているように見えていたものは、実際にはそうではないと。

つまり「線」を正確に解釈することを考えると、ただ「数字が流れる」程度の理解では足りないのです。

実際には「いつか行われる計算そのものが流れていて、実行ピンから参照されたときに初めて計算が実行される、という「解釈」が必要なわけです。

こういう状況、つまり「直観と意味が一致しない状況」を、私はよくないと考えます。

思ってるのと違う挙動ということは、そのままうっかりバグに繋がる可能性があるわけですね。参照セマンティクスがそうであるように。

で、何故今回「直観と意味が一致しなかった」のかというと、Getが純粋なフリをしているからだと考えます。

即ち、副作用によって結果が変化するものが、純粋な演算であるとみなされていることがおかしいのではないか、ということです。

Sequence

順番に実行する、という Sequence ノードがあります。

0, 1, 2 と順に表示されます。なんだか直観的な感じがします。本当ですか?

これは? 0, 0, 1 と表示されます。そうですね。

こうすると 0, 1, 2 と表示されます。

でもよく考えてみると、結構すごいことが起きてるはずで。

Print して Set した後、実行ピンの行き先がなくなった時、最後に分岐した Sequence に戻るわけですけど。

そのためには「これまでの Sequence をいくつ、どこまで実行したか」を覚えている必要があります。つまりリターンスタックがあるはず。

だから「線が無くなったら実行終了」ではなく、「線が無くなったら"戻るべき場所"に制御を戻す」なのですね。

無を示すちっちゃな三角形には重要な意味が含まれてるのです。C言語の return と同じですね。

で?

言いたいことは「ノードベースというのは、見た目と意味が一致しているはずじゃなかったのか」、ってこと…だと思います。

厳密にはノードグラフの代数系を作ってプログラム意味論を考えるという話になると思いますが。

「意味論がシンプルに記述できる」ということがそのまま「見た目から素直に挙動を推測できる」即ち「わかりやすい」ことのように思っています。

とはいえ、これは数学…というか「値が自由に扱える世界」から見た話なので、そういう世界を基準にした「わかりやすさ」という観念にはなっています。

例えばC言語みたいなやつは値が自由に扱える世界ではない (コピーやポインタが非自明) わけで、最終的にそういうところで動くものを記述する以上、現実的には「"わかりやすく"ないほうが良い」ということもあると思います。

でも私は値が自然に扱えるほうが好きですね。Houdini みたいに。

おわり。