基礎言語★無限ループしたいよぉ
無限ループって怖くね?
いやいや、よく使うものですし知らないと困るものです。
とはいっても、仕組みが難しくないせいか案外おまけ程度の説明で終わりますよね。。。
なお、よく使うのですが注意もありますので、気になる方は文末へ。
(文章修正2021/01/11)
BASIC
10 PRINT "proc"
20 GOTO 10 '10行に戻る (行にラベルをつける方法もある)
30 'Breakキーで停止させる
ExcelVBA
Do
Selection.Value= "proc"
Selection.Offset(1,0).Select 'Excelの選択セルをひとつ下に移動する
Loop
'Breakキーで停止させる。ループを抜ける「Exit Do」も使える
C言語
while(1){
printf("proc\n");
}
for(;;){
printf("proc\n");
}
//上記2つのどちらでもOK。ループを抜けるには「break」を使う
Perl
while(1){
print "proc\n";
}
for(;;){
print "proc\n";
}
//C言語と同じ書き方で使える。ただしループを抜けるには「last」を使う
Java
while(true){
System.out.println("proc");
}
for(;;){
System.out.println("proc");
}
//C言語とほとんど同じですが、Javaではtrueを書くのが一般的のようです
//ループを抜けるには「break」を使います
Python
while True:
print("proc\n")
#Trueは1でもOK。ループを抜けるには「break」を使います
無限ループの是非
コンピュータにずっと繰り返し計算をさせたり、入力値の変化を待ったりと、無限ループは使いどころが多いです。
しかし、無限ループを実行している間、コンピュータは休むことなく、CPUとメモリがフル活動していることに注意してください。
例えば、1秒に1回だけ処理Aを実行したいとします。
実現のために下記のプログラムではどうでしょうか。
(1)処理Aを実行する
(2)現在時刻を取得する
(3)無限ループに入る
(3-1)現在時刻を取得する
(3-2)現在時刻が(2)の時刻から1秒過ぎたらbreakでループを抜ける
(3-3) (3-1)に戻る
(4) (1)に戻る
実際、処理Aは1秒に1回だけ実行されます。
しかし、何も実行してないように見える(3)でもCPUは動作クロックの入る限り働き続けて、しっかりと電気を消費します。さらに問題なことに、(3)のループがCPU稼働率を上げると他のプログラムが重くなるなど影響がでてしまいます。
こんなときは、タイマー割り込みを使うことができるならばその方がおすすめです。
(1)処理Aを用意して、割り込み発生時の処理になるよう登録する
(2)1秒ごとにタイマー割り込みが発生するように設定する
(3)タイマーの動作を開始する
(4)その他の処理を実行や、CPUのスリープ…など
ここではタイマー割り込みで考えてみましたが、キー入力待ち、通信の受信待ち、ちょっと特殊ですがマイコンではセンサー入力待ちなどが利用できます。
ただ、ゲームプログラミングでボタン入力待ちなど消費電力は大して問題ではなくプログラムを凝る必要が無いならば無限ループ待ちで簡単に済ませて十分ともいえます。ループで待つか割り込み待ちをするか、用途に合わせて使い分けてみてください。