Instrukcja skoku: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
m MalarzBOT: {{Seealso}} jest redirectem {{Zobacz też}}
poprawa przek., dodanie parametru do szablonu {{Dopracować}}, kategoryzacja problemów występujących w artykułach
Linia 1:
{{dopracować|uzupełnić|w artykule opisano skok ''bezwarunkowy'', napisać coś więcej o skoku ''warunkowym'' (odsyłając do [[instrukcja warunkowa|instrukcji warunkowej]])}}
{{spis treści}}
'''Instrukcja skoku''' – [[instrukcja (informatyka)|instrukcja]] w [[język programowania|językach programowania]], która powoduje [[przepływ sterowania|przekazanie sterowania]] w inne miejsce, tzw. ''skok''. Występuje w tak odległych od siebie językach, jak [[Fortran]], [[Algol (język programowania)ALGOL|Algol]], [[COBOL]], [[Snobol|SNOBOL]], [[BASIC|Basic]], [[C (język programowania)|C]]/[[C++]], [[Perl]], [[Pascal (język programowania)|Pascal]], [[PHP]]<ref>Od wersji 5.3 [http://php.net/manual/en/control-structures.goto.php PHP: goto - Manual]</ref> i wielu innych. Miejsce skoku identyfikuje się za pomocą numeru wiersza programu (zwykle w [[język interpretowany|językach interpretowanych]]) bądź [[etykieta (informatyka)|etykiety]] (najczęściej w [[język kompilowany|językach kompilowanych]]).
 
== Przykład ==
Linia 21:
== Przepływ sterowania ==
{{Osobny artykuł|przepływ sterowania}}
Do zaprogramowania każdego diagramu przepływu czy każdego [[Deterministyczny automat o skończonej liczbie stanówskończony|automatu o skończonej liczbie stanów]] bez duplikacji kodu, a więc do sterowania przepływem kontroli w kodzie, którego żadna część się nie powtarza, wystarczą instrukcje skoku warunkowego (poprzedzone instrukcją porównania) i bezwarunkowego.
 
Obserwacja ta znalazła zastosowanie w konstrukcji [[procesor]]ów i wyrażenia tego w języku [[asembler]]a, gdzie dostępne są te właśnie instrukcje (instrukcje skoku bezwarunkowego <code>JMP</code> i warunkowego <code>Jxx</code> w architekturze [[x86]], gdzie <code>xx</code> symbolizują stan [[flaga (informatyka)|flag]] [[rejestr stanu|rejestru stanu]] zmienianego przez część instrukcji procesora).
 
Pierwsze języki, przede wszystkim ze względu na nacisk na łatwość konstrukcji [[kompilator]]ów nie odbiegały znacząco zasobem instrukcji od asemblera, np. w pierwszych wersjach [[Fortran|Fortranu]]u jedyną instrukcją warunkową był właśnie skok – nie można było warunkowo przypisać wartości czy wykonać grupy poleceń. Z czasem do popularnych języków (wyrosłych na podstawie Fortranu) zaczęto dodawać inne instrukcje kontroli przepływu: wykonania warunkowego (<code>if (''warunek'') { ''polecenie1'' } else { ''polecenie2'' }</code>, różne rodzaje [[pętla (informatyka)|pętli]] (<code>while</code>, <code>for</code>), rekurencyjność, instrukcje ponowienia (<code>redo</code>), [[instrukcja kontynuacji|następnej iteracji]] (<code>next</code> lub <code>continue</code>) lub [[instrukcja opuszczenia|zakończenia wykonywania]] (<code>last</code> lub <code>break</code>) pętli,
te same instrukcje z wielopoziomowymi pętlami (<code>X: foreach $a(@A) { foreach $b(@B) { …; if (…) { last X; }} }</code>), [[wyjątek|wyjątki]], [[iterator]]y, [[funkcja wyższego rzędu|funkcje wyższego rzędu]], [[wątek (informatyka)|wątki]] itd., co uczyniło z instrukcji skoku instrukcję na wskroś przestarzałą.
 
== Paradygmaty programowania ==
{{Zobacz też|paradygmat programowania}}
Instrukcja skoku jest instrukcją [[programowanie imperatywne|paradygmatu imperatywnego]] stosowanego przede wszystkim do nauki [[programowanieProgramowanie komputerów|programowania]] (np. języki [[BASIC]], [[LOGO]]) oraz w programowaniu niskopoziomowym (np. języki [[asembler|asemblera]]a i [[C]]), które jest wysoce zgodne z rzeczywistymi poleceniami procesora. Choć [[programowanie proceduralne|paradygmat proceduralny]] zachęca do odchodzenia od instrukcji skoku na rzecz [[podprogram|procedur (funkcji)]], to jednak całkowite wyeliminowanie skoków może być nieopłacalne. Pierwszym paradygmatem, którego celem było ograniczenie stosowania instrukcji skoku (poprzez zastąpienie sterowaniem przepływu kodu [[instrukcja warunkowa|instrukcji porównania]] i skoku poprzez [[instrukcja warunkowa|instrukcje warunkowe]] i [[instrukcja wyboru]]), był [[programowanie strukturalne|paradygmat strukturalny]].
 
Istnieją paradygmaty, jak np. [[programowanie obiektowe|obiektowy]], [[programowanie funkcyjne|funkcyjny]], czy [[programowanie sterowane zdarzeniami|zdarzeniowy]], w których instrukcja ta nie występuje, choć mimo wszystko wiele języków realizujących kilka paradygmatów (przede wszystkim opartych na [[C (język programowania)|C]]) ją zawiera. Nie zaleca się mieszania paradygmatów ze względu na możliwość zaciemnienia struktury kodu – często przytaczanym przykładem jest właśnie użycie imperatywnej instrukcji skoku w kodzie obiektowym (zwłaszcza, gdy skok odbywa się między dwoma nie związanymi ze sobą blokami kodu, np. z ciała jednej [[Klasa (programowanie obiektowe)|klasy]] do drugiej). Umiejętnie zastosowana instrukcja skoku może jednak znacząco ułatwić opuszczenie imperatywnej bądź proceduralnej części obiektowego kodu (np. wielokrotnie zagnieżdżone instrukcje warunkowe lub wyboru; należy zauważyć, że często stosowane instrukcje [[instrukcja kontynuacji|kontynuacji]], [[instrukcja opuszczenia|opuszczenia]], czy [[instrukcja powrotu|powrotu]] to w istocie inne formy instrukcji skoku, za jej dość rozwiniętą wersję można uważać [[instrukcja wywołania|instrukcję wywołania]]).
 
== Zobacz też ==