GOTO
Template:Nd Template:Citazione
In informatica, GO TO o GOTO (Template:Lett) è 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: <syntaxhighlight lang=basic4gl> GOTO numero di riga </syntaxhighlight>
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<syntaxhighlight lang=basic4gl>
10 LET i = 1 20 PRINT i 30 LET i = i + 1 40 IF i < 10 THEN GOTO 20
</syntaxhighlight> Esempio di programmazione strutturata senza goto<syntaxhighlight lang=basic4gl>
10 LET i = 1 20 DO 30 PRINT i 40 LET i = i + 1 50 LOOP WHILE i < 10
</syntaxhighlight>
Linguaggio C/C++
Esempio di utilizzo dell'istruzione goto <syntaxhighlight lang=c>
int i = 1;
etichetta:
printf("riga %d\n", i++);
if (i < 10) goto etichetta;
</syntaxhighlight> Esempio di programmazione strutturata senza goto <syntaxhighlight lang="c">
int i = 1;
do {
printf("riga %d\n", i++);
} while (i < 10);
</syntaxhighlight>oppure<syntaxhighlight lang="c"> for(int i = 0; i < 10; i++)
printf("riga %d\n", i);
</syntaxhighlight>
Voci correlate
Collegamenti esterni
- Template:FOLDOC
- Go To Statement Considered harmful (Edsger W. Dijkstra) Testo chiave nelle discussioni sulla programmazione strutturata e l'uso del GOTO.