デバッグ

コンピュータに与えるプログラムに含まれる論理的誤りのことを バグ という。

プログラムにひそんだバグを取り除く作業のことをデバッグ とい う。デバッグするためには、プログラムが動くときのことを頭の中で追いかける 必要があるので、文法エラーを取り除くのよりはるかに時間がかかる。プログラ ムを作る過程では、最初に書き進めて行く時間よりも後から間違いを直す(デバッ グする)時間の方が長いと。熟練するにつれ、デバッグにかかる時間が短くなり、 同時に最初からバグのないプログラムが作れるようになる。

授業で作るプログラムも徐々に複雑になっていくので、プログラミングに掛 ける時間を節約する意味で、

を覚えておこう。

エラーを起こしにくい書き方

開けたらすぐ閉める!

if, while, open などは必ず対応する end を書く必要がある。にもかかわらずend を忘れでエラーになることが最初のうちは多い。end を後 で入れるから忘れるのである。あとでendが必要な 構文を書いたら、すぐに前もってendを書くよ うにすると忘れない。

if y%3 == 3 then
    ←endを書いてから中味を書き始める
end
変数名は分かりやすく

大事な意味を持つ変数を、xとかx2 無味乾燥な名前にせず、maxninzu, goukei といった 値の意味が想像しやすい名前にする。

また、変数名のスペルミスでエラーになるのは悲しいので、 積極的に補完を利用する。Emacsであれば単語を2〜3文字打った状態で M-/ を押すとバッファ内に同じ単語があったときに 単語の残り部分を補ってくれる。

大事なところにコメントをつける

制御構造や条件分岐にはかならず意味があるはずである。 意味を表すようなコメントを書いておく。

無意味なコメントの例

point=[]			# point配列を用意
sum=0				# sumを0にする
i=0				# iを0にする
while line=gets			# getsの間繰り返す
  point[i] = line.to_i		# point[i]にline.to_iを代入
  sum += point[i]		# sumにpoint[i]を足す
  i += 1			# iに1を足す
end

意味のあるコメントの例

point=[]			# 全員分の得点を記憶する配列
sum=0				# 合計を保存する変数をクリア
i=0				# 今何人目か
while line=gets			# 入力が続く間繰り返す
  point[i] = line.to_i		# i人目の得点を記憶
  sum += point[i]		# 合計得点に追加
  i += 1
end

Emacsであれば、M-;(メタセミコロン)をタイプすると簡単に 決まった桁位置に # が入れられる。

デバッグのしかた

printfデバッグ

プログラミングの初歩の段階では、変数の値が未定義だったり、 変数の値を変えずにループを作って暴走させてしまったりと、 変数の値が予期せぬ状態になっていることが原因のバグが多い。 これを確認するために、現在の変数の値を要所要所で出力する printf をさし込むと良い。

line=gets
while match > 0
  printf("debug: 今のマッチは%d本\n", match);
   :
   :
end

このように、printf を挟んで、そのときの変数状態を 表示してデバッグする方法を、printfデバッグ といい、初歩的ではあるが複雑なプログラミングのときにも 有効な方法である。


目次