Was ist ein Schwanzruf?

Bei der Computerprogrammierung ist ein Tail-Aufruf eine bestimmte Situation innerhalb des Programmquellcodes, in der eine Funktion, eine Subroutine oder eine Prozedur einen erwarteten Wert zurückgibt, indem sie eine andere Funktion aufruft, anstatt einfach eine Variable zu übergeben, die den Rückgabewert enthält. Der Name selbst gibt an, dass die zur Berechnung des zurückzugebenden Werts aufgerufene Funktion am Ende oder Ende der Funktion steht, die ihn zur Bereitstellung eines Rückgabewerts aufruft. Ein Tail-Aufruf ist für einige Programmierer von Interesse, da bei bestimmten Optimierungen oder Compilerverhalten kein zusätzlicher Stapelspeicher zum Speichern von Codestellen der Hauptfunktion verwendet wird. Die Tail-Funktion wird stattdessen verwendet, um die Rückgabewertberichte direkt an den Aufrufpunkt zu generieren, an dem die ursprüngliche Funktion aufgerufen wurde. Die Verwendung eines Tail-Aufrufs ist besonders in Situationen nützlich, in denen eine Rekursion verwendet wird, da der zum Speichern der Anruferadressen verwendete Stapelspeicherplatz in Fällen, in denen die rekursiven Aufrufe sehr tief verschachtelt sind, schnell zur Neige gehen und die Programmausführung stoppen kann. Die Verwendung von Tail Calls kann zwar die Geschwindigkeit, die Speichernutzung und die Effizienz eines Programms erhöhen, kann jedoch auch dazu führen, dass der Quellcode so umstrukturiert wird, dass die Aufrufe auf eine Weise verwendet werden können, die das Debuggen und Verfolgen erschwert, insbesondere in Fällen von Rekursion.

Die Existenz eines Tail-Aufrufs ist zu einem großen Teil darauf zurückzuführen, wie der Aufrufstapel in den meisten Computerprogrammen und Systemarchitekturen funktioniert. Der Stapel, der einem Stapel von Platten gleicht, ist eine First-In- und Last-Out-Datenstruktur. Wenn eine Funktion, ein Unterprogramm oder eine Prozedur aufgerufen wird, wird die Adresse, von der aus der Aufruf erfolgt, Stapelrahmen genannt, im Stapel gespeichert. Dies bedeutet, dass ein Programm, das die Funktion A aufruft und dann die Funktion B aufruft, zwei Stapelrahmen hat, einen für die Funktion B und einen darunter für die Funktion A. Nachdem die Ausführung der Funktion B beendet ist, wird ihr Stapelrahmen vom oberen Rand des Fensters entfernt stack and execution kehrt zur Funktion A zurück, deren Frame nach Abschluss des Vorgangs vom Stack abfällt, und gibt schließlich die Programmsteuerung an den Punkt zurück, von dem aus die erste Funktion ursprünglich aufgerufen wurde.

Bei Verwendung eines Tail-Aufrufs verwendet die return-Anweisung in einer Funktion direkt den Rückgabewert einer anderen Funktion als die Daten, die an den aufrufenden Code gesendet werden sollen. Wenn im obigen Beispiel die Funktion A die Funktion B direkt mit der return-Anweisung aufruft, wurde ein Tail-Aufruf gebildet. Innerhalb des Aufrufstapels erhält Funktion B anstelle eines Stapelrahmens für die beiden Funktionen A und B die Rücksprungadresse von Funktion A, und der Stapelrahmen von Funktion A wird abgelegt und entsorgt, was bedeutet, dass Funktion B seinen Rücksprungwert direkt zurückgibt Dies erhöht die Geschwindigkeit der Funktionsaufrufe und trägt dazu bei, die Informationsmenge im Stapel gering zu halten.

Die Eigenschaften eines Tail-Aufrufs können sie zu einer sehr attraktiven Option für rekursive Funktionen machen. Eine rekursive Funktion ruft sich wiederholt auf, um einen Wert zu berechnen, wie dies beim Durchlaufen einer Listendatenstruktur der Fall sein kann. Für die verschachtelten Funktionsaufrufe werden keine zusätzlichen Stack-Frames erstellt, sodass sehr tiefe Rekursionsebenen sicher ausgeführt werden können, ohne dass die unmittelbare Gefahr eines Stack-Überlaufs und eines möglichen Programmabbruchs besteht.

ANDERE SPRACHEN

War dieser Artikel hilfreich? Danke für die Rückmeldung Danke für die Rückmeldung

Wie können wir helfen? Wie können wir helfen?