Was ist ein Schwanzanruf?
In der Computerprogrammierung ist ein Tail -Aufruf eine bestimmte Situation innerhalb des Programmquellcode, in der eine Funktion, eine Unterroutine oder ein Prozedur einen erwarteten Wert zurückgeben, indem eine andere Funktion aufgerufen wird, anstatt einfach einen Variablen zu übergeben, der den Rückgabewert enthält. Der Name selbst bedeutet, dass die Funktion zur Berechnung des zu zurückgegebenen Werts am Ende oder am Schwanz der Funktion ist, die ihn aufruft, um einen Rückgaberwert zu liefern. Ein Schwanzaufruf ist für einige Programmierer von Interesse, da mit bestimmten Optimierungen oder Compiler -Verhaltensweisen kein zusätzlicher Stapelraum verwendet werden, um Codepositionen der Hauptfunktion zu speichern. Die Schwanzfunktion wird stattdessen verwendet, um die Rückgabewertberichte direkt zum Anrufpunkt zurück zu generieren, an dem die ursprüngliche Funktion aufgerufen wurde. Die Verwendung eines Schwanzaufrufs ist besonders nützlich in Situationen, in denen eine Rekursion verwendet wirdm Ausführung. Obwohl die Verwendung von Tail -Aufrufen dazu beitragen kann, die Geschwindigkeit, den Speicherverbrauch und die Effizienz in einem Programm zu erhöhen, kann er auch zu Situationen führen, in denen der Quellcode umstrukturiert wird, um die Anrufe so zu verwenden, dass es schwierig ist, zu debuggen und zu verfolgen, insbesondere bei Fällen von Rekursion.
Die Existenz eines Schwanzaufrufs ist zum großen Teil darauf zurückzuführen, wie der Anrufstack in den meisten Computerprogrammen und Systemarchitekturen funktioniert. Der Stapel, der wie ein Stapel von Tellern ist, ist eine erste Datenstruktur für die erste In-in-In-In-In-In-In-Last-Out. Wenn eine Funktion, Unterroutine oder eine Prozedur aufgerufen wird, wird die Adresse, aus der der Anruf getätigt wird, als Stapelrahmen bezeichnet, im Stapel gespeichert. Dies bedeutet ein Programm, das Funktion A aufruft, das dann Funktion B aufruft, wird zwei Stapelrahmen haben, eines für die Funktion B und eine andere für die Funktion A. Nach der Ausführung der Funktion B ist der Stapelrahmen von der Oberseite des Stapels und der Ausführung aufgetauchtkehrt zu Funktion A zurück, wobei der Rahmen beim Abschluss des Stapels aus dem Stapel gekommen ist, und die Programmsteuerung bis zu dem Punkt, aus dem die erste Funktion ursprünglich aufgerufen wurde.
Wenn ein Schwanzaufruf verwendet wird, verwendet die Rückgabeanweisung in einer Funktion direkt den Rückgabewert einer anderen Funktion als die Daten, die an den aufrufenden Code gesendet werden sollen. Wenn Funktion A auf den Aufruf von Funktion B direkt mit der Rückgabeanweisung aufgerufen wird, wurde im obigen Beispiel ein Schwanzaufruf gebildet. Innerhalb des Anrufstacks erhält die Funktion B anstatt einen Stapelrahmen für beide Funktionen A und B zu erhalten, und erhält die Rückgabeadresse von Funktion A und der Stapelrahmen von Funktion A wird geknappelt und entsorgt, was die Funktion b direkt an den Ort übergibt, der die Funktion A bezeichnet hat, ohne dass die Kontrolle über die Funktion A. die Geschwindigkeit der Funktionsanrufe weitergegeben wird.
Die Eigenschaften eines Schwanzaufrufs können sie zu einer sehr machenAttraktive Option für rekursive Funktionen. Eine rekursive Funktion ist eine, die sich wiederholt aufruft, um einen Wert zu berechnen, wie es beim Durchlaufen einer Listendatenstruktur der Fall sein kann. Für die verschachtelten Funktionsaufrufe werden keine zusätzlichen Stapelrahmen erstellt, sodass ein sehr tiefes Rekursionsniveau sicher ohne die unmittelbare Gefahr eines Stapelüberlaufs und einer möglichen Programmabgabe durchgeführt werden kann.