GOTO

In informatica,  GO TO o GOTO () è un'istruzione di controllo di flusso di esecuzione. Essa è prevista in vari linguaggi di programmazione e consente di effettuare salti incondizionati da un punto all'altro del codice. In passato veniva spesso impiegata, tuttavia il suo utilizzo risultava spesso improprio, rendendo illeggibile o di difficile comprensione un algoritmo o una procedura e dando vita a quelli che in gergo vengono chiamati spaghetti code.

Descrizione 

Questa istruzione è presente in Fortran, ALGOL, COBOL, SNOBOL, BASIC, Lisp, C, C++, Pascal, Perl, PHP (dalla versione 5.3) e molti altri meno noti. In Assembly, ed in generale nei linguaggi a basso livello, è un'istruzione fondamentale per controllare il flusso delle istruzioni (ed adattarsi ai linguaggi di programmazione che non ne fanno volutamente uso).

Negli assembly essa corrisponde ad un'istruzione di salto e può essere chiamata con nomi diversi: BRA (da "branch"), JP, JMP o JUMP con tutte le loro varianti condizionali (zero, nonzero, carry, ecc.)

Era molto in voga nei linguaggi (ormai obsoleti) legati al numero di riga, come il BASIC. La sintassi era: 
GOTO numero di riga

Altri linguaggi senza numeri di riga, come il C o il PHP, utilizzano delle etichette che identificano l'indirizzo di codice a cui si vuole saltare.

Nei linguaggi ad alto livello può essere usata per uscire rapidamente da cicli profondamente nidificati.
Ai giorni nostri l'uso di questa istruzione in tali linguaggi è generalmente considerato indice di cattiva programmazione (il cosiddetto "spaghetti code") perché viola le basi della programmazione strutturata.

Come dimostrato dal teorema di Böhm-Jacopini, un'attenta scrittura del codice può evitare di ricorrere a istruzioni GOTO, anche se è a volte necessario introdurre variabili aggiuntive o un ulteriore costrutto logico. L'assenza di GOTO rende comunque il codice più facile da analizzare.

Tuttavia, in linguaggi che non prevedano le eccezioni oppure nella scrittura di sistemi operativi, i salti incondizionati nel codice possono essere una valida scelta nel caso di rollback di operazioni o deallocazione di risorse allocate attraverso passi successivi, quando in uno di tali passi si verifichi una condizione di errore. Il codice sorgente del kernel Linux è ricco di GOTO, spesso finalizzati a tale scopo.

Esempi 
I seguenti esempi stampano tutti a schermo 10 righe numerate progressivamente

Linguaggio BASIC 
Esempio di utilizzo dell'istruzione goto 10 LET i = 1
 20 PRINT i
 30 LET i = i + 1
 40 IF i < 10 THEN GOTO 20
Esempio di programmazione strutturata senza goto 10 LET i = 1
 20 DO
 30 PRINT i
 40 LET i = i + 1
 50 LOOP WHILE i < 10

Linguaggio C/C++ 
Esempio di utilizzo dell'istruzione goto
 int i = 1;
 etichetta:
 printf("riga %d\n", i++);
 if (i < 10) goto etichetta;
Esempio di programmazione strutturata senza goto
 int i = 1;
 do {
    printf("riga %d\n", i++);
 } while (i < 10);oppurefor(int i = 0; i < 10; i++)
    printf("riga %d\n", i);

Curiosità 

Nel videogioco Star Wars: Knights of the Old Republic II: The Sith Lords esiste un personaggio chiamato G0-T0 o Goto, che è un droide con problemi di programmazione.

Voci correlate

Collegamenti esterni 
 Go To Statement Considered harmful (Edsger W. Dijkstra) Testo chiave nelle discussioni sulla programmazione strutturata e l'uso del GOTO.

Concetti di programmazione