無限ループ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/26 10:31 UTC 版)
専門用語としての他、刺激的に感じられる他の用語(例えばメモリリーク)と同様に、不正確な通俗的な使い方もされている(「日常会話での使用」を参照)。専門的な意味としての無限ループは、通常プログラマが原因を突き止めることができる、と簡単に考える者もいる[要出典]ようだが、実際のところそうではないこともある(#無限ループの検出)。
ループ
理論的には、すなわち、計算理論と呼ばれている分野の観点からすれば、なにかについてそれが「計算可能である」とするには、無限ループになりえないことが必要である。しかし、現実のプログラムが対象とするものは必ずしも、理論がいう「計算可能」なものとは限らないし、時にはバグなどによって、決して終了することのない無限ループが発生する。また現実にはしばしば「終了することのないコンピュータ・プログラム」は必要なものですらある。例えば表計算ソフトウェアやワープロソフトウェアは利用者からの明示的な指示がない限りは起動した状態でいなければならない。またインターネットやデータベースなどのサーバプログラムの多くは「リクエストを待ってサービスする」ことをいつまでも繰り返すし、オペーレーティングシステムのようなより低い階層のシステムではそういうものが多い。しかしほとんどの場合、そういったシステムは何らかの方法で止める手段があり、それらとは異なり「無限ループ」という言葉は意図した結果ではないため割込みや強制シャットダウンといった手段でしか止められないような状況を指して使われることが多い(すなわち、原因にバグがあるといったような場合である)。
さらに、慣用的な用法としては「ループ抜け出す条件が入り組んでいて、ループの先頭部分でも終端部分でもない手続きの中間部分でループから抜け出す必要があり、そのためループ自体は無限ループの形で書いておき、ループの途中で必要に応じてから途中脱出機能を使って脱出するというような場合を「無限ループの形」と称することもある。
明示的な無限ループの例
BASICでの簡単な例:
10 LET x = x + 1
20 PRINT x
30 GOTO 10
ここでのループは明らかで、最終行の実行後、無条件に先頭行が実行される。
浮動小数点数の比較に伴うバグによる無限ループ
終了条件を評価する時の予想外の挙動でも、この問題は発生する。以下は、C言語での例である:
float x = 0.1 ;
while (x != 1.1)
{
printf ("x = %f\n", x) ;
x = x + 0.1 ;
}
このループは、期待通りに10回実行されるシステムもあるかもしれないが、終了しないシステムもあるかもしれない。ここでの問題は、ループの終了条件 (x != 1.1)
が2つの浮動小数点数の厳密な一致をテストしていることである。多くのコンピュータの(2進の)浮動小数点の計算では 0.1 という値は正確に表現できないため、それを11回足した値がリテラルの 1.1 の値と厳密に一致するとは限らない。
浮動小数点値を使う時には、等式でテストを行うと予想外に失敗する可能性があるため、不等式でテストすると安全である。例えば x が 1.1 と等しいかどうかをテストする代わりに (x < 1.1)
や (x <= 1.0)
でテストする。そのどちらでも、有限回数の繰り返しで脱出できる。
数列の収束判定に伴う無限ループ
数値解析でも似たような状況が起きることがある。ある結果を求めるために、ある許容値に誤差が収まるまで繰り返す、という手続きを使うことがある。しかし、式に問題があって誤差がその許容値を下回ることが無ければ、結果として無限ループになる。
循環リストに起因する無限ループ
連結リストのようなデータ構造がループを持っているのに、それに対してリストに添う繰返しを行ってしまう、というようなパターンもある。データ構造のループの検出はちょっとした練習問題として知られている。簡単な例として、12、99、37の3つの整数値を格納した循環リストの中身をひとつづつリストに沿って出力する処理をすると「12、99、37、12、99、37、12、99、37、…」と無限に出力することになる。
複数のプログラム間で発生するループ
単体のプログラムでの無限ループは通常予測しやすいが、複数の要素が相互に影響しあったループは遥かに予測しにくい。ここで、リクエストを理解できない時にはいつもエラーメッセージを返すサーバについて考えてみる。明らかに、そのサーバには無限ループの可能性は全く無いが、そのようなサーバが2つ(AとB)あるとする。サーバAがサーバBから受け取ったメッセージを理解できなかった時、AはBにエラーを返す。Bがメッセージを理解できなかったらそのエラーをAに返し、そのエラーメッセージをAが理解できなければまた別のエラーメッセージを返し、これが永遠に繰り返される。このような事態のよくある例がメールループである。
- ^ Alderson Loop The Jargon File, Version 4.4.7. Accessed 5/21/2006. (Public Domain) (英語)
- ^ The Story of Mel "Perhaps my greatest shock came ~" から後のくだり
- ^ Caught in an infinite loop (無限ループにハマりました) 日常会話での使用例。 (英語)
- ^ Confession of an infinite looper (無限ルーパーの告白) ある曲だけを繰り返し聞いている人。 (英語)
- ^ infinite loop
- 1 無限ループとは
- 2 無限ループの概要
- 3 特異な例
- 4 無限ループの検出
- 5 関連項目
- 無限ループのページへのリンク