Hva er en halesamtale?
Ved datamaskinprogrammering er et haleopprop en spesifikk situasjon innenfor programkildekoden der en funksjon, subroutine eller prosedyre returnerer en forventet verdi ved å ringe en annen funksjon i stedet for bare å passere en variabel som holder returverdien. Selve navnet betegner at funksjonen som kalles for å beregne verdien som skal returneres, er på slutten, eller halen, av funksjonen som kaller den for å levere en returverdi. En haleoppringning er av interesse for noen programmerere fordi, med visse optimaliseringer eller kompilatorens oppførsel, ikke brukes noen ekstra stabelplass til å lagre kodelokasjoner for hovedfunksjonen; halefunksjonen brukes i stedet for å generere returverdirapportene direkte tilbake til anropspunktet der den opprinnelige funksjonen ble påkalt. Bruken av en haleoppringing er spesielt nyttig i situasjoner der rekursjon benyttes, fordi mengden av bunkeplass som brukes til å lagre innringeradressene i tilfeller der de rekursive anrop hekker veldig dypt, raskt kunne gå tom og stoppe utførelsen av programmet. Selv om bruk av halesamtaler kan bidra til å øke hastigheten, minnebruken og effektiviteten i et program, kan det også føre til situasjoner der kildekoden er omstrukturert for å bruke samtalene på en måte som gjør det vanskelig å feilsøke og spore, spesielt med tilfeller av rekursjon.
Eksistensen av en haleoppringing skyldes i stor grad hvordan anropsstabelen fungerer innenfor de fleste dataprogrammer og systemarkitekturer. Bunken, som er som en bunke med plater, er en først-inn, sist ut-datastruktur. Når en funksjon, subroutine eller prosedyre kalles, lagres adressen som anropet blir foretatt fra, kalt en stabelramme, i stabelen. Dette betyr at et program som kaller funksjon A, som deretter kaller funksjon B, vil ha to stabelrammer, ett for funksjon B og et annet under det for funksjon A. Etter at funksjon B er ferdig med å bli utført, blir stablerammen spratt fra toppen av bunke og utførelse går tilbake til funksjon A, som har rammen spratt av bunken når den er ferdig, og endelig returnerer programkontrollen til det punktet den første funksjonen opprinnelig ble kalt fra.
Når et haleopprop brukes, bruker retningsoppgaven i en funksjon direkte returverdien til en annen funksjon som dataene som skal sendes til anropskoden. I eksempelet ovenfor, hvis funksjon A kaller funksjon B direkte med returerklæringen, har det blitt dannet et haleanrop. I stedet for å ha en stabelramme for begge funksjonene A og B, vil funksjon B motta returadressen fra funksjon A og funksjon As stabelramme blir spratt og avhendet, noe som betyr at funksjon B vil gi returens verdi direkte tilbake til stedet som het Funksjon A uten først å måtte gi kontrollen tilbake til Funksjon A. Dette øker hastigheten på funksjonsanrop, samt hjelper til med å holde mengden informasjon i stabelen nede.
Egenskapene til en haleoppringning kan gjøre dem til et veldig attraktivt alternativ for rekursive funksjoner. En rekursiv funksjon er en som kaller seg gjentatte ganger for å beregne en verdi, slik det kan være tilfelle når du krysser en listedatastruktur. Det opprettes ingen ekstra stabelrammer for de nestede funksjonssamtalene, så veldig dypt nivå av rekursjon kan utføres trygt uten øyeblikkelig trussel om et stabilt overløp og mulig programavslutning.