GOTO
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Nota_disambigua.svg/18px-Nota_disambigua.svg.png)
«Code that relies on goto statements is generally harder to understand and to maintain than code without gotos. Although we are not dogmatic about the matter, it does seem that goto statements should be used rarely, if at all.»
«Il codice che utilizza istruzioni goto è generalmente più difficile da capire e da gestire rispetto al codice senza goto. Anche se non siamo dogmatici riguardo alla questione, risulta che gli statement goto debbano essere usati raramente, se non per niente.»
(Brian Kernighan & Dennis Ritchie, The C Programming Language)
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
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);
oppure
for(int i = 0; i < 10; i++) printf("riga %d\n", i);
Voci correlate
- COMEFROM Una struttura di controllo che si propone di essere più oscura del GOTO[senza fonte]
Collegamenti esterni
- (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.
![](http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Computer_n_screen.svg/24px-Computer_n_screen.svg.png)