Innen datavitenskap er fortsettelsen av et system dets fremtid , det vil si rekkefølgen av instruksjoner som den fortsatt må utføre i et presist øyeblikk. Det er et synspunkt å beskrive maskinens tilstand.
I noen programmeringsspråk kan fortsettelser håndteres eksplisitt som objekter av språket i seg selv: vi kan lagre den nåværende fortsettelsen i en variabel som vi derfor kan håndtere som sådan; så senere, kan vi gjenopprette fortsettelsen, noe som har forvirring av gjennomføringen av det nåværende programmet mot fremtiden som vi hadde spilt inn.
I C fanger setjmp- instruksjonen en fortsettelse (faktisk lagring av verdien til den ordinære telleren i en variabel), og longjmp- instruksjonen gjør at programmet kan dirigeres til en lagret fortsettelse.
I funksjonell programmering tar en fortsettelse form av en funksjon som kan ta forskjellige argumenter (som påvirker returverdien til instruksjonen som hadde "grepet" den nåværende fortsettelsen) og som ikke har noen returverdi (slutter faktisk ikke fra den som ringer synspunkt, fordi programmet er forvirret).
Eksempel i skjema :
(define fonction1 (lambda (k) (begin (display "Toto") (k "Titi") (display "Tata") ))) (display (call-with-current-continuation fonction1))har utdata til skjermen:
Toto TitiInstruksjonen "(display" Tata ")" ble ignorert.
Forklaring:
Imidlertid er den vanligste bruken av forestillingen om fortsettelse implisitt når man håndterer unntak .
Faktisk er unntaksblokken bare en syntaktisk struktur for å si at før vi utførte, registrerte vi den nåværende fortsettelsen (uten blokken) foran utførelsen av unntaksbehandlingsrutinen, og at når det oppstår et unntak under utførelsen av blokken, så vi vil kalle den tilsvarende fortsettelsen.
Eksempel i OCaml :
try 50 / 0 with Division_by_zero -> 42 ;;komme tilbake
- : int = 42Forklaring: Før divisjonen kjøres, registrerer OCaml fortsettelsen av å returnere 42 og deretter avslutter utførelsen i unntaket "Division_by_zero". Så prøver OCaml å lansere divisjonen som resulterer i kallet til dette unntaket, som nettopp en nettopp hadde assosiert med en fortsettelse.
I funksjonell programmering , fortsettelse programmering refererer til et programmerings teknikken med å bruke bare enkle funksjonskall som tar sin egen fortsettelse som argument, i stedet for sekvensmessig å kalle funksjoner, eller å utføre en funksjon av resultatet. Fra den forrige. Disse funksjonene befinner seg på en måte mestrer skjebnen, og nøyer seg ikke lenger med å bli utsatt for konteksten.
En av utfordringene med fortsettelse programmering er å skaffe et terminal rekursivt program , som etter kompilering og optimalisering ikke lenger krever stabling av påfølgende nestede samtaler. Dette resulterer i mindre minneforbruk.
Eksempel: beregning av fabrikken, i OCaml
"Klassisk" versjon:
let rec fact = function | 0 -> 1 | n -> n*(fact (n - 1));;Fortsettelsesversjon:
let rec fact k = function | 0 -> (k 1) | n -> fact (fun x -> k (n * x)) (n - 1);;Hvis vi bare vil beregne faktoren på 5 og vise den, ville anropssyntaksen være det
print_int (fact 5);;i det første tilfellet og
fact print_int 5i det andre.
Det er en denotasjonell semantikk kalt ved fortsettelse . I denne semantikken er den matematiske betydningen av et program en funksjon som tar en fortsettelse (det som følger utførelsen) og gjengir en fortsettelse (det som tilsvarer utførelsen).
Dermed, hvis P er et program, er dets semantikk [[P]] av typen Fortsettelse → Fortsettelse , der typen Fortsettelse er typen Tilstand → Observasjon .
Og hvis E er et uttrykk (program som har en verdi i språket), er [[E]] av typen E_Continuation → Continuation , der type E_Continuation (eller fortsettelse av uttrykk) er type Value → Continuation .
Fortsettelsene gjør det mulig å gi et beregningsinnhold til klassisk logikk innenfor rammen av Curry-Howard-korrespondansen .