Hvad er et halekald?
Ved computerprogrammering er et haleopkald en specifik situation inden for programkildekoden, 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 betegner, at den funktion, der kaldes til at beregne den værdi, der skal returneres, er i slutningen eller halen på den funktion, der kalder den for at levere en returværdi. Et haleopkald er af interesse for nogle programmerere, fordi der med visse optimeringer eller compiler-opførsel ikke bruges yderligere stakplads til at gemme kodeplaceringer for hovedfunktionen; halefunktionen bruges i stedet til at generere rapporterne om returneringsværdien direkte tilbage til det opkaldspunkt, hvor den oprindelige funktion blev påberåbt. Anvendelsen af et halekald er særlig nyttigt i situationer, hvor rekursion anvendes, fordi den mængde stakplads, der bruges til at gemme opkalderadresserne, i tilfælde, hvor de rekursive opkald hekker meget dybt, hurtigt kunne løbe ud og stoppe programudførelsen. Selvom brug af halekald kan hjælpe med at øge hastighed, hukommelsesforbrug og effektivitet i et program, kan det også føre til situationer, hvor kildekoden er omstruktureret til at bruge opkaldene på en måde, der gør det vanskeligt at debug og spore, især med tilfælde af rekursion.
Eksistensen af et halekald skyldes i vid udstrækning, hvordan opkaldsstakken fungerer inden for de fleste computerprogrammer og systemarkitekturer. Stakken, der er som en stak plader, er en først-ind, sidst ud-datastruktur. Når der kaldes en funktion, en subroutine eller en procedure, gemmes adressen, hvorfra opkaldet foretages, kaldet en staktramme, i stakken. Dette betyder et program, der kalder Funktion A, der derefter kalder Funktion B, vil have to stabelrammer, et til Funktion B og et andet under det til Funktion A. Når Funktion B er færdig med at blive udført, poppes dens stakramme fra toppen af stak og eksekvering vender tilbage til funktion A, som har sin ramme slået fra stakken, når den er færdig, og endelig returnerer programstyring til det punkt, hvorfra den første funktion oprindeligt blev kaldt.
Når der bruges et haleopkald, bruger returopgørelsen i en funktion direkte returværdien for en anden funktion som de data, der skal sendes til opkaldskoden. I ovenstående eksempel, hvis funktion A kalder funktion B direkte med returneringsangivelsen, er der dannet et halekald. I opkaldsstakken, i stedet for at have en stakramme til begge funktioner A og B, modtager Funktion B returadressen fra Funktion A, og Funktion A's stakramme sprænges og bortskaffes, hvilket betyder, at Funktion B passerer sin returværdi direkte tilbage til det sted, der kaldte funktion A uden først at skulle overføre kontrol tilbage til funktion A. Dette øger hastigheden af opkald af funktionen og hjælper med at holde mængden af information i stakken nede.
Egenskaberne ved et halekald kan gøre dem til en meget attraktiv mulighed for rekursive funktioner. En rekursiv funktion er en, der gentagne gange kalder sig selv til at beregne en værdi, som det kan være tilfældet, når man krydser en listedatastruktur. Der oprettes ikke yderligere staktrammer til de indlejrede funktionsopkald, så meget dybe rekursionsniveauer kan udføres sikkert uden den øjeblikkelige trussel om et stakoverløb og mulig programafslutning.