24-04-2020، 2:02
<<حلقه بی نهایت (Infinite Loop) یا حلقه بی پایان (Endless Loop) به گونهای از حلقه ها گفته میشود که در آن مجموعهای از دستورات به صورت نامتناهی تکرار میشوند. به عبارت بهتر دستوراتی که در بدنه این نوع حلقه قرار میگیرد تا زمانی که برنامه در حال اجراست تکرار میشود.>>
حلقه بینهایت، حلقه بیپایان، یا حلقه بیفایده، دنبالهای از دستورالعملها در یک برنامه رایانهای است که به شکل نامحدودی تکرار میشوند. یا به این دلیل که شرطی برای پایان یافتن حلقه تعیین نشده، یا اگر تعیین شده، طوری است که آن شرایط هیچگاه اتفاق نمیافتد یا اینکه شرط پایان، حلقه را مجدداً از ابتدا اجرا میکند. در سیستمعاملهای قدیمی که از چندوظیفهای تعاونی استفاده میکردند، حلقههای بیپایان معمولاً باعث میشدند تا کل سیستمعامل غیرپاسخگو شود. در مدلهای چند وظیفهای فعلی که به شکل غیر انحصاری است، حلقههای بینهایت باعث میشوند تا برنامه کل زمان در دسترس پردازنده را مصرف کند، اما معمولاً کاربر میتواند آنها را از بین ببرد و به آنها خاتمه دهد. همچنین حلقههای انتظار مشغول هم گاهی اوقات حلقه بینهایت نامیده میشوند. یکی از دلایلی که میتواند باعث هنگ کردن سیستم شود همین حلقههای بینهایت هستند. از دیگر دلایل هنگ کردن سیستم میتوان به بنبست یا نقض دسترسی اشاره کرد.
نحوه شکل گیری حلقه های بی نهایت
یک حلقه بدون پایان میتواند در اثر عوامل مختلفی نظیر وجود شرطی که هرگز حلقه را به پایان نمیرساند و یا وجود دستوراتی که مانع از به پایان رسیدن حلقه میشوند شکل بگیرد. در واقع حلقه های بی نهایت الزاما نوعی حلقه مجزا با یک کلمه کلیدی از پیش رزرو شده متمایز در زبانهای برنامه نویسی نیست؛ بلکه هر حلقه یا ساختار جریان کنترلی که منجربه تکرار دستورات به تعداد نامتناهی شود یک حلقه بی نهایت را تشکیل میدهد. این ساختار میتواند شامل هرچیزی اعم از یک حلقه معمولی و یا استفاده از دستور GOTO برای ایجاد یک حلقه بیپایان باشد.
حلقه های بی نهایت ممکن است به صورت عمدی یا غیرعمدی (ناخواسته) به وجود بیایند. به عنوان مثالی از کاربرد عمدی این نوع حلقه ها میتوان به استفاده از آنها در سیستمهای تعاملی به منظور بررسی مدوام ورودی ها (مانند کلیدهای فشرده شده توسط کاربر) اشاره نمود. در طرف مقابل ممکن است به دلیل اشتباه برنامه نویس، حلقه های بی پایان غیرعمدی در برنامه شکل بگیرند که این اتفاق معمولا در مورد برنامه نویسان تازه کار و کم تجربه رخ میدهد.
حلقهزنی عمدی یا غیرعمدی
حلقهزنی به تکرار کردن مجموعهای از دستورالعملها تا زمان برقراری یک شرط خاص گفته میشود. حلقه بیپایان وقتی اتفاق میافتد که شرط حلقه همیشه برقرار باشد. البته این مورد بستگی به نوع حلقه دارد.
حلقهزنی عمدی
موارد کمی وجود دارد که عمداً میخواهیم یک حلقه بینهایت داشته باشیم. برای مثال، بازیهای مبتنی بر کارتریج در کنسولهای بازی، معمولاً هیچ شرط خاصی برای پایان دادن به حلقه اصلی خود ندارند، چرا که هیچ سیستمعاملی در آنجا وجود ندارد تا برنامه از آن خارج شود. حلقه به اجرای خود ادامه میدهد تا وقتی که دستگاه خاموش شود.
حلقهزنی ناخواسته
این اصطلاح بیشتر در مواقعی استفاده میشود که هدفمان چنین چیزی نباشد و حلقه بینهایت بر اثر یک حفره و به صورت ناخواسته اتفاق بیفتد.
یک مثال ساده به زبان سی:
مثال بالا بدون توقف پیغام Infinite Loop را چاپ میکند. شرط پایان عدد ۱ است و بنابراین مقدار این شرط همیشه درست بوده و حلقه تا ابد اجرا میشود. مثال زیر یک حلقه بینهایت را به زبان بیسیک نشان میدهد:
یک حلقه مشابه به زبان اسمبلی:
جالب است بدانید حلقه های بی نهایت ممکن است باعث هنگ کردن و فریز سیستم شوند. اما در صورتی که سیستم همچنان به واکنشهای کاربر پاسخگو باشد معمولا میتوان حلقه های بدون پایان ناخواسته را با روشی مثل استفاده از Task Manager و پایان دادن به فرایند مربوطه متوقف نمود. /ویکیپدیا، تکدیک
حلقه بینهایت، حلقه بیپایان، یا حلقه بیفایده، دنبالهای از دستورالعملها در یک برنامه رایانهای است که به شکل نامحدودی تکرار میشوند. یا به این دلیل که شرطی برای پایان یافتن حلقه تعیین نشده، یا اگر تعیین شده، طوری است که آن شرایط هیچگاه اتفاق نمیافتد یا اینکه شرط پایان، حلقه را مجدداً از ابتدا اجرا میکند. در سیستمعاملهای قدیمی که از چندوظیفهای تعاونی استفاده میکردند، حلقههای بیپایان معمولاً باعث میشدند تا کل سیستمعامل غیرپاسخگو شود. در مدلهای چند وظیفهای فعلی که به شکل غیر انحصاری است، حلقههای بینهایت باعث میشوند تا برنامه کل زمان در دسترس پردازنده را مصرف کند، اما معمولاً کاربر میتواند آنها را از بین ببرد و به آنها خاتمه دهد. همچنین حلقههای انتظار مشغول هم گاهی اوقات حلقه بینهایت نامیده میشوند. یکی از دلایلی که میتواند باعث هنگ کردن سیستم شود همین حلقههای بینهایت هستند. از دیگر دلایل هنگ کردن سیستم میتوان به بنبست یا نقض دسترسی اشاره کرد.
نحوه شکل گیری حلقه های بی نهایت
یک حلقه بدون پایان میتواند در اثر عوامل مختلفی نظیر وجود شرطی که هرگز حلقه را به پایان نمیرساند و یا وجود دستوراتی که مانع از به پایان رسیدن حلقه میشوند شکل بگیرد. در واقع حلقه های بی نهایت الزاما نوعی حلقه مجزا با یک کلمه کلیدی از پیش رزرو شده متمایز در زبانهای برنامه نویسی نیست؛ بلکه هر حلقه یا ساختار جریان کنترلی که منجربه تکرار دستورات به تعداد نامتناهی شود یک حلقه بی نهایت را تشکیل میدهد. این ساختار میتواند شامل هرچیزی اعم از یک حلقه معمولی و یا استفاده از دستور GOTO برای ایجاد یک حلقه بیپایان باشد.
حلقه های بی نهایت ممکن است به صورت عمدی یا غیرعمدی (ناخواسته) به وجود بیایند. به عنوان مثالی از کاربرد عمدی این نوع حلقه ها میتوان به استفاده از آنها در سیستمهای تعاملی به منظور بررسی مدوام ورودی ها (مانند کلیدهای فشرده شده توسط کاربر) اشاره نمود. در طرف مقابل ممکن است به دلیل اشتباه برنامه نویس، حلقه های بی پایان غیرعمدی در برنامه شکل بگیرند که این اتفاق معمولا در مورد برنامه نویسان تازه کار و کم تجربه رخ میدهد.
حلقهزنی عمدی یا غیرعمدی
حلقهزنی به تکرار کردن مجموعهای از دستورالعملها تا زمان برقراری یک شرط خاص گفته میشود. حلقه بیپایان وقتی اتفاق میافتد که شرط حلقه همیشه برقرار باشد. البته این مورد بستگی به نوع حلقه دارد.
حلقهزنی عمدی
موارد کمی وجود دارد که عمداً میخواهیم یک حلقه بینهایت داشته باشیم. برای مثال، بازیهای مبتنی بر کارتریج در کنسولهای بازی، معمولاً هیچ شرط خاصی برای پایان دادن به حلقه اصلی خود ندارند، چرا که هیچ سیستمعاملی در آنجا وجود ندارد تا برنامه از آن خارج شود. حلقه به اجرای خود ادامه میدهد تا وقتی که دستگاه خاموش شود.
حلقهزنی ناخواسته
این اصطلاح بیشتر در مواقعی استفاده میشود که هدفمان چنین چیزی نباشد و حلقه بینهایت بر اثر یک حفره و به صورت ناخواسته اتفاق بیفتد.
یک مثال ساده به زبان سی:
کد:
# include <stdio.h>
int main()
{
while(1) {
printf("Infinite Loop\n");
}
}
مثال بالا بدون توقف پیغام Infinite Loop را چاپ میکند. شرط پایان عدد ۱ است و بنابراین مقدار این شرط همیشه درست بوده و حلقه تا ابد اجرا میشود. مثال زیر یک حلقه بینهایت را به زبان بیسیک نشان میدهد:
کد:
DO
LOOP UNTIL 0
یک حلقه مشابه به زبان اسمبلی:
کد:
loop:
; Code to loop here
jmp loop
جالب است بدانید حلقه های بی نهایت ممکن است باعث هنگ کردن و فریز سیستم شوند. اما در صورتی که سیستم همچنان به واکنشهای کاربر پاسخگو باشد معمولا میتوان حلقه های بدون پایان ناخواسته را با روشی مثل استفاده از Task Manager و پایان دادن به فرایند مربوطه متوقف نمود. /ویکیپدیا، تکدیک