Short cuts: [Prev] [Up] [Next] [Return to Top]

止まらない可能性のあるプログラムはタコ(Dec.11)

 ある関数やプログラムは、必ず止まる(戻る)ように作るのが良いという。

 数値演算プログラムで良く言われる事なのだが、計算が発散していつまでも演算が終了しない可能性があるアルゴリズムは危険であり、いつかは必ず止まる、つまり停止性が保証されているアルゴリズムをできる限り採用すべきであるという。

#とても当たり前の事を言っているようだが、コストとの兼ね合いでそうも言ってられないのが現実ではある

 …数値演算だけではない。普通のプログラムでも同じ。もっとも、通信プログラムで応答が返ってくるものと期待していて、それが来ないと二度とループから抜けない
…ような間抜けなルーチンを今時書く人は(普通)いない。

 そうではなくて、

 どんな時も安全に終わる(戻る)ように作る、という事。

「文字列から括弧'(', ')'に挟まれた単語を取り出す」という処理を考えてみる。

1. '('が出てくるまで文字を読み飛ばす
2. '('が出てきたらそれ以降の文字はバッファに入れる
3. ただし文字が')'だったら処理終了
4. 1.に戻る

 …というフローを考えた人、失格。これでは駄目。場合によっては無限ループになるでしょ?(まぁ、その覚悟で作ってるならしょうがないが)

 文字列の終わりの判断が抜けているとか、そういう意味ではなくて、「必ず')'がある」という前提で考えている点が良くない。そして')'がなかったらどうなるのか不明。停止が保証されていないのだ。

 この例の場合は確かに文字列の終わりを判断すれば恐らく確実に停止できる。')'が無くてもだ。が。

 何にせよ、プログラム/関数は:
1. 停止しない場合はあるか
2. どういう状況で停止するか
 この2つは必ず考えておかねばならない。特に2.。よく分からない状況で止まってもらっても困る。ちゃんとプログラマの意図した通りの止まり方をしてもらわないといけないのだ。それがたとえ致命的なエラーとなったにしても。

 分かりにくいのでもう一つ例としてVisual Basicのリファレンスをあげておく。関数の説明を見ると、「…でない場合は、」という説明があるはず。
 関数本来の使われ方でない場合でも「ちゃんと」停止するようになっている訳。

 大体、プログラムがトラブるのは「…でない場合、」の処理がなされていないか、曖昧である場合が多い。
 処理が成功しようが失敗しようが、プログラムはきちんと終了・停止しなければならないのだ。

#ちょっと話がねじれた(-_-;

PS. もちろん、何でもかんでもチェックしていたらたまったものではない。ちゃんと停止しない危険性とチェックにかかるコストをはかりにかけて決めるべき。
  そしてより安全な(チェックしなくて良い)アルゴリズムがあれば、そうすべきである。ただ、いつもそう安全なアルゴリズムがあるとは限らない。
  いずれにせよ、うまくいかなかった時の得失を必ず考えておくべきだという話。

%昔、モンテカルロ法を適用した時に、乱数の周期とシミュレーション条件が一致してプログラムが停止しなかった事がある……(って言って、何がどうなったのか分かるかな?)
Short cuts: [Prev] [Up] [Next] [Return to Top]