Gauche:Debug

Gauche:Debug

デバッグの方法について 初心者向け

  • C/C++だと、再現するバグなら間違っている箇所を見付けるのは難しくない(もちろん例外あり) つもりだったですが、 Schemeはソースの動きを追うのが一苦労なうえに、間違っている箇所を見付けるのも難しいです。
  • Shiro(2007/09/05 13:39:49 PDT): 慣れが半分、後は「バグを出しにくいコードの書き方」が 半分でしょうか。
    出来る限り副作用無しで書いておくとバグの切り分けが非常に容易になります。たぶん、「ソースの動きを追う」という考え方自体、C/C++とSchemeで 差があるんではないかと思います。
  • その「差」についてもうちょっと詳しく教えてください。(tko)
  • Shiro(2007/09/06 02:15:03 PDT): Cなどの手続き型中心の言語では、「プログラムの 動作を時系列で追う」というのがプログラムを理解することの中心になると思います。 プログラムの状態が次々と書き換わってゆくので、ある変数の内容がどの時点で いくつであり、どの時点で変更されるのか、を把握してゆくことが重要ですね。 従って最終的にはデバッガでステップ実行してゆくことになります。
    関数型言語では、時系列での状態変化よりも、それぞれのコンポーネントで 「どういう入力があったらどういう出力が得られるか」という性質を追うことが プログラムの理解の中心になります。
    問題を生じる入力が複雑で巨大であっても、 関数のふるまいは入力を分割して与え、それぞれ出てくる出力を合成したものに なるので、理解できるまで入力データを分割して行き、予想と通りの出力が 得られるか、得られているとしたら入力を合成した場合に出力も予想通りに 合成されるか、といった点を調べてゆきます。
    デバッガでステップ実行するよりも、 関数単位でちょこちょこ入力を与えて出力を見るっていうふうに進めることが 多いですね。
    Schemeの場合は手続き型でも書けるので、アプローチとしては両者を併用することに なりますが、私の経験ではなるべく部品は関数的に書いておき、アプリケーションの レベルで状態を持たせるようにしておくと問題が追いやすくなります。

関連

More ...