Бесконачна петља — разлика између измена

Садржај обрисан Садржај додат
Autobot (разговор | доприноси)
м Разне исправке; козметичке измене
Нема описа измене
Ред 1:
'''Бесконачна петља'''(или '''петља без граница''') је низ упутстава у [[Рачунарски програм|рачунарском програму]] који улазе у бесконачну петљу, било због [[петље]] која нема завршно стање, имате неког који се не може срести, или оног који изазива поновни почетак петље.У старијим [[Оперативни систем|оперативним системима]] са [[кооперативним мултитасковањем]], бесконачне петље обично утичу на цео систем да престане да реагује. Са садашњим преовлађујућим превентивним мултитаскинг моделом, бесконачне петље узрокују да програм троши све могуће време процесора, али обично се може зауставити од стране корисника. [[Busy wait]] петље се такође понекад зову и   "бесконачне петље". Један могући узрок  [["заустављања"]] рачунара је бесконачна петља ; остали укључују [["млаћење"]](енгл.[[Trashing(computer science)|thrashing]]), [["застој"]](енгл.[[Deadlock|deadlock]]), и [[Грешка сегментације|<nowiki/>]][[грешка сегментације]](енгл.[[Segmentation fault|access violations]]).
 
== Планирано против непланираног петљања ==
Ред 7:
Постоје неколико случаја када је то пожељно понашање. На пример, игрице засноване на конзолама обично немају услов излаза у главној петљи, јер не постоји оперативни систем из ког би се могло изаћи; петља ради све док се конзола не искључи.
 
Старински [[Бушена картица|читач картица]], јединица[[опрема за записивање опремајединица]], би се буквално зауставио када би обрада картице била завршена , пошто није било потребе да хардвер настави са радом  , све док се не учита нова гомила програмских картица.
 
Насупрот томе, модерни интерактивни рачунари захтевају да рачунар стално надгледа корисничке уносе или активност уређаја , тако да на неком основном нивоу постоји бесконачан процес петље која мора да настави све док се уређај не искључи или ресетује. У [[Apollo Guidance Рачунару]], на пример, ова спољна петља се налазила у Exec програму, и ако рачунар не би имао никаквог посла, петља би се стартовала како би радила лажни посао који би искључио  светлосни показивач"рачунарске активности" .
 
Модерни рачунари такође обично не заустављају процесор или цикличне сатове матичне плоче када се "сруше". Уместо тога, враћају се грешци која приказује поруке оператору, и улази у бесконачну петљу чекајући корисника да или одговори на упит како би наставио, или да ресетује уређај.
Ред 21:
 
== Прекид ==
Све док систем реагује, бесконачне петље често могу бити прекинуте слањем сигнала у процесу(као што је [[SIGINT]] у Unix), или [[прекид]] у процесору, што узрокује да тренутни процес буде прекинут. Ово се може урадити у [[менаџеру задатака]], у терминалу са командом [[Control-C]] , или користећи  [["kill"]] команду или [[позив система]]. Међутим, ово не ради увек, јер процес можда не реагује на сигнала или процесор може бити у непрекидном стању, као у [["Cyrix coma bug "]](проузрокован преклапањем непрекидним инструкцијама у [[инструкционом "цевоводу"]]). У неким случајевима остали сигнали као што је  [[SIGKILL]] може радити, пошто не захтевају процес да се оглашава, док у другим случајевима петља не може бити угашена гашењем система.
 
== Језичка подршка ==
Бесконачне петље се могу спровести користећи различите конструкције контроле протока. Најчешће, у неструктурном програмирању ово је скок назад ( [["goto "]]), док је у структурном програмирању  неодређена петља  (while петља) постављена да се никад не заврши, или изостављајући стање или експлицитно постављајући на тачно , као <code>while (true) .</code><code>..</code>.
 
Неки језици имају посебне конструкције за бесконачне петље, типично изостављајући стање из бесконачне петље. Примери укључују Ada (<code>loop ... end loop</code>),<ref>[[wikibooks:Ada Programming/Control#Endless Loop|Ada Programming: Control: Endless Loop]]</ref> Fortran (<code>DO .</code><code>.. </code><code>END DO</code>), Go (<code>for { ... }</code>), и Ruby (<code>loop do ... end</code>).
Ред 38:
Ово је петља која ће штампати "Бесконачна Петља" без заустављања .
 
Једноставан пример у [[Бејсик|BASICБејсик-у]] :<source lang="gwbasic">
10 PRINT "INFINITE LOOP"
20 GOTO 10
</source>Једноставан пример у [[Асемблер x86|X86Аемблер assembly languageх86]]:<source lang="asm">
loop:
; Code to loop here
jmp loop
</source>Остали примери у [[DOS (оперативни систем)|DOS]]<source lang="asm">
:A
goto :A
</source>Овде је петља сасвим очигледна, јер последња линија безусловно шаље извршење назад на прво.
 
Пример у [[Пајтон (програмски језик)|PythonПајтон-у]]<source lang="python">
while True:
print("Infinite Loop")
</source>Пример у [[Баш (интерпретер командне линије)|BashБаш-у]]<source lang="bash">
$ while true; do echo "Infinite Loop"; done
</source>Пример у [[Перл (програмски језик)|PerlПерл-у]]<source lang="perl">
print "Infinite Loop\n" while 1
</source>
Ред 62:
 
=== Математичке грешке ===
Овде је пример бесконачне петље у [[Вижуал бејсик|VisualВижуал Basicбејсик]]:<source lang="vb">
dim x as integer
do while x < 5
Ред 96:
</source>На неким системима, ова петља ће се извршити десет пута као што је и очекивано, али се на осталим системима неће извршити. Проблем је у томе што петља окончава услов <tt>(x != 1.1)</tt> теста за тачне једнакости две вредности, и начин по ком су вредности заступљене у многим рачунарима ће учинити да тест не успе, јер се не може представити тачна вредност 1.1.
 
Исто се може десити и у  [[Пајтон (програмски језик)|PythonПајтон-у]]:<source lang="python">
x = 0.1
while x != 1:
print x
x += 0.1
</source>Због вероватноће тестова за  једнакост или неједнакост који су неочекивано неисправни, сигурније је користити више-од или мање-од тестове када се ради о  "floating-point "вредностима. На пример, уместо да се тестира да ли је  <code>x</code> једнако 1.1, могло би се проверити да ли  је <tt>(x <= 1.0)</tt>, или <tt>(x < 1.1)</tt>, који би сигурно изашли накод одређеног броја понављањае. Још један начин да се поправи овај пример био би уз коришћење [[Цео број(рачунарска наука)|целог броја]] као [[индекс петље]], бројећи број понављања који су били извршени.
 
Сличан проблем се дешава често у [[Нумеричка анализа|нумеричкој анализи]]:  да би се израчунао одређени резултат, понављање је намењено да се изврши све док грешка не буде мања од изабране толеранције. Међутим, због грешака заокруживања током понављања, одређена толеранција не може бити никада достигнута, што резултује бесконачном петљом.
 
== Вишепартијска петља ==
Иако су бесконачне петље у једном програму обично лаке за предвидети, петља изазвана од стране више лица је много теже предвидети. Замислите сервер који увек одговара са грешком у виду поруке ако не разуме тражени захтев. Очигледно, не постоји могућност за бесконачном петљом на серверу, али ако су ту два сервера(A и Б), и A прими поруку о непознатом типу из Б, онда А одговара са грешком у виду поруке серверу Б, Б не разуме поруку у одговара серверу А са његовом поруком , А не разуме поруку од Б и шаље још једну грешку у виду поруке, и тако у бесконачност. Један чест пример ове ситуације је [[e-mail петља]].
 
== Квази-бесконачне петље ==
Ред 112:
 
=== Немогућ престанак услова ===
Пример [[For петља|for петље]] у [[C (програмски језик)|C]]:<source lang="c">
unsigned int i;
for (i = 1; i != 0; i++) {
/* loop code */
}
</source>ItЧини appearsсе thatда thisће willово goићи onу indefinitelyнедоглед, butали inуставари factће the value ofвредност <code>i</code> will eventually reachна theкрају maximumдостићи valueмаксималну storableскладишну inвредност anу <code>unsigned int</code> andи addingдодавање броја 1 toтом thatброју numberће willсе wrap-aroundзавршити toса 0, breakingокончавајући the loopпетљу. The actualСтварна limitграница of <code>i</code> dependsзависи onод theсистема details of the system andи [[Компилатор|compilerкомпилатора]] usedкоји се користи.Са Withпроизвољно arbitrary-precisionпрецизном arithmeticрачуницом, thisова loopпетља wouldће continueнаставити untilса theрадом све док computer's [[Рачунарска меморија|memoryрачунарска меморија]] couldне noможе longerвише containсадржати <code>i</code>. IfАко је <code>i</code> wasприпицан aцео signed integerброј, ratherвише thanнего anне unsignedприписан цео integerброј, overflowпреливање wouldнеће beбити undefinedдефинисано. InУ thisтом caseслучају, the loop couldпетља beможе optimizedбити intoоптимизована anу infiniteбесконачну loopпетљу.
 
=== Бесконачна рекурзија ===
Ред 124:
(let ([ω (lambda (f) (f f))])
(ω ω)))
</source>Ω је бесконачна рекурзија, стога нема ш[[нормалну форму]]. Када се користи [[структурна рекурзија]], бесконачне рекузије су обично изазване недостатком главног случаја или неисправним индуктивним кораком. Пример погрешне структурне рекурзије:<source lang="scheme">
(define (sum-from-1-to n)
(+ n (sum-from-1-to (sub1 n))))
</source>Функција ''sum-from-1-to'' ће остати [[без простора]], пошто рекурзија никада не престаје — бесконачна је. Како би се исправио проблем, додат је главни случај.<source lang="scheme">
(define (sum-from-1-to' n)
(cond
Ред 137:
 
=== Изјава прекид ===
 "<code>while (true)</code>" петља на први поглед изгледа као бесконачна, али можда постоји начин да се избегне петља кроз [[прекид изјаву]] или кроз [[изјаву повратка]].
На пример у [[PHP]]:<source lang="php">
while (true) {
Ред 147:
 
=== Алдерсонова петља ===
''Аледерсонова петља је ''је редак сленг или жаргоснки израз за бесконачну петљу где је доступан услов за излаз, али није доступна тренутна реализација кода, обично због грешке програмера. Оне су најчешће и највидљивије доком [[корисничког]] кода [[дебаговања ]] .
 
Као у C- псеудокоду пример Алдерсонове петље, где се од програма очекује да сумира бројеве дате од стране корисника док нула није дата, али где је програмер користио погрешног оператора:<source lang="C">
Ред 161:
}
}
</source>Термин је наводно добио име од програмера који је кодирао модалну поруку кутије у [[Мајкрософт аксес|MicrosoftМајкрософт Accessаксес]] без ОК или Cancel дугмета, чиме се онемогућава читав програм сваки пут када се кутија појави.<ref>[http://www.catb.org/~esr/jargon/html/A/Alderson-loop.html Alderson Loop] The Jargon File, Version 4.4.7.</ref>
 
== Такође видети ==
Ред 168:
* Divergence (computer science)
* Goto (command)
* [[Рекурзија|Рекурзија]]
* Recursion (computer science)
 
== Референце ==