Skip to main content

Hvad er et haleopkald?

I computerprogrammering er et haleopkald en bestemt situation inden for programkildekode, hvor en funktion, subroutine eller procedure returnerer en forventet værdi ved at kalde en anden funktion i stedet for blot at videregive en variabel, der holder returværdien.Selve navnet angiver, at den funktion, der kaldes til at beregne den værdi, der skal returneres, er i slutningen eller hale, af funktionen, der kalder den for at levere en returværdi.Et haleopkald er af interesse for nogle programmerere, fordi der med visse optimeringer eller kompilatoradfærd ikke bruges nogen yderligere stakplads til at gemme kodepladser for hovedfunktionen;Halefunktionen bruges i stedet til at generere returværdi rapporter direkte tilbage til opkaldspunktet, hvor den originale funktion blev påberåbt.Brugen af et haleopkald er især nyttigt i situationer, hvor rekursion anvendes, fordi mængden af stakplads, der bruges til at gemme opkaldsadresser i tilfælde, hvor det rekursive opkald reden meget dybt hurtigt kunne løbe ud og stoppe programudførelsen.Selvom brug af haleopkald kan hjælpeRekursion.

Eksistensen af et haleopkald skyldes stort set, hvordan opkaldsstakken fungerer inden for de fleste computerprogrammer og systemarkitekturer.Stakken, der er som en stak plader, er en første-in, sidste datastruktur.Når en funktion, subroutine eller procedure kaldes, er den adresse, hvorpå opkaldet foretages, kaldet en stakramme, gemt i stakken.Dette betyder, at et program, der kalder funktion A, der derefter kalder funktion B, vil have to stakrammer, et til funktion B og et andet under det for funktion A. Når funktion B er færdig med at udføre, sprang dens stakramme fra toppen af denStak og udførelse vender tilbage til funktion A, der har sin ramme sprang ud af stakken, når den er færdig, og endelig returneringsprogramkontrol til det punkt, hvorfra den første funktion oprindeligt blev kaldt.

Når der bruges et haleopkald, er returnerklæringen iEn funktion bruger direkte returværdien af en anden funktion som de data, der skal sendes til opkaldskoden.I ovenstående eksempel, hvis funktionen en opkaldsfunktion B direkte med returklæringen, er der dannet et haleopkald.Inden for opkaldsstakken, i stedet for at have en stakramme til både funktioner A og B, vil funktion B modtage returadressen fra funktion A og funktion A's stakramme vil blive poppet og bortskaffet, hvilket betyder, at funktion B passerer sin returværdi direkte tilbage tilbagetil det sted, der kaldte funktion A uden først at skulle videregive kontrol tilbage til funktion A. Dette øger hastigheden af funktionsopkald såvel som at hjælpe med at holde mængden af information nede i stakken.

Egenskaberne ved et haleopkald kan foretagedem en meget attraktiv mulighed for rekursive funktioner.En rekursiv funktion er en, der gentagne gange kalder sig for at beregne en værdi, som det kan være tilfældet, når man krydser en listedatakonstruktion.Der oprettes ingen ekstra stakrammer til de indlejrede funktionsopkald, så meget dybe rekursionsniveauer kan udføres sikkert uden den øjeblikkelige trussel om en stakoverløb og mulig programafslutning.