Wat is een Tail Call?

In computerprogrammering is een staartoproep een specifieke situatie binnen de programmabroncode waarin een functie, subroutine of procedure een verwachte waarde retourneert door een andere functie aan te roepen in plaats van eenvoudigweg een variabele door te geven die de retourwaarde bevat. De naam zelf geeft aan dat de functie die wordt aangeroepen om de te berekenen waarde te berekenen zich aan het einde of de staart bevindt van de functie die deze aanroept om een ​​retourwaarde te leveren. Een tail call is interessant voor sommige programmeurs omdat, met bepaalde optimalisaties of compilergedrag, geen extra stapelruimte wordt gebruikt om codelocaties van de hoofdfunctie op te slaan; de staartfunctie wordt in plaats daarvan gebruikt om de retourwaarderapporten direct terug te genereren naar het callpunt waar de oorspronkelijke functie werd aangeroepen. Het gebruik van een staartoproep is met name handig in situaties waarin recursie wordt gebruikt, omdat de hoeveelheid stapelruimte die wordt gebruikt om de belleradressen op te slaan in gevallen waarin de recursieve oproepen zeer diep nestelen, snel opraken en de uitvoering van het programma kan stoppen. Hoewel het gebruik van staartoproepen kan helpen de snelheid, het geheugengebruik en de efficiëntie in een programma te verhogen, kan het ook leiden tot situaties waarin de broncode wordt geherstructureerd om de oproepen te gebruiken op een manier die het moeilijk maakt om fouten op te sporen en bij te houden, vooral met gevallen van herhaling.

Het bestaan ​​van een staartoproep is grotendeels te wijten aan hoe de call-stack werkt in de meeste computerprogramma's en systeemarchitecturen. De stapel, die lijkt op een stapel platen, is een first-in, last-out datastructuur. Wanneer een functie, subroutine of procedure wordt aangeroepen, wordt het adres van waaruit wordt gebeld, een stapelframe genoemd, opgeslagen in de stapel. Dit betekent dat een programma dat functie A aanroept en vervolgens functie B aanroept, twee stapelframes zal hebben, een voor functie B en een andere eronder voor functie A. Nadat functie B is voltooid, wordt het stapelframe van de bovenkant van de stapel en uitvoering keert terug naar functie A, waarvan het frame van de stapel is gesprongen als het klaar is, en uiteindelijk de programmabesturing terugkeert naar het punt van waaruit de eerste functie oorspronkelijk werd aangeroepen.

Wanneer een staartoproep wordt gebruikt, gebruikt de retourinstructie in een functie direct de retourwaarde van een andere functie als de gegevens die naar de oproepcode moeten worden verzonden. Als in het bovenstaande voorbeeld functie A rechtstreeks functie B aanroept met de retourinstructie, is er een staartoproep gevormd. Binnen de oproepstapel ontvangt functie B in plaats van een stapelframe voor beide functies A en B het retouradres van functie A en wordt het stapelframe van functie A uitgeklapt en verwijderd, wat betekent dat functie B de retourwaarde direct teruggeeft naar de locatie die Functie A heeft geroepen zonder eerst de besturing terug te moeten geven aan Functie A. Dit verhoogt de snelheid van functieoproepen en helpt de hoeveelheid informatie in de stapel te beperken.

De eigenschappen van een staartoproep kunnen ze een zeer aantrekkelijke optie voor recursieve functies maken. Een recursieve functie is er een die zichzelf herhaaldelijk aanroept om een ​​waarde te berekenen, zoals het geval kan zijn bij het doorlopen van een lijstgegevensstructuur. Er worden geen extra stapelframes gemaakt voor de geneste functieaanroepen, dus zeer diepe niveaus van recursie kunnen veilig worden uitgevoerd zonder de onmiddellijke dreiging van een stapeloverloop en mogelijke programma-beëindiging.

ANDERE TALEN

heeft dit artikel jou geholpen? bedankt voor de feedback bedankt voor de feedback

Hoe kunnen we helpen? Hoe kunnen we helpen?