Goto je príkaz v mnohých programovacích jazykoch, ktorý umožňuje presun toku vykonávania programu na iné miesto v kóde. Názov vznikol kombináciou anglických slov go a to. V praxi ide o priamy skok (jump) na označený riadok alebo štítok v rámci programu.
Definícia a pozadie
Príkaz goto vykoná skok na vopred definovaný štítok (label), ktorý je súčasťou zdrojového kódu. V niektorých jazykoch je tento mechanizmus priamo podporovaný; iné jazyky ho buď nepodporujú, alebo majú jeho použitie obmedzené. Napríklad v jazyku Java je príkaz goto rezervovaný, ale programátor ho nemôže použiť. (Rezervované slovo je slovo, ktoré je súčasťou programovacieho jazyka a nemôže sa používať na iné veci, napríklad na pomenovanie premenných.)
Syntax a jednoduché príklady
Konkrétna syntax závisí od jazyka. Typický tvar v jazykoch ako C vyzerá takto:
if (chyba) goto error; ... error: // čistiace operácie alebo návrat s chybou V jazykoch, ktoré goto nepodporujú (napr. Python), sa na dosiahnutie podobných efektov používajú iné konštrukcie — funkcie, výnimky alebo explicitné riadiace štruktúry.
Praktické použitie
Aj keď sa používanie goto často kritizuje, v niektorých situáciách môže byť užitočné:
- Úsporné riešenie pri uvoľňovaní zdrojov a ošetrení chýb — v C je bežné použiť goto k preskoku na centrálny blok čistenia (error handling) z rôznych miest funkcie.
- Implementácia nízkoúrovňových algoritmov alebo stavových automatov, kde je explicitný skok prirodzený (napríklad pri generovaní assembleru alebo v interpretoch).
- Optimalizácia pri špecifických časovo kritických úsekoch tam, kde strukturované alternatívy zbytočne komplikujú kód.
Kritika a obmedzenia
Hlavné argumenty proti používaniu goto sú:
- Čitateľnosť: Voľné skoky môžu spôsobiť, že tok programu je ťažko sledovateľný — vzniká takzvaný "spaghetti code".
- Údržba: Kód s mnohými skokmi sa ťažšie modifikuje a testuje; zmeny môžu mať neočakávané vedľajšie účinky.
- Bezpečnosť: Nesprávne použité skoky môžu obchádzať konštrukcie zodpovedné za uvoľňovanie zdrojov (napr. inicializácie alebo deštruktory), ak jazyk alebo konvencia nevynúti bezpečné správanie.
V informatike existuje teória nazývaná veta o štruktúrovanom programe, ktorá dokazuje, že každý program možno napísať pomocou obmedzeného súboru štruktúr (sekvencia, výber, cyklus) bez potreby príkazu goto. Táto teória sa často používa ako argument v prospech štruktúrovaného programovania a proti nadmernému používaniu skokov.
Alternatívy k príkazu goto
- Rozdelenie kódu do menších funkcií a metód — zvyšuje čitateľnosť a opätovnú použiteľnosť.
- Výnimky a mechanizmy na ich spracovanie — slúžia na prerušovanie bežného toku pri chybách a sú bezpečnejšie z hľadiska uvoľňovania zdrojov.
- Štruktúrované riadiace konštrukcie (break, continue, return) a explicitné stavové stroje, ktoré často dokážu nahradiť potrebu skokov.
- V niektorých jazykoch existujú bezpečnejšie varianty alebo migrované konštrukcie (napr. labeled break v jazykoch ako Java — hoci Java priamo goto neumožňuje).
Dobre známe prístupy k používaniu
- Používajte goto len v odôvodnených prípadoch (napr. centralizované čistenie v C), nie ako bežný spôsob riadenia toku.
- Ak použijete skoky, označte štítky jasnými menami a pridajte komentáre, aby bol účel zrejmý.
- Preferujte modularitu — rozdelenie komplexnej funkcie na menšie časti často odstraňuje potrebu skokov.
Zhrnutie
Príkaz goto je jednoduchý a mocný nástroj, ktorý umožňuje priame skoky v programe. Napriek tomu jeho používanie prináša riziká pre čitateľnosť a udržiavateľnosť kódu, preto ho väčšina programátorov a štýlových smerníc odporúča používať striedmo a uvážlivo. V mnohých jazykoch sú k dispozícii alternatívy, ktoré zabezpečia jasnejší a bezpečnejší tok programu, pričom teória štruktúrovaného programovania dokazuje, že goto nie je nevyhnutný pre vyjadrenie všetkých programových logík.