Jít do - Goto

GoTo ( goto , GOTO , GO TO nebo jiné kombinace případů, v závislosti na programovacím jazyce) je prohlášení, které se nachází v mnoha počítačových programovacích jazycích . Provádí jednosměrný přenos řízení na jiný řádek kódu; naproti tomu volání funkce normálně vrací kontrolu. Přeskočená místa jsou obvykle identifikována pomocí štítků , ačkoli některé jazyky používají čísla řádků . Na strojového kódu úrovni je gotoo formu pobočky nebo skoku prohlášení , v některých případech v kombinaci s nastavením zásobníku. Mnoho jazyků toto gotoprohlášení podporuje a mnoho nikoli (viz § jazyková podpora ).

Strukturovaný program teorém prokázal, že gototvrzení není nutné psát programy, které mohou být vyjádřeny jako vývojové diagramy ; nějaká kombinace tří programovacích konstruktů sekvence, výběru/výběru a opakování/iterace je dostačující pro jakýkoli výpočet, který může provádět Turingův stroj , s tím, že může být nutné zavést duplikaci kódu a další proměnné.

V minulosti se na akademické půdě a v průmyslu vedla značná debata o výhodnosti používání gotoprohlášení. Použití goto bylo dříve běžné, ale od příchodu strukturovaného programování v 60. a 70. letech 20. století jeho používání výrazně upadlo. Primární kritika je, že kód, který používá příkazy goto, je těžší pochopit než alternativní konstrukce. V určitých běžných způsobech používání zůstává Goto v provozu , ale obecně se používají alternativy, jsou -li k dispozici. Debaty o jeho (omezenějším) využití pokračují v kruzích akademické obce a softwarového průmyslu.

Používání

goto label

Příkaz gotoje často kombinován s příkazem if za účelem podmíněného přenosu kontroly.

IF condition THEN goto label

Programovací jazyky ukládají různá omezení s ohledem na místo určení gotopříkazu. Například programovací jazyk C neumožňuje skok na popisek obsažený v jiné funkci, ale skoky v rámci jednoho řetězce volání jsou možné pomocí funkcí setjmp/longjmp .

Kritika

Na schůzce před ALGOL, která se konala v roce 1959, Heinz Zemanek výslovně vyvolal pochybnosti o nezbytnosti prohlášení GOTO; v té době jeho poznámce nikdo nevěnoval pozornost, včetně Edsgera W. Dijkstra , který se později stal ikonickým odpůrcem GOTO. V sedmdesátých a osmdesátých letech došlo k poklesu používání prohlášení GOTO ve prospěch paradigmatustrukturovaného programování “ , přičemž goto bylo kritizováno jako vedoucí k „neudržitelnému kódu špaget “ (viz níže). Některé standardy kódování stylů programování, například GNU Pascal Coding Standards, nedoporučují používání příkazů GOTO. Proof Böhm-Jacopini (1966) neměl spokojit otázku, zda přijmout strukturované programování pro vývoj softwaru, částečně proto, že stavba byla větší pravděpodobnost, že zatemnit program, než ji zvýšit, protože její aplikace vyžaduje zavedení dalších lokálních proměnných. To však vyvolalo mezi počítačovými vědci, pedagogy, jazykovými designéry a aplikačními programátory prominentní debatu, která viděla pomalý, ale stálý odklon od dříve všudypřítomného používání GOTO. Pravděpodobně nejslavnější kritikou GOTO je dopis Edsgera Dijkstra z roku 1968 s názvem „ Přejít na prohlášení považované za škodlivé “. V tomto dopise Dijkstra tvrdil, že neomezená prohlášení GOTO by měla být zrušena z jazyků vyšších úrovní, protože komplikují úkol analyzovat a ověřovat správnost programů (zejména těch, které zahrnují smyčky). Samotný dopis vyvolal diskusi, včetně dopisu „GOTO považováno za škodlivé“ považováno za škodlivé ”zaslaného Komunikaci ACM (CACM) v březnu 1987, jakož i další odpovědi ostatních lidí, včetně Dijkstraovy zprávy o poněkud neuspokojivé korespondenci .

Alternativní hledisko je uveden v Donald Knuth ‚s strukturované programování se jít do závěrky , která analyzuje řadu společných programátorské úlohy a zjistí, že v některých z nich GOTO je optimální jazykový pojem k použití. V programovacím jazyce C , Brian Kernighan a Dennis Ritchie varují, že gotoje „nekonečně zneužitelných“, ale také naznačují, že by mohly být použity pro end-of-function chyba obslužné rutiny a přestávek multi-level ze smyček. Tyto dva vzorce lze nalézt v mnoha dalších knihách o C jiných autorů; úvodní učebnice z roku 2007 uvádí, že vzor zpracování chyb je způsob, jak obejít „nedostatek integrovaného zpracování výjimek v jazyce C“. Jiní programátoři, včetně návrháře a kodéra linuxového jádra Linuse Torvaldse nebo softwarového inženýra a autora knihy Steva McConnella , také nesouhlasí s názorem Dijkstry a uvádí, že GOTO mohou být užitečnou jazykovou funkcí, která zvyšuje rychlost programu, velikost a srozumitelnost kódu, ale pouze v případě použit rozumným způsobem srovnatelně rozumným programátorem. Podle profesora informatiky Johna Regehra bylo v roce 2013 v kódu jádra Linuxu asi 100 000 případů goto.

Jiní akademici zaujali extrémnější hledisko a tvrdili, že i instrukce jako breaka returnze středu smyček jsou špatnou praxí, protože ve výsledku Böhm – Jacopini nejsou potřeba, a proto zastávali názor, že smyčky by měly mít jediný výstupní bod. Například Bertrand Meyer napsal ve své učebnici 2009, že instrukce líbí breaka continue„jsou jen staří gotov rouše beránčím“. Mírně upravená forma výsledku Böhm – Jacopini však umožňuje vyhnout se dalším proměnným ve strukturovaném programování, pokud jsou povoleny víceúrovňové přestávky ze smyček. Protože některé jazyky jako C neumožňují víceúrovňové přestávky prostřednictvím svého breakklíčového slova, některé učebnice doporučují programátorovi použít gotoza takových okolností. Standard MISRA C 2004 zakazuje goto, continuestejně jako násobky returna breakprohlášení. Vydání normy MISRA C z roku 2012 snížilo zákaz gotoze stavu „povinné“ na „poradní“; vydání 2012 má další povinné pravidlo, které zakazuje pouze skoky vzad, ale nikoli vpřed goto.

FORTRAN představil strukturované programovací konstrukty v roce 1978 a v postupných revizích byla zpřísněna relativně volná sémantická pravidla upravující přípustné použití goto; „rozšířený rozsah“, ve kterém mohl programátor použít GOTO ke vstupu a opuštění stále se provádějící smyčky DO, byl z jazyka odstraněn v roce 1978 a do roku 1995 mělo několik forem Fortran GOTO, včetně Computed GOTO a Assigned GOTO, byly smazány. Některé široce používané moderní programovací jazyky, jako například Javu a Python chybí příkaz GOTO - viz jazykovou podporu - i když většina poskytnout nějaké prostředky vypadla z výběru, nebo buď lámání ven, nebo pohybující se k dalšímu kroku iterace. Názor, že rušení toku řízení v kódu je nežádoucí, lze spatřit v návrhu některých programovacích jazyků, například Ada vizuálně zdůrazňuje definice štítků pomocí hranatých závorek .

Záznam 17.10 v seznamu často kladených dotazů na comp.lang.c řeší problém použití GOTO přímo s uvedením

Programovací styl, podobně jako styl psaní, je poněkud uměním a nelze ho kodifikovat nepružnými pravidly, ačkoli se diskuse o stylu často soustředí výhradně na taková pravidla. V případě příkazu goto je již dlouho pozorováno, že neomezené používání goto rychle vede k neudržitelnému kódu špaget. Jednoduchý, nepřemýšlející zákaz příkazu goto nemusí nutně okamžitě vést ke krásnému programování: nestrukturovaný programátor je stejně schopný postavit byzantskou změť bez použití jakéhokoli goto (místo toho možná nahrazuje podivně vnořené smyčky a logické řídicí proměnné) . Mnoho programátorů zaujímá umírněný postoj: přechodům je obvykle třeba se vyhnout, ale jsou přijatelné v několika dobře omezených situacích, pokud je to nutné: jako víceúrovňové příkazy k přerušení, sloučení běžných akcí uvnitř příkazu přepínače nebo centralizace úkolů čištění v funkce s několika chybovými návraty. (...) Slepé vyhýbání se určitým konstruktům nebo dodržování pravidel bez jejich porozumění může vést ke stejným problémům, jaké měla pravidla odvrátit. Navíc mnoho názorů na styl programování je právě to: názory. Mohou být silně argumentovaní a silně pociťovaní, mohou být podpořeni solidními zdánlivými důkazy a argumenty, ale protichůdné názory mohou být stejně silně cítit, podporovány a argumentovány. Je obvykle marné nechat se zatáhnout do „slohových válek“, protože v určitých otázkách se zdá, že soupeři nikdy nesouhlasí nebo nesouhlasí, nebo se přestanou hádat.

Běžné vzorce používání

Přestože celkové používání gotos klesá, v některých jazycích stále existují situace, kdy goto poskytuje nejkratší a nejpřímější způsob vyjádření logiky programu (i když je možné vyjádřit stejnou logiku bez gotos, ekvivalentní kód bude delší a často obtížněji pochopitelné). V jiných jazycích existují strukturované alternativy, zejména výjimky a ocasní volání.

Situace, ve kterých je často užitečné se dostat, zahrnují:

  • Aby byl kód čitelnější a snáze se řídil
  • Chcete -li vytvářet menší programy a zbavit se duplikace kódu
  • Implementujte stroj s konečným stavem pomocí tabulky přechodu stavu a goto k přepínání mezi stavy (při absenci eliminace ocasního volání ), zejména v automaticky generovaném kódu C. Například přejděte na kanonický analyzátor LR .
  • Implementace víceúrovňové přestávky a pokračování, pokud není přímo podporována v daném jazyce; toto je běžný idiom v jazyce C. Ačkoli si Java vyhrazuje klíčové slovo goto, ve skutečnosti ho neimplementuje. Místo toho Java implementuje označené příkazy break a označené continue. Podle dokumentace k Javě bylo použití gotos pro víceúrovňové přestávky nejběžnějším (90%) použitím gotos v jazyce C. Java nebyla prvním jazykem, který tento přístup přijal-zakazovat goto, ale poskytovat víceúrovňové přestávky- BLISS programovací jazyk (přesněji verze BLISS-11 fragmentu) předcházelo v tomto ohledu.
  • Náhrady za jednoúrovňové příkazy přerušení nebo pokračování (opakování), pokud by potenciální zavedení dalších smyček mohlo nesprávně ovlivnit řídicí tok. Tato praxe byla pozorována v kódu Netbsd .
  • Zpracování chyb (bez výjimek), zejména vyčištění kódu, jako je zrušení přidělování prostředků. C ++ nabízí alternativu k příkazu goto pro tento případ použití, kterým je: Získávání prostředků je inicializace (RAII) pomocí destruktorů nebo pomocí výjimek typu try and catch používaných při zpracování výjimek . setjmp a longjmp jsou další alternativou a mají tu výhodu, že mohou uvolnit část zásobníku volání .
  • vyskočení zásobníku, např. Algol, PL/I.

Tato použití jsou relativně běžná v jazyce C, ale mnohem méně běžná v jazyce C ++ nebo jiných jazycích s funkcemi vyšší úrovně. Vyhození a zachycení výjimky uvnitř funkce však může být v některých jazycích mimořádně neefektivní; ukázkovým příkladem je Objective-C , kde goto je mnohem rychlejší alternativou.

Dalším použitím příkazů goto je úprava špatně zpracovaného staršího kódu , kde by zamezení přechodu vyžadovalo rozsáhlé refaktorování nebo duplikaci kódu . Například vzhledem k velké funkci, kde je zajímavý pouze určitý kód, příkaz goto umožňuje přeskočit na nebo z příslušného kódu, aniž by tuto funkci jinak upravoval. Toto použití je považováno za zápach kódu , ale najde příležitostné použití.

Alternativy

Strukturované programování

Moderní pojem podprogramu vynalezl David Wheeler při programování EDSAC . K implementaci volání a návratu na stroji bez instrukce volání podprogramu použil speciální vzor kódu, který se sám upravoval, známý jako Wheelerův skok . Výsledkem byla schopnost strukturovat programy pomocí dobře vnořených spouštění rutin čerpaných z knihovny. To by nebylo možné použít pouze goto, protože cílový kód čerpaný z knihovny by nevěděl, kam skočit zpět.

Později byly jazyky vysoké úrovně, jako je Pascal, navrženy kolem podpory strukturovaného programování , které se generalizovalo z podprogramů (známých také jako procedury nebo funkce) směrem k dalším řídicím strukturám, jako jsou:

Tyto nové jazykové mechanismy nahradily ekvivalentní toky, které by dříve byly napsány pomocí gotos a ifs. Vícecestné větvení nahrazuje „vypočítané goto“, ve kterém je instrukce, na kterou se má skočit, určena dynamicky (podmíněně).

Výjimky

V praxi přísné dodržování základní šablony se třemi strukturami strukturovaného programování přináší vysoce vnořený kód, kvůli neschopnosti předčasně opustit strukturovanou jednotku a kombinatorické explozi s poměrně složitými daty stavu programu, které zvládnou všechny možné podmínky.

Obecně byla přijata dvě řešení: způsob předčasného opuštění strukturované jednotky a obecněji výjimky - v obou případech jde o zvýšení struktury, vrácení kontroly do uzavření bloků nebo funkcí, ale nepřeskočení do libovolných umístění kódu. Ty jsou analogické k použití příkazu return v nekoncové poloze-ne striktně strukturované, kvůli předčasnému ukončení, ale mírné uvolnění striktur strukturovaného programování. V C, breaka continueumožnit jednomu ukončit smyčku nebo pokračovat do další iterace , bez nutnosti extra whilenebo ifpříkazu. V některých jazycích jsou možné i víceúrovňové přestávky. Pro manipulaci výjimečné situace, specializující se na zpracování výjimek byly přidány konstrukty, jako je try/ catch/ finallyv Javě.

Mechanismy zpracování výjimek házení úlovku lze také snadno zneužít k vytvoření netransparentních řídicích struktur, stejně jako lze zneužít goto.

Ocasní hovory

V příspěvku doručeném na konferenci ACM v Seattlu v roce 1977 shrnul Guy L. Steele debatu o GOTO a strukturovaném programování a poznamenal, že volání procedur v zadní části procedury lze nejoptimálněji považovat za přímý přenos kontroly na volanou proceduru, obvykle eliminující zbytečné operace manipulace se zásobníkem. Vzhledem k tomu, že taková „ocasní volání“ jsou v Lispu , jazyce, kde jsou volání procedur všudypřítomná, velmi běžná , tato forma optimalizace výrazně snižuje náklady na volání procedur ve srovnání s GOTO používaným v jiných jazycích. Steele tvrdil, že špatně implementované volání procedur vedlo k umělému vnímání, že GOTO je ve srovnání s voláním procedury levné. Steele dále tvrdil, že „obecně lze volání procedur užitečně považovat za příkazy GOTO, které také předávají parametry a mohou být jednotně kódovány jako instrukce JUMP strojového kódu “, přičemž instrukce pro manipulaci se zásobníkem strojového kódu „jsou považovány za optimalizaci (spíše než naopak !) ". Steele citoval důkazy, že dobře optimalizované numerické algoritmy v Lispu by mohly běžet rychleji než kód produkovaný tehdy dostupnými komerčními kompilátory Fortran, protože náklady na volání procedur v Lispu byly mnohem nižší. Ve Scheme , dialektu Lisp, který vyvinul Steele s Geraldem Jayem Sussmanem , je optimalizace ocasu povinná.

Ačkoli Steeleův článek příliš nepředstavil nic nového pro informatiku, přinejmenším tak, jak se to praktikovalo na MIT, přinesl na světlo prostor pro optimalizaci volání procedur, díky níž se vlastnosti postupů podporujících modularitu staly důvěryhodnější alternativou tehdy běžné kódovací návyky velkých monolitických postupů se složitými strukturami vnitřní kontroly a rozsáhlými stavovými daty. Zejména optimalizace ocasních hovorů, o nichž hovořil Steele, změnily postup na věrohodný způsob implementace iterace prostřednictvím rekurze s jedním ocasem (rekurze ocasu volá stejnou funkci). Optimalizace ocasního volání dále umožňuje vzájemnou rekurzi neomezené hloubky za předpokladu, že ocasní volání - to umožňuje přenos kontroly, jako u strojů s konečným stavem , což se jinak obecně provádí příkazy goto.

Coroutines

Coroutines jsou radikálnějším uvolněním strukturovaného programování, které umožňuje nejen více výstupních bodů (jako u návratů v poloze bez ocasu), ale také více vstupních bodů, podobných příkazům goto. Coroutines jsou více omezené než goto, protože mohou pokračovat pouze v aktuálně běžícím coroutinu v určených bodech - pokračovat po výtěžku - spíše než skočit do libovolného bodu v kódu. Omezenou formou korutin jsou generátory , které jsou pro některé účely dostačující. Ještě omezenější jsou uzávěry - podprogramy, které udržují stav (prostřednictvím statických proměnných ), ale nikoli polohu provádění. Kombinace stavových proměnných a strukturovaného řízení, zejména celkového příkazu přepínače, může umožnit podprogramu obnovit provádění v libovolném bodě při následných voláních a je strukturovanou alternativou k příkazům goto při absenci korutin; toto je běžný idiom například v jazyce C.

Pokračování

Pokračování je podobný GOTO v tom, že přenáší ovládací z libovolného bodu v programu na předtím označeného bodu. Pokračování je v jazycích, které jej podporují, flexibilnější než GOTO, protože může přenášet řízení mimo aktuální funkci, což GOTO ve většině strukturovaných programovacích jazycích neumí. V těch jazykových implementacích, které udržují rámce zásobníku pro ukládání lokálních proměnných a argumentů funkcí, provedení pokračování zahrnuje kromě skoku také úpravu zásobníku volání programu . Longjmp funkce C programovací jazyk je příklad únikové pokračování, které mohou být použity, aby se vyhnuli aktuální kontext obklopující jeden. Common Lisp operátor GO má také tento zásobník odvíjení vlastnost, a to navzdory konstruktu je lexically rozsahem , neboť radioaktivita se zvýšil na lze odkazovat z uzávěru .

Ve Scheme může pokračování v případě potřeby dokonce přesunout ovládání z vnějšího kontextu do vnitřního. Tato téměř neomezená kontrola nad tím, jaký kód se spouští dále, umožňuje poměrně snadné psaní složitých struktur řízení, jako jsou korutiny a kooperativní multitasking.

Předávání zpráv

V neprocesních paradigmatech je goto méně relevantní nebo zcela chybí. Jednou z hlavních alternativ je předávání zpráv , což je zvláště důležité při souběžném výpočtu , meziprocesové komunikaci a objektově orientovaném programování . V těchto případech nemají jednotlivé komponenty libovolný přenos kontroly, ale celková kontrola může být naplánována složitými způsoby, například prostřednictvím předkupování . Vlivné jazyky Simula a Smalltalk byly mezi prvními, které zavedly koncepty zpráv a předmětů. Tím, zapouzdření data stavu, objektově orientovaného programování redukuje software složitost interakcí (zprávy) mezi objekty.

Variace

Ve třídě příkazů goto existuje řada různých jazykových konstrukcí .

Vypočítáno GOTO aPřidělené GOTO

V Fortran , je vypočítánGOTO skoky na jeden z několika štítků v seznamu, založený na hodnotě výrazu. Příkladem je goto (20,30,40) i. Ekvivalentní konstrukt v C je příkaz switch a v novějším Fortranu je CASEpříkaz doporučenou syntaktickou alternativou. BASICON ... GOTOkonstrukci, která dosahuje stejného cíle.

Ve verzích před Fortran 95 měl Fortran také přiřazenou variantu goto, která přenáší řízení na popisek (číslo řádku), který je uložen v (přiřazeno) celočíselné proměnné. Přeskočit na celočíselnou proměnnou, ke které nebylo PŘIŘAZENO, bylo bohužel možné a bylo hlavním zdrojem chyb zahrnujících přiřazené fotografie. Příkaz Fortran assignumožňuje celočíselné proměnné přiřadit pouze konstantní (existující) číslo řádku. Bylo však možné s touto proměnnou náhodně zacházet jako s celým číslem poté, například ji zvýšit, což mělo za následek nespecifikované chování v gotočase. Následující kód ukazuje chování, goto ikdyž řádek i není zadán:

    assign 200 to i
    i = i+1
    goto i ! unspecified behavior
200 write(*,*) "this is valid line number"

Několik kompilátorů C implementuje dvě nestandardní rozšíření C/C ++ týkající se gotos původně zavedených gcc . Rozšíření GNU umožňuje získat adresu štítku uvnitř aktuální funkce jako void*pomocí unárního operátoru hodnoty štítku s předponou &&. Instrukce goto je také rozšířena, aby umožnila přeskočení na libovolný void*výraz. Toto rozšíření C je v dokumentaci kompilátorů C, které jej podporují, označováno jako vypočítaný goto ; jeho sémantika je nadmnožinou Fortranova přiřazeného gota, protože umožňuje libovolné výrazy ukazatele jako cíl goto, zatímco Fortranův přiřazený goto nepovoluje libovolné výrazy jako cíl skoku. Stejně jako u standardního goto v C, rozšíření GNU C umožňuje cíli vypočítaného goto pobývat pouze v aktuální funkci. Pokus o skok mimo aktuální funkci má za následek nespecifikované chování.

Některé varianty BASIC také podporují vypočítaný GOTO ve smyslu používaném v GNU C, tj. Ve kterém může být cílem libovolné číslo řádku, nejen jedno ze seznamu. Například v MTS BASIC lze zapisovat tak, GOTO i*1000aby přeskočil na řádek očíslovaný 1000krát hodnotou proměnné i (což může představovat například vybranou možnost nabídky).

Proměnné označení PL/I dosahují účinku vypočítaných nebo přiřazených GOTOs.

ZMĚNIT

Až do roku 1985 měl standard ANSI COBOL sloveso ALTER, které bylo možné použít ke změně cíle stávajícího GO TO, které muselo být samo v odstavci. Funkce, která umožňovala polymorfismus , byla často odsuzována a zřídka používána.

Perl GOTO

V Perlu existuje varianta gototvrzení, která vůbec není tradičním příkazem GOTO. Trvá název funkce a přenáší řízení účinným nahrazováním jednoho volání funkce jiným ( volání ocasu ): nová funkce se nevrátí do GOTO, ale místo, odkud byla volána původní funkce.

Emulované GOTO

Existuje několik programovacích jazyků, které ve výchozím nastavení GOTO nepodporují. Pomocí emulace GOTO je stále možné používat GOTO v těchto programovacích jazycích, i když s určitými omezeními. Jeden může emulovat GOTO v Javě, JavaScriptu a Pythonu.

PL/I označují proměnné

PL/I má datový typ LABEL , který lze použít k implementaci „přiřazeného goto“ i „vypočítaného goto“. PL/I umožňuje větve mimo aktuální blok. Volající procedura může předat popisek jako argument volané proceduře, která pak může skončit s větví. Hodnota proměnné štítku obsahuje adresu rámce zásobníku a goto out of block vyskočí zásobník.

 /* This implements the equivalent of */
 /* the assigned goto                 */
   declare where label;
   where = somewhere;
   goto where;
   ...
 somewhere: /* statement */ ;
   ...
 /* This implements the equivalent of */
 /* the computed goto                 */
   declare where (5) label;
   declare inx fixed;
   where(1) = abc;
   where(2) = xyz;
   ...
   goto where(inx);
   ...
 abc: /* statement */ ;
   ...
 xyz: /* statement */ ;
   ...

Jednodušší způsob, jak získat ekvivalentní výsledek, je použít pole konstant štítků, které ani nepotřebuje explicitní deklaraci proměnné typu LABEL :

 /* This implements the equivalent of */
 /* the computed goto                 */
   declare inx fixed;
   ...
   goto where(inx);
   ...
 where(1): /* statement */ ;
   ...
 where(2): /* statement */ ;
   ...

MS/DOS GOTO

Přejít na popravu směruje na štítek, který začíná dvojtečkou. Cílem Goto může být proměnná.

@echo off
SET D8str=%date%
SET D8dow=%D8str:~0,3%

FOR %%D in (Mon Wed Fri) do if "%%D" == "%D8dow%" goto SHOP%%D
echo Today, %D8dow%, is not a shopping day.
goto end

:SHOPMon
echo buy pizza for lunch - Monday is Pizza day.
goto end

:SHOPWed
echo buy Calzone to take home - today is Wednesday.
goto end

:SHOPFri
echo buy Seltzer in case somebody wants a zero calorie drink.
:end

Jazyková podpora

Mnoho jazyků toto gotoprohlášení podporuje a mnohé nikoli. V Javě , gotoje vyhrazené slovo , ale je nepoužitelný, i když se sestavují file.class generuje GOTOS a štítky. Python nemá podporu pro goto, i když existuje několik modulů vtipu, které jej poskytují. V Seed7 není žádný příkaz goto a vynechány jsou také skryté gotos jako příkazy break- a continue. V PHP neexistovala žádná nativní podpora gotoaž do verze 5.3 (k emulaci jeho funkcí byly k dispozici knihovny).

Programovací jazyk C #goto. Neumožňuje však přeskočit na štítek mimo aktuální rozsah, takže je výrazně méně výkonný a nebezpečnější než gotoklíčové slovo v jiných programovacích jazycích. Vytváří také popisky příkazů case a default , jejichž rozsahem je uzavírací příkaz switch ; goto case nebo goto default se často používá jako explicitní náhrada implicitního propadu, což C# zakazuje.

Programovací jazyk PL/I má příkaz GOTO, který uvolňuje zásobník pro přenos mimo blok a nepovoluje přenos do bloku zvenčí.

Jiné jazyky mohou mít svá vlastní samostatná klíčová slova pro explicitní propady, které lze považovat za verzi gotoomezenou na tento konkrétní účel. Například Go používá fallthroughklíčové slovo a vůbec nepovoluje implicitní propad, zatímco Perl 5 nextve výchozím nastavení používá pro explicitní propad, ale také umožňuje nastavit implicitní propad jako výchozí chování pro modul.

Většina jazyků, které mají příkazy goto, tomu tak říká, ale v počátcích práce na počítači se používala jiná jména. Například v MAD byl použit příkaz TRANSFER TO. APL používá pro přechod pravou šipku .

C má goto a běžně se používá v různých idiomech, jak je uvedeno výše.

K dispozici je gotofunkce v Perlu stejně. (viz výše)

Funkční programovací jazyky, jako je Scheme, obecně nemají goto, místo toho používají pokračování.

Viz také

Reference