無限ループ
Infinite Loop
無限ループは、終了へ到達せず繰り返し続ける処理です。終了条件の誤りで起きる不具合のほか、要求を待つ常駐処理などに意図して使う場合もあります。待たずに処理を回し続けると、画面の応答を妨げることがあります。
Webサーバーのアクセス待機や、ゲームの画面描画ループなど、システムを正常に稼働させ続けるために意図的に組み込まれた「コントロールされた終わらない処理」のこと。
🐾 猫で例えると?
茶トラがお尻を貸し、アメショが頭を預ける…。互いが互いを枕にし合うことで、見事な円(サークル)が完成しています。どちらかが立ち上がらない限り抜け出せないこの姿は、まさに「出口のない無限ループ」を思い出すたとえです。
💻 プログラミングにおける無限ループとは?
IT現場で「無限ループ」という言葉が使われる場合、大きく分けて「意図せず発生してしまったバグ(障害)」と、「システムを動かし続けるための意図的な設計」の2つの意味合いがあります。
1. バグとしての無限ループ(意図しない暴走)
意図しない無限ループは、処理が終わらない原因の一つです。while文やfor文などの繰り返し処理において、「ループから抜け出すための終了条件」をプログラマーが設定し忘れたり、間違えたりすることで発生します。
待ちを入れず同じ処理を回すとCPUを占有し、ブラウザーの入力や描画を妨げることがあります。ただしメモリが増えるかは処理内容次第です。常駐サービスのように入力を待って休むループと、忙しく回り続けるループは区別します。
2. 設計としての無限ループ(意図的な待機)
一方で、終わりのない処理が常に悪いわけではありません。私たちの生活を支えるシステムの多くは、制御された無限ループによって動いています。
- サーバーの常駐プロセス: Webサーバーは「ユーザーからのアクセスがいつ来てもいいように」常に待機状態を維持しています。
- ゲームのメインループ: 入力・状態更新・描画を繰り返します。更新頻度は固定60fpsに限らず、時間計測や表示環境に合わせて制御します。終了や一時停止を受け付ける設計も必要です。
⚠️ 無限ループが発生する原因と具体例
プログラミングで意図しない無限ループが発生してしまう、代表的な原因を見てみましょう。
// JavaScript:終了条件の変化を確かめる有限ループ
let remaining = 3;
while (remaining > 0) {
console.log("残り", remaining);
remaining -= 1; // 条件を終了へ近づける
}
console.log("終了");
// 更新を忘れると条件が変わらない。無限ループは実行しないこと。 主な原因は以下の3つに分類されます。
- 終了へ進む更新の確認: この例ではremainingを減らすことで、条件がfalseになります。途中のcontinueで更新を飛ばす場合なども、必ず終了へ近づくかを確認します。
- 条件式のミス:
i < 10と書くべきところをi > 0と書いてしまい、条件が常に「真(True)」になってしまう。 - カウンターの更新忘れ:
i++(iに1を足す処理)をループの中に書き忘れることで、数値が永遠に変わらない。
🛠️ 無限ループに陥った時の抜け出し方(対処法)
もし自分が書いたプログラムを実行して無限ループに入ってしまった(画面がフリーズしてしまった)場合は、慌てずに以下の対処を行いましょう。
- ブラウザの場合: 対象のタブの「×」ボタンを押して強制終了するか、ブラウザのタスクマネージャー(Chromeなら Shift + Esc)から該当タブのプロセスを終了させます。
- ターミナルの場合: Ctrl+Cで割り込みを要求できます。UNIX系では通常SIGINTに対応しますが、プログラムが処理・無視する場合もあり、必ず即座に強制終了するわけではありません。
- 根本的な解決策: 入力を小さくして、カウンター・終了条件・分岐を追います。調査中は反復上限を設け、必要ならデバッガーで停止して確認します。大量のログ出力自体が負荷にならないようにします。