Vad är ett svanssamtal?

I datorprogrammering är ett svanssamtal en specifik situation inom programkällkoden där en funktion, subroutine eller procedur returnerar ett förväntat värde genom att ringa en annan funktion istället för att helt enkelt skicka en variabel som innehar returvärdet. Namnet i sig betecknar att den funktion som kallas för att beräkna värdet som ska returneras är i slutet eller svansen av funktionen som kallar den för att tillhandahålla ett returvärde. Ett svanssamtal är av intresse för vissa programmerare eftersom, med vissa optimeringar eller kompilatorbeteenden, används inget ytterligare stackutrymme för att lagra kodplatser för huvudfunktionen; Svansfunktionen används istället för att generera returvärderapporter direkt tillbaka till samtalspunkten där den ursprungliga funktionen åberopades. Användningen av ett svanssamtal är särskilt användbar i situationer där rekursion används, eftersom mängden stackutrymme som används för att lagra de som ringer adresser i fall där rekursiva samtal bo mycket djupt snabbt kunde springa ut och stoppa programm exekvering. Även om att använda svanssamtal kan bidra till att öka hastigheten, minnesanvändningen och effektiviteten i ett program, kan det också leda till situationer där källkoden är omstrukturerad för att använda samtalen på ett sätt som gör det svårt att felsöka och spåra, särskilt med fall av rekursion.

Förekomsten av ett svanssamtal beror till stor del på hur samtalsstacken fungerar inom de flesta datorprogram och systemarkitekturer. Stacken, som är som en bunt med plattor, är en först-in, sist-out datastruktur. När en funktion, subroutine eller procedur kallas, lagras adressen från vilken samtalet, kallas en stackram, i stacken. Detta innebär att ett program som kallar funktion A, som sedan kallar funktion B, kommer att ha två stackramar, en för funktion B och en annan under det för funktion A. När funktionen B är färdig att köra, sprids dess stackram från toppen av stacken och körningenReturnerar till Function A, som har sin ram dyker upp från stacken när den är klar, och slutligen återlämnande programkontroll till den punkt från vilken den första funktionen ursprungligen kallades.

När ett svanssamtal används använder returmeddelandet i en funktion direkt returvärdet för en annan funktion som de data som ska skickas till samtalskoden. I exemplet ovan, om funktionen A -samtal fungerar direkt med returmeddelandet, har ett svanssamtal bildats. Inom samtalsstacken, istället för att ha en stackram för båda funktionerna A och B, kommer funktion B att få returadressen från funktion A och Funktion A: s stackram kommer att poppas och bortskaffas, vilket betyder att funktionen B kommer att passera sitt returvärde direkt tillbaka till platsen som kallas funktion A utan att först behöva passera kontrollen till funktion A. Detta ökar hastigheten för funktionssamtal så att det hjälper till att hålla nere beloppet för information i stacken.

Egenskaperna för ett svanssamtal kan göra dem till en mycketattraktivt alternativ för rekursiva funktioner. En rekursiv funktion är en som kallar sig upprepade gånger för att beräkna ett värde, vilket kan vara fallet när man korsar en listdatastruktur. Inga ytterligare stackramar skapas för de kapslade funktionssamtalen, så mycket djupa nivåer av rekursion kan utföras säkert utan det omedelbara hotet om ett stacköverflöde och möjlig programmavbrott.

ANDRA SPRÅK

Hjälpte den här artikeln dig? Tack för feedbacken Tack för feedbacken

Hur kan vi hjälpa? Hur kan vi hjälpa?