Continuazione
In informatica, una continuazione (continuation in inglese) è un modo per rappresentare lo stato di esecuzione di un programma ad un punto dato. Molti linguaggi hanno un costrutto che permette di salvare lo stato corrente di esecuzione per poi riprendere l'esecuzione a partire da questo stato in un momento successivo. Questa tecnica è tipica della programmazione funzionale ma sono molti i linguaggi di programmazione che presentano questa caratteristica con varie denominazioni:
- Scheme:
call/cc
(abbreviazione dicall-with-current-continuation
) - Standard ML of New Jersey:
SMLofNJ.CONT.callcc
- C:
setcontext
et al. (UNIX System V e GNU libc) - Ruby:
callcc
- Python: (vedi oltre) possedeva il modulo
continuation
ma è stato rimosso. - Haskell: Monade di continuazione
La continuazione si utilizza per "saltare" da una parte del programma all'altra a seconda delle necessità. Funziona in modo analogo al comando goto presente nel BASIC con la differenza che il comando goto è sconsigliato perché rende la manutenzione del codice difficile mentre la continuazione non rende ardua la modifica del codice quando questo diventa di elevate dimensioni. La continuazione non salta tra linee di codice ma tra stati. Si può vedere il programma come un insieme di stati che evolvono a seconda delle azioni dell'utente e la continuazione consente di saltare tra stati diversi a seconda delle necessità. Utilizza un modello di programmazione simile a quello delle reti di Petri.
Il supporto per la continuazione da parte dei vari linguaggi è molto variabile. Un linguaggio di programmazione supporta la continuazione rientrante o di prima classe se una continuazione può essere richiamata più volte per rientrare nello stesso contesto (l'uso del termine rientrante in questo caso non è da confondere con l'uso fatto trattando il multitasking).
Se le continuazione può essere usata solo per uscire dal contesto corrente, si dice il linguaggio supporta l'escape continuation. Molti linguaggi che non supportanto direttamente la continuazione, hanno il supporto per la gestione delle eccezioni, che è equivalente all'escape continuation e può essere usata per gli stessi scopi. I costrutti C setjmp
e longjmp
sono di questo tipo: possono essere usati solo per srotolare lo stack e non per ripristinare una precedente continuazione salvata.
Le continuazioni di prima classe possono essere usate per implementare l'ottimizzazione della chiamata di coda. La presenza sia della continuazione di prima classe che dell'ottimizzazione della chiamata di coda garantita, è uno dei punti di distinzione dello Scheme dagli altri linguaggi Lisp.
Molti programmatori che non sono abituati alla continuazione, la trovano un concetto difficile da capire. Il linguaggio di programmazione esoterico Unlambda include questa caratteristica solo per la sua difficoltà di comprensione.
La continuazione è strettamente collegata alla trasformazione della doppia negazione dalla logica classica alla logica intuizionistica attraverso l'isomorfismo di Curry-Howard e alla legge di Peirce.
Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]- Wikizionario contiene il lemma di dizionario «continuazione»
Collegamenti esterni
[modifica | modifica wikitesto]- La magia di callcc Un articolo in italiano al riguardo
- (EN) Continuations Made Simple and Illustrated Una spiegazione fatta utilizzando Python.
- (EN) Continuations and Stackless Python scritto da Christian Tismer
- (EN) setjmp/longjmp Illustrated pubblicato su Linux Gazette
- (EN) On-line proceedings of the Fourth Workshop on Continuations, su cs.bham.ac.uk. URL consultato il 1º novembre 2004 (archiviato dall'url originale il 2 dicembre 2010).
- (EN) Continuation, functions and jumps (PDF), su cs.bham.ac.uk. URL consultato il 1º novembre 2004 (archiviato dall'url originale il 2 dicembre 2010).
- (EN) Using continuations for web programming, su phubuh.org. URL consultato il 1º novembre 2004 (archiviato dall'url originale il 19 ottobre 2004).