Hva er en halesamtale?
I dataprogrammering er en halesamtale en spesifikk situasjon i programkildekoden der en funksjon, subroutine eller prosedyre returnerer en forventet verdi ved å kalle en annen funksjon i stedet for bare å passere en variabel som holder returverdien. Navnet i seg selv 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 halesamtale er av interesse for noen programmerere fordi, med visse optimaliseringer eller kompilatoratferd, ikke brukes noen ekstra stabelplass til å lagre kodeplasser for hovedfunksjonen; Halefunksjonen brukes i stedet til å generere returverdirapportene direkte tilbake til anropspunktet der den opprinnelige funksjonen ble påkalt. Bruken av en haleanrop er spesielt nyttig i situasjoner der rekursjon brukes, fordi mengden stabelplass som brukes til å lagre anroperadressene i tilfeller der rekursivet hekker veldig dypt kan raskt gå tom og stoppe program henrettelse. Selv om bruk av halesamtaler kan bidra til å øke hastigheten, hukommelsesbruken 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 halesamtale skyldes i stor grad hvordan samtalebunken fungerer innen de fleste dataprogrammer og systemarkitekturer. Stabelen, som er som en stabel med plater, er en første-inn, siste ut datastruktur. Når en funksjon, subroutine eller prosedyre kalles, lagres adressen som samtalen fra, kalt en stabelramme fra, lagres i stabelen. Dette betyr et program som kaller funksjon A, som deretter kaller funksjon B, vil ha to stakkrammer, en for funksjon B og en annen under den for funksjon A. Etter at funksjon B er ferdig med utførelse, blir stabelrammen spratt fra toppen av stabelen og utførelsengår tilbake til funksjon A, som har rammen som dukker opp av stabelen når den er gjort, og endelig returnerer programkontroll til det punktet som den første funksjonen opprinnelig ble kalt.
Når en haleanrop brukes, bruker returerklæringen i en funksjon direkte returverdien til en annen funksjon som dataene som skal sendes til samtalekoden. I eksemplet ovenfor, hvis funksjon en samtalsfunksjon b direkte med returuttalelsen, er det dannet en halesamtale. Innenfor samtalestabelen, i stedet for å ha en stabelramme for begge funksjonene A og B, vil funksjon B motta returadressen fra funksjon A og funksjon As stabelramme vil bli poppet og avhendes, noe som betyr at funksjon B vil passere sin returverdi direkte tilbake til stedet som kalles funksjon A uten først å måtte passere kontrollen tilbake til funksjon A. Dette øker hastigheten på funksjonssamtaler så vel som å hjelpe til
Egenskapene til en halesamtale kan gjøre dem til en veldigattraktivt alternativ for rekursive funksjoner. En rekursiv funksjon er en som kaller seg gjentatte ganger for å beregne en verdi, som det kan være tilfelle når du krysser en listedatastruktur. Det opprettes ingen ekstra stakkrammer for de nestede funksjonssamtalene, så veldig dype nivåer av rekursjon kan utføres trygt uten den umiddelbare trusselen om en stabeloverløp og mulig programavslutning.