実行トレース
実行トレースは、プログラムの一回の実行を文ごとに記録します。プログラムカウンターがどの行にあり、各ステップ後に変数が何を持つかを示します。現在行と状態を合わせると、処理を順に追えます。
プログラムカウンターは、レシピの手順を指す指に似ています。一つ実行して次へ移り、ループでは前の条件へ戻ります。本レッスンは矢印で現在行、状態パネルで変数、コンソールで出力を示します。
実行トレースの仕組み
通常は次の行へ進みますが、while はその順序を変えます。条件が真なら本体へ入り、終わると条件に戻って再確認します。偽なら本体を飛ばして後続の文へ進みます。
本例は n から 1 までを足します。total をゼロにし、n > 0 の間、n を加えてから n を一つ減らします。スライダーが初期入力を決めます。五行のコードは変わらず、そこを通る値だけが変わります。
ステップごとの解説
既定の入力は n = 3 です。
- 1 行目:
total = 0がtotalを作り、0 にします。 - 2 行目:
while n > 0で3 > 0が真なので、本体へ入ります。 - 3 行目:
total = total + nが現在値で0 + 3を計算し、totalを 3 にします。 - 4 行目:
n = n - 1でnが 2 になり、2 行目へ戻ります。 - 二巡目:
2 > 0は真、total = 3 + 2 = 5、nは 1 になります。 - 三巡目:
1 > 0は真、total = 5 + 1 = 6、nは 0 になります。 - 2 行目:
0 > 0は偽なので、本体を飛ばします。 - 5 行目:
print(total)が 6 を出力し、終了します。
矢印は 1–4 行目を進み、三回 2 行目へ戻り、最後に偽の条件から 5 行目へ移ります。戻る動きは通常ステップの 1.5 倍の長さで、方向の変化を見せます。状態パネルは変更された変数を点滅させ、記録は文の実行前の値で 0 + 3 → 3 や 3 > 0 → true を示します。
実行された仕事を数える
非負入力 n では、一回の初期化、n + 1 回の条件確認、2n 文の本体、一回の print で、計 3n + 3 文です。条件確認には最後の偽になる一回も含めます。ソースは五行のまま、トレースが増えます。
| 入力 | 本体の反復回数 | 実行した文の数 | 出力 |
|---|---|---|---|
n = 1 | 1 | 6 | 1 |
n = 3 | 3 | 12 | 6 |
n = 6 | 6 | 21 | 21 |
ソースは静的なテキストで、トレースは動的な過程です。実際のインタープリターはバイトコード、コールスタック、最適化も扱いますが、この文の順序と状態変化を保ちます。後の関数呼び出しや再帰も、このモデルの上で理解できます。
境界ケース
n = 0:最初から0 > 0が偽で、本体を実行せず 0 を出します。2 行目から 5 行目へ進み、本体より前に条件を調べることが分かります。n = 1:一巡だけで、1 を足し、0 へ減らし、次の確認で終了します。- スライダーの上限は
n = 6:さらに大きな正数も同じ五行を使い、反復が増えてtotalが大きくなります。
よくある間違い
n = n - 1を忘れる。 正の入力ではnが 0 にならず、条件が真のままで終了しません。whileをifと同じに読む。ifのブロックは最大一回で先へ進み、whileは毎回条件へ戻ります。- 代入後の値で右辺を計算する。
total = total + nは旧値を読んでから書きます。ここでは0 + 3であり、3 + 3ではありません。 - プログラムカウンターを普通の変数と考える。 実行位置を記録するもので、このプログラムのデータとは別なので状態パネルには出ません。
このレッスンでの簡略化
実際の Python インタープリターはバイトコードを実行し、フレームを管理します。ソースファイルの上を矢印が動くわけではありません。図が示すのは、コードを読んでデバッグする際の意味の層です。文が制御フローに従って作用し、各ステップで状態が変わります。