プログラマー脳の状態遷移表の例
https://scrapbox.io/files/656935a85fcb4500253ed537.png
図 4.7 数値の二進数表現変換を行う BASIC プログラムの状態遷移表の一部
このように、多くの計算処理が相互に関連し合うようなコードを理解する必要がある場合に
は、図4.7に示すような状態遷移表を記憶補助ツールとして使うと便利です。
状態遷移表を作る手順を次に示します。
●1. すべての変数の一覧を作る
このプログラムにおいて、 前節で解説した依存関係グラフをすでに作成している場合は、
すべての変数を同じ色の丸で囲んでいるので、リストを作成するのは簡単でしょう。
●2. 表を作り、 すべての変数の列を作成する
状態遷移表では、図4.7に示すように、 各変数用の列をそれぞれ作り、そこに変数のそれ
ぞれのタイミングでの値を記述できるようにします。
●3. コードの実行の区切りとなる部分ごとに表に行を追加する
複雑な計算を含むコードでは、 計算に依存するループや、複雑なif 文など、 複雑なコード
の各行間の依存関係も含まれる可能性が高いでしょう。 状態遷移表の各行は、それぞれの
依存関係のかたまりの部分を表します。 たとえば、図4.7に示すように、 初期化コードと、 それ
に続くループの1回の繰り返しを1行ずつ記述できます。 ほかにも、 大規模なif文の条件分岐
ごとに行を追加することもできるでしょうし、単に処理のまとまりをグループとして扱って行に
追加することも可能でしょう。 あるいは、 コードが複雑で1行に多くの処理が詰め込まれてい
るようなケースでは、 コード1行ごとに表中の行を追加したほうがよい場合もあります。
●4. コードを頭の中で実行し、 各変数が持つ値を状態遷移表のそれぞれの行に書き込む
状態遷移表の準備ができたら、 コードを頭の中で実行し、それぞれの行での各変数の値
を計算します。 このように、 頭の中でコードを実行するプロセスをトレース、 あるいは認知的
コンパイルと呼びます。 状態遷移表を使用してコードをトレースする場合、 いくつかの変数を
スキップしてテーブルの一部だけを埋めたくなるかもしれません。しかし、 その誘惑に負けな
いようにしましょう。 きちんとすべての変数について作業することで、 コードをより深く理解す
ることができ、でき上がった状態遷移表は、 ワーキングメモリの負荷を軽減してくれます。
後でもう一度このプログラムを読むときには、この表を参考にすることで、詳細な計算処理よ
りもプログラム全体の処理の流れに集中することができるようになります。
ワーキングメモリの働きをサポートするアプリケーション
ワーキングメモリの負荷を軽減するために手動で可視化を行うことは、コードをまず
は細かく見ていくことが必要であり、 非常に価値の高い作業であるといえます。 しかし、
こうした可視化を自動化することも可能です。 カリフォルニア大学サンディエゴ校の認知
科学のフィリップ・グオ (Philip Guo) 教授が作成した 「PythonTutor」は、まさしくその
目的のために開発された素晴らしいアプリケーションです。 Python Tutor は、 プログラム
の実行内容を可視化することができ、 Python だけでなく、 その他多くのプログラミング
言語で利用できるようになっています。 たとえば、 図 4.8は、 Python において整数値とリ
ストが異なる方法で保存されていることを可視化しています。 整数値が値として保存され
ているのに対し、 リストはポインタのような仕組みを用いて保存されています。