Skip to main content

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 anger 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ärderapporterna 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 ta slut och stoppa programutförandet.Ä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 omstruktureras 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 avRekursion.

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 betyder 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 klar körs dess stackram från toppen avStack och exekvering återgår till funktion A, som har sin ram poppade av stacken när den är klar, och slutligen returnerar programkontrollen till den punkt från vilken den första funktionen ursprungligen kallades.

När ett svanssamtal används, returuttalande iEn funktion använder direkt returvärdet för en annan funktion som 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 Function A och Function A: s stackram kommer att poppas och bortskaffas, vilket betyder att funktionen B kommer att passera sitt returvärde direkt tillbakatill den plats som kallas funktion A utan att först behöva skicka kontrollen tillbaka till funktion A. Detta ökar hastigheten på funktionssamtal samt hjälper till att hålla nere mängden information i stacken.

Egenskaperna för ett svanssamtal kan ringadem ett mycket attraktivt 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 programmets avslutning.