Skip to main content

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 de som ringer adresser i tilfeller der rekursivet rede hekker veldig dypt, kan raskt løpe ut og stoppe utførelsen av programmet.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 avRekursjon.

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 avStack og utførelse går tilbake til funksjon A, som har rammen som dukker opp av stabelen når den er gjort, til slutt returnerende programkontroll til det punktet som den første funksjonen opprinnelig ble kalt.

Når en halesamtale brukes, er returuttalelsen iEn funksjon bruker 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 tilbaketil stedet som kalte funksjon a uten først å måtte passere kontrollen tilbake til funksjon A. Dette øker hastigheten på funksjonsanropene i tillegg til å bidra til å holde ned mengden informasjon i stabelen.

Egenskapene til en halesamtale kan ringedem et veldig attraktivt 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.Ingen ekstra stakkrammer opprettes 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.