GOTO
In informatica, GO TO o GOTO (lett. "vai a") è 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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]I seguenti esempi stampano tutti a schermo 10 righe numerate progressivamente
Linguaggio BASIC
[modifica | modifica wikitesto]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++
[modifica | modifica wikitesto]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);
oppure
for(int i = 0; i < 10; i++)
printf("riga %d\n", i);
Voci correlate
[modifica | modifica wikitesto]- COMEFROM Una struttura di controllo che si propone di essere più oscura del GOTO[senza fonte]
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, goto, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- Go To Statement Considered harmful (Edsger W. Dijkstra) Testo chiave nelle discussioni sulla programmazione strutturata e l'uso del GOTO.