中断できるプログラムを

ゲームに簡単なプログラムを組み込むためにスクリプト言語とそれを実行するインタープリタをC++で作ってしまおうというコーナーです。
前回、値のことについてもう一度考えたりしました。

中断の必要性

第1回で例としてあげたスクリプトを再掲載します。

# 例えば、イベントとか
msg("ハローワールド!\nこんにちは世界である!!");
&eee(select("それがどうした", "なるほど", "げこげこ"));

sub eee {
    talk("みふみん", "あなたは".$_[0]."とおっしゃるのですね。");
    if ($_[0] eq "げこげこ") {
        for ($i=0; $i<10; $i++) {
            $p = $i*($p+1);
            msg($_[0].$p);
        }
    }
}

で。ここで大切なのは、ことあるごとにゲーム側に処理が移っているということです。
それも、見た感じでもわかるように、結構長い間スクリプトから離れているので、はっきりとした中断があるわけです。
つまり、いったんスクリプトを実行し始めたら一気に最後まで走らせて終わり、という構造じゃないってことです。

木構造は中断しにくい

図:木構造の中に中断が
図のように木構造があったとして、木構造から直接実行してゆく形式だと、途中(図では赤丸の部分)で中断された場合、どうやって続きから再開するのかが問題となります。
「どこで中断したか」を記憶しておけば問題なく戻れそうにも見えますが、木構造のノードの一部を実行したら、上のほうのノードに戻ってまたそちらの処理しなければならないので、どこをどのような経路で呼び出してきて中断されたかまで記憶しておかなければならないのです。
そんなものまで記憶して、再開時にそれを復元しようとしたら、とんでもなく複雑なプログラムになりそうですし、そもそも不可能かもしれません。
まあ、正直考えるのが面倒だということもありますが…。
しかし、この木構造から、ただ順次実行していくだけの単純な命令文のリストを作ることができれば、「どこで中断したか」は行番号だけで済みますし、実行速度もよさそうな気がします。