Apri il menu principale
(EN)

«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.»

(IT)

«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 la 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 (letteralmente "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 (spaghetti code), rendendo illeggibile o di difficile comprensione un algoritmo o una procedura.

Indice

DescrizioneModifica

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 GOTO può 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 finalizzate a tale scopo.

EsempiModifica

I seguenti esempi stampano tutti a schermo 10 righe numerate progressivamente

Linguaggio BASICModifica

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

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);

CuriositàModifica

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 correlateModifica

  • COMEFROM Una struttura di controllo che si propone di essere più oscura del GOTO[senza fonte]

Collegamenti esterniModifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica