トラック3・🔍人間がコンピュータになる訓練

トレース表とは——実行を目で見る道具

読む目安 約12分・ゴール:トレース表の作り方と書き進め方のルールを覚え、自分で表を用意できるようになる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

ここからが、このポータルでいちばん力を入れている訓練です。やることは一つ。あなたがコンピュータになることです。

人はプログラムを読むとき、無意識に「こう動くはずだ」と期待を混ぜてしまいます。ところが機械は、書いてあることしかしません。この差がバグの正体です。だから、期待をはさむ余地のない読み方を身につけます。それがトレース表です。

トレース表とは

プログラムを1行実行するごとに、そのときの変数の値を紙に書き出した表のことです。実行の様子を、目に見える形で残します。

行 | a | b | 出力
---+---+---+-----
 4 | 3 | ー |
 5 | 3 | 4 |
 6 | 7 | 4 |

左端が実行した行番号、真ん中が各変数の値、右が画面に出たものです。「まだ作られていない変数」はー(横線)と書いておくと、いつ生まれたかが分かります。

列は自分で決める

表を書き始める前に列を決めます。決め方は簡単で、そのプログラムに出てくる変数を全部並べるだけです。あとは左端に行番号、右端に出力の列を足します。変数が3つなら5列の表になります。条件分岐があるときは「条件の判定結果」の列を、繰り返しがあるときは「何周目か」の列を足すと、さらに見通しが良くなります。列を決めた時点で、そのプログラムが何を覚えながら動くのかが見えてきます。

書き方のルール4つ

  1. 1行実行したら、表を1行増やす(まとめて書かない)
  2. 値が変わらない変数も、そのまま書き写す(空欄にしない)
  3. 通らなかった行は書かない(分岐で選ばれなかった側は存在しないのと同じ)
  4. 出力は出た瞬間に書く(あとでまとめて書かない)

特に2番が大事です。面倒でも全部書き写してください。空欄があると、そこで頭が推測を始めます。推測こそが、いま追い出したいものです。

師範わしが見てきた限り、伸びる者は必ず手を動かす。頭の中で追える気になった者が、いちばん間違えるのじゃ。

なぜこれが効くのか

理由は3つあります。

この先の使い方

道場の「トレース問題」は、この表の空欄を埋める形式です。つまりこのトラックの訓練が、そのまま出題形式になっています。また、この表と同じものを画面上で1ステップずつ動かせるのが、このポータルのメモリビジュアライザです。次のトピックから実際に使ってみましょう。

最初は「こんな面倒なことを毎回やるのか」と思うはずです。答えは「いいえ」です。慣れると頭の中に表ができるので、紙が要るのは難所だけになります。ただし、その頭の中の表は、紙で百回書いた人にしか作れません。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

トレース表を書く目的として、最も適切なものはどれでしょう。

  1. コードをより短く書き直すため
  2. コンパイルエラーを自動で修正するため
  3. 1行実行するごとの変数の値を書き出して、頭の中の推測を混ぜずに動きを確かめるため
  4. プログラムの実行を速くするため
答えを見る

正解:C(1行実行するごとの変数の値を書き出して、頭の中の推測を混ぜずに動きを確かめるため)

人はプログラムを読むとき「こう動くはずだ」という期待を無意識に混ぜてしまいます。トレース表は、その推測が入り込む余地をなくすための道具です。値が変わらない変数もそのまま書き写すのは、空欄があるとそこで頭が推測を始めるからです。

確認問題 2

トレース表を書いているとき、その行で値が変わらなかった変数はどう扱うのが正しいでしょう。

  1. 変わらなくても、同じ値をそのまま書き写す
  2. 空欄のままにして、変わった変数だけ書く
  3. 「同上」と書いて省略する
  4. 変わらない変数は、はじめから列に入れない
答えを見る

正解:A(変わらなくても、同じ値をそのまま書き写す)

面倒でも全部書き写します。理由ははっきりしていて、空欄や省略記号があると、そこで頭が「たぶんこうだろう」と推測を始めるからです。トレース表は、その推測を追い出すための道具でした。列の決め方も「そのプログラムに出てくる変数を全部並べる」なので、変わらない変数を外すのも誤りです。

「人間がコンピュータになる訓練」の目次

  1. トレース表とは——実行を目で見る道具
  2. 代入をトレースする
  3. 分岐をトレースする
  4. ループをトレースする
  5. バグを見つける思考法——仮説と検証
  6. ラバーダック・デバッグ
  7. エラーメッセージは敵ではない
  8. 総仕上げ——紙上プログラム実行

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版