Differenze tra le versioni di "Continuazione"

2 597 byte aggiunti ,  16 anni fa
Tradotto da en.wiki ed integrato (tolto stub)
(cat : info)
(Tradotto da en.wiki ed integrato (tolto stub))
In [[informatica]], una '''continuazione''' ('''continuation''' in inglese) è un modo per rappresentare lo stato di esecuzione di un programmma (vedi anche [[Stack]]) 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 [[linguaggio di programmazione|linguaggi di programmazione]] che presentano questa caratteristica con varie denominazioni:
{{stub}}
In [[informatica]], una '''continuazione''' (''continuation'', in inglese) è il resto di una computazione. <br/>
Ad esempio nel codice
a= 10
print a
la continuazione della prima linea è la seconda.
La continuazione s 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 [[Rete di Petri|reti di Petri]]. Un esempio può essere un server web. Supponiamo che un utente debba compilare una serie di form, ogni form viene visto come uno stato e quindi se l'utente si rende conto di aver commesso un errore basta far tornare il programma allo stato corrispondente senza doversi preoccupare di gestire errori o eccezioni dato il ritorno allo stato vecchi cancella tutte le azioni svolte sugli stati successivi impedisce doppi inserimenti nel database del server web.
 
*[[Scheme]]: <code>call/cc</code> (abbreviazione di <code>call-with-current-continuation</code>)
Alcuni linguaggi come [[Ruby]], [[Scheme]] e [[SML/NJ]] permettono di manipolare le continuazioni esplicitamente.
*[[SML|Standard ML of New Jersey]]: <code>SMLofNJ.CONT.callcc</code>
*[[C (linguaggio)|C]]: <code>setcontext</code> et al. ([[UNIX System V]] e [[GNU]] libc)
*[[Ruby]]: <code>callcc</code>
*[[Stackless Python|Python]]: (vedi oltre) possedeva il moodulo <tt>continuation</tt> ma è stato rimosso.
 
La continuazione ssi 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 [[Rete di Petri|reti di Petri]]. Un esempio può essere un server web. Supponiamo che un utente debba compilare una serie di form, ogni form viene visto come uno stato e quindi se l'utente si rende conto di aver commesso un errore basta far tornare il programma allo stato corrispondente senza doversi preoccupare di gestire errori o eccezioni dato il ritorno allo stato vecchi cancella tutte le azioni svolte sugli stati successivi impedisce doppi inserimenti nel database del server web.
==Collegamenti esterni==
 
Il supporto per la continuazione da parte dei vvari 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<nowiki>'</nowiki>''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 <code>setjmp</code> e <code>longjmp</code> 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'[[ricorsione di coda|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]] includes questa caratteristica solo per la sua difficoltà di comprensione.
 
La continuazione è strettamente collegata alla trasformazione della [[doppia negazione]] dalla [[logica classica]] alla [[logica intuizionistica]] attravertso l'[[isomorfismo di Curry-Howard]] e alla [[legge di Peirce]].
 
==Vedi anche==
 
*[[GOTO]]
*[[COMEFROM]]
 
==Risorse esterne==
* [http://www.siforge.org/articles/2004/09/20-la_magia_di_callcc.html Un articolo in italiano a riguardo]
*[http://www.ps.uni-sb.de/~duchier/python/continuations.html Continuations Made Simple and Illustrated]. An explanation, using the [[Python programming language]].
*[http://www.stackless.com/spcpaper.htm Continuazione e Stackless Python] by Christian Tismer
*[http://www.linuxgazette.com/issue90/raghu.html setjmp/longjmp Illustrated] from Linux Gazette
*[http://www.cs.bham.ac.uk/~hxt/cw04/cw04-program.html On-line proceedings of the Fourth Workshop on Continuations]
*[http://www.cs.bham.ac.uk/~hxt/research/Logiccolumn8.pdf Continuation, functions and jumps]
*[http://www.phubuh.org/Media/Writing/Continuations/ Using continuations for web programming]
 
[[Categoria:Informatica]]
[[categoria:informatica]]