Frage

Funktionsaufrufe werden über eine Stapeldatenstruktur behandelt. Ist das genug für die Unterstützung der Rekursion?

War es hilfreich?

Lösung

Überhaupt den Stapel haben ist Die Sonderbehandlung, die der Compiler bei der Unterstützung der Rekursion haben muss.

In älteren Programmiersprachen wie frühen Versionen von FORTRAN hatte die Laufzeitumgebung keinen Funktionsstapel und jede Funktion hatte genau einen Aktivierungsdatensatz, der irgendwo im Speicher für sie reserviert war. Das bedeutete, dass die Rekursion überhaupt nicht möglich war, denn wenn Sie rekursiv eine Funktion genannt werden, überschreiben Sie ihren einzigen Aktivierungsaufzeichnungen und verlieren den Kontext der Art und Weise, wie Sie dort angekommen sind.

Die Einführung des Funktionsstapels ermöglichte es zuerst, die Rekursion tatsächlich in einer Programmiersprache zum Ausdruck zu bringen. Zuvor würden Programmierer Rekursion als Werkzeug zur abstrakten Lösung eines Problems verwenden, müssten diesen Code jedoch aufgrund des Fehlens eines Anrufstapels in iterative Logik übersetzen.

Damit eine Programmiersprache die Rekursion unterstützt, muss sie über einen Mechanismus verfügen, um den Anrufstack dynamisch aufrechtzuerhalten. Dies muss nicht durch einen expliziten Stapel sein. Sie könnten theoretisch alle Stack-Frames dynamisch allzugeben und sie als verknüpfte Liste zusammenketten. Dies kann beispielsweise nützlich sein, wenn Sie Coroutinen oder Schließungen unterstützen möchten und nach Rückgabe der Funktion tatsächlich an alten Aktivierungsdatensätzen festhalten müssen, damit die Daten später gespeichert werden können.

Hoffe das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top