コンピューター理論、チョットデキルようになりたい

コンピュータサイエンスの学び直しです

学び直し40日目:8章 バーチャルマシン#2:背景(プログラムフロー)

記録

7章で作った VM に、プログラムフローとサブルーチン呼び出しを追加する。これにより、VM が完成する。

プログラムフローは if、while、for など、条件に応じて次の実行先が変わる処理のこと。サブルーチン呼び出しは、プログラム実行中にサブルーチン(プロシージャ、関数、メソッドと同じ概念)に処理を渡して、そちらの処理が終わったら結果と処理を返してもらうこと。

これらの実現には、スタック処理が用いられる。

プログラムフロー

「goto distination」コマンドを用いて、任意の場所にある命令を実行する。distination の指定には、スタックの最上位にある値を条件とする。スタック最上位値が 0 でなければ指定された場所へ移動する。0 であれば jump せずに次のコマンドを実行する。

サブルーチン呼び出し

ビルトインコマンドや、ユーザーが定義する抽象的なコマンドをサブルーチン(プロシージャ、関数、メソッド)と呼ぶ。

ビルトインコマンドはコマンドをそのまま記載すれば呼び出せるが、ユーザー定義のサブルーチンは "call" を使って呼び出す。使い方はどちらも同じで、スタックから引数を読み出し、結果をスタックの最上位に返す。

サブルーチンの処理順序をいい感じにコントロールすることをハウスキーピング処理というらしい。処理の実行順序の整理も、スタック処理が利用されている。call-return ロジックという方式を利用している。

call されたらそのサブルーチンのローカル変数や引数、ワーキングスタック(pop, push, add などの命令)とリターンアドレスをメモリ領域(この領域をフレームとよぶ)に確保していく。このことをグローバルスタックというらしい。で、先にスタックされたサブルーチンは、あとから入れられたサブルーチンが終わるまで待ちの状態となる。まさに LIFO のスタック処理。

今日の筋トレ

リングフィットアドベンチャー