ここからが、このポータルでいちばん力を入れている訓練です。やることは一つ。あなたがコンピュータになることです。
人はプログラムを読むとき、無意識に「こう動くはずだ」と期待を混ぜてしまいます。ところが機械は、書いてあることしかしません。この差がバグの正体です。だから、期待をはさむ余地のない読み方を身につけます。それがトレース表です。
トレース表とは
プログラムを1行実行するごとに、そのときの変数の値を紙に書き出した表のことです。実行の様子を、目に見える形で残します。
行 | a | b | 出力
---+---+---+-----
4 | 3 | ー |
5 | 3 | 4 |
6 | 7 | 4 |左端が実行した行番号、真ん中が各変数の値、右が画面に出たものです。「まだ作られていない変数」はー(横線)と書いておくと、いつ生まれたかが分かります。
列は自分で決める
表を書き始める前に列を決めます。決め方は簡単で、そのプログラムに出てくる変数を全部並べるだけです。あとは左端に行番号、右端に出力の列を足します。変数が3つなら5列の表になります。条件分岐があるときは「条件の判定結果」の列を、繰り返しがあるときは「何周目か」の列を足すと、さらに見通しが良くなります。列を決めた時点で、そのプログラムが何を覚えながら動くのかが見えてきます。
書き方のルール4つ
- 1行実行したら、表を1行増やす(まとめて書かない)
- 値が変わらない変数も、そのまま書き写す(空欄にしない)
- 通らなかった行は書かない(分岐で選ばれなかった側は存在しないのと同じ)
- 出力は出た瞬間に書く(あとでまとめて書かない)
特に2番が大事です。面倒でも全部書き写してください。空欄があると、そこで頭が推測を始めます。推測こそが、いま追い出したいものです。
なぜこれが効くのか
理由は3つあります。
- 記憶に頼らなくなる — 人が同時に覚えられる数は5個程度。変数が3つでも、ループが回れば頭は破綻します
- 食い違う場所が特定できる — 期待と違う値になった最初の行が、バグのある場所です
- 理解が言葉にできる — 表を指さして「ここで値が入れ替わっている」と説明できます
この先の使い方
道場の「トレース問題」は、この表の空欄を埋める形式です。つまりこのトラックの訓練が、そのまま出題形式になっています。また、この表と同じものを画面上で1ステップずつ動かせるのが、このポータルのメモリビジュアライザです。次のトピックから実際に使ってみましょう。
最初は「こんな面倒なことを毎回やるのか」と思うはずです。答えは「いいえ」です。慣れると頭の中に表ができるので、紙が要るのは難所だけになります。ただし、その頭の中の表は、紙で百回書いた人にしか作れません。