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 er anvendt, fordi mængden af ​​stakplads, der bruges til at gemme opkaldsadresser i tilfælde, hvor det rekursive kalder reden meget dybt, hurtigt kunne løbe ud og stoppe Program udførelse. Selvom brug af haleopkald kan hjælpe med at øge hastigheden, hukommelsesforbruget og effektiviteten i et program, kan det også føre til situationer, hvor kildekoden omstruktureres for at bruge opkaldene på en måde, der gør det vanskeligt at fejlsøge og spore, især med tilfælde af rekursion.

Eksistensen af ​​et haleopkald 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ø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 ​​stakken og udførelsenvender tilbage til funktion A, der har sin ramme sprang ud af stakken, når den er færdig, og endelig returnerende programkontrol til det punkt, hvorfra den første funktion oprindeligt blev kaldt.

Når der bruges et haleopkald, bruger returnerklæringen i en funktion 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 vil videregive sin returnering direkte tilbage til placeringen, der kaldes funktion A uden først at skulle passere kontrol tilbage til funktion A. Dette øger hastigheden af ​​funktionsopkald samt at hjælpe med at holde mængden af ​​informationen i stakken.

Egenskaber ved et haleopkald kan gøre dem til en megetAttraktiv 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.

ANDRE SPROG

Hjalp denne artikel dig? tak for tilbagemeldingen tak for tilbagemeldingen

Hvordan kan vi hjælpe? Hvordan kan vi hjælpe?