Frage

Meine Antwort für eine aktuelle Frage zu GOTOs und Endrekursion wurde im Hinblick auf einen Call-Stack ausdrückte. Ich mache mir Sorgen, dass es nicht so allgemein war, so frage ich Sie: Wie ist der Begriff eines Endaufruf (oder gleichwertig), die in Architekturen ohne Call-Stack

?

In Fortsetzung Gang alle aufgerufenen Funktionen ersetzen die anrufende Funktion, und sind somit Endaufruf, so „Endrekursion“ scheint nicht eine sinnvolle Unterscheidung zu sein. In Messaging und ereignisbasierten Architekturen, scheint es kein Äquivalent zu sein, obwohl bitte korrigiert mich wenn ich falsch liege. Die letzteren beiden Architekturen sind interessante Fälle, wie sie mit OOP verbunden sind, eher als FP. Was ist mit anderen Architekturen? Wurden die alten Lisp-Maschinen auf Basis von Call-Stacks?

Edit: Laut „ Was zum Teufel ist: Fortsetzung Stil Passing ( CPS) “(und Alex unten) ist das Äquivalent eines Endaufruf unter Fortsetzung Gang nicht‚genannt Funktion Funktion ersetzt Aufruf‘, sondern‚Aufruf der Funktion übergibt die Fortsetzung gegeben wurde, anstatt eine neue Fortsetzung‘zu schaffen. Diese Art von Endrekursion ist nützlich, im Gegensatz zu, was ich behauptete.

Auch bin ich in Systemen nicht daran interessiert, die auf einem niedrigeren Niveau Call-Stacks verwenden, für die höhere Ebene keinen Call-Stack benötigt. Diese Einschränkung nicht auf Alex Antwort gelten, weil er über die Tatsache, das Schreiben ist, dass andere Aufruf Architekturen ( oft ist dies der richtige Begriff? ) einen Call-Stack Äquivalent haben, nicht, dass sie einen Call-Stack irgendwo unter der Haube haben. Im Falle der Weitergang ist die Struktur wie ein arborescence , aber mit Rändern In die andere Richtung. Call-Stack-Äquivalente ist von großer Bedeutung für meine Interessen.

War es hilfreich?

Lösung 2

Auf dem unwahrscheinlichen Fall, dass dieses Frage Interessen jemand anderes als ich, ich habe ein erweiterte Antwort für die andere Frage, die auch diese eine beantwortet. Hier ist der Punkt gebracht, nicht-strenge Version.

Wenn ein Rechensystem-Unter Berechnungen durchführt (das heißt eine Berechnung beginnt und Pause muß während eine andere Berechnung durchgeführt wird, weil das erste auf dem Ergebnis des zweiten abhängt), eine Abhängigkeitsbeziehung zwischen den Ausführungspunkten stellt sich natürlich. In Call-Stack-basierten Architekturen ist die Beziehung topologisch ein Pfad Graph . In CPS ist es ein Baum, in dem jeder Pfad zwischen der Wurzel und einem Knoten eine Fortsetzung ist. In Message Passing und Einfädeln, dann ist es eine Sammlung von Pfadgraphen. Synchrone Ereignisbehandlung ist grundsätzlich Message Passing. eine Unter Berechnung starten beinhaltet die Abhängigkeitsbeziehung erstreckt, mit Ausnahme eines Endrekursion, die eher ein Blatt ersetzt als es angehängt wird.

Übersetzen Schwanz zu asynchroner Ereignisbehandlung Aufruf ist komplexer, so stattdessen eine allgemeinere Version betrachten. Wenn A auf ein Ereignis auf Kanal 1 abonniert ist, B an das gleiche Ereignis auf Kanal 2 und B-Handler nur abonniert ist feuert das Ereignis auf Kanal 1 (es übersetzt das Ereignis über Kanäle), kann ein auf das Ereignis auf Kanal abonniert 2 statt B. der Zeichnung Dies ist allgemeiner, weil das Äquivalent eines Endaufruf erfordert, dass

  • A-Abonnement auf Kanal 1 abgebrochen werden, wenn A auf Kanal 2
  • abonniert
  • die Handler sind selbst Abbestellen (wenn aufgerufen, sie kündigen das Abonnement)

Jetzt für zwei Systeme, die keine Unter Berechnungen durchführen: Lambda-Kalkül (oder Termersetzungssysteme im Allgemeinen) und RPN. Für Lambda-Kalkül, ruft Schwanz etwa eine Folge von Kürzungen entspricht, in denen der Begriff Länge O (1) (siehe iterative Prozesse in SICP Abschnitt 1.2 ). Nehmen RPN, um einen Datenstapel zu verwenden und eine Stapel-Operationen (im Gegensatz zu einem Strom von Operationen im Gegensatz, die Operationen sind solche, noch verarbeitet werden), und eine Umgebung, die Symbole auf eine Folge von Operationen abbildet. Endrekursion Verfahren mit O (1) Stapelwachstum entsprechen könnte.

Andere Tipps

„Architekturen ohne Call-Stack“ typisch „simulieren“ ein auf einem bestimmten Ebene - zum Beispiel, zurück in der Zeit von IBM 360, wir verwenden, um die S-Type Linkage Convention mit Bereichen und Argumente Listen durch Konvention angegeben, register speichern, die von bestimmten Allzweckregistern.

So „Endaufruf“ kann noch Sache: Hat der Angerufene Funktion Notwendigkeit der Erhaltung notwendigen Informationen Ausführung nach der anrufenden Stelle fortzusetzen (wenn die aufgerufene Funktion beendet ist), oder weiß es dort keine Ausführung sein wird nach der anrufende Punkt, und so einfach wieder verwenden sein Anrufers "Info Ausführung wieder aufnehmen" statt?

So zum Beispiel einer Endaufruf Optimierung könnte bedeuten, nicht die Fortsetzung anhängt benötigt Ausführung fortzusetzen auf, was verknüpfte Liste wird für den Zweck verwendet werden ... die Ich mag als eine „Call-Stack-Simulation“ sehen (auf einem bestimmten Ebene, obwohl es offensichtlich eine flexiblere Anordnung IS - wollen nicht alle über meine Antwort Fortsetzung-Passing-Fans haben einen Sprung; -).

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