Frage

Nach dieser Antwort

https://stackoverflow.com/questions/551950/what -stackless-Programmiersprachen-sind-available / 671296 # 671296

alle diese Programmiersprachen sind stackless

  • Stackless Python
  • PyPy
  • Lisp
  • Schema
  • Tcl
  • Lua
  • Parrot VM

Was bedeutet es wirklich für sie stackless zu sein? Bedeutet es, sie nicht über einen Call-Stack benutzen? Wenn sie keinen Call-Stack verwenden, was tun sie?

War es hilfreich?

Lösung

  

Was bedeutet es wirklich für sie stackless zu sein? Bedeutet es, sie nicht über einen Call-Stack benutzen?

Ja, das ist richtig.

  

Wenn sie keinen Call-Stack verwenden, was tun sie?

Die genaue Umsetzung wird natürlich variiert von Sprache zu Sprache. In Stackless Python gibt es einen Dispatcher, der den Python-Interpreter mit der obersten Rahmen und dessen Ergebnisse beginnt. Der Interpreter verarbeitet Opcodes nach Bedarf einer nach dem anderen, bis er einen CALL_FUNCTION Opcode erreicht, das Signal, das Sie sind dabei in eine Funktion aufzurufen. Dies bewirkt, dass der Dispatcher einen neuen Rahmen mit den relevanten Informationen zu erstellen und mit den Umwandlungs-Fehlerkennzeichen an den Dispatcher zurückzukehren. Von dort beginnt die Dispatcher neu und zeigt den Interpreter auf dem obersten Rahmen.

Stackless Sprachen eschew Call-Stacks für eine Reihe von Gründen, aber in vielen Fällen wird es verwendet, so dass bestimmte Programmierkonstrukte viel leichter zu implementieren. Die kanonische ist Fortsetzungen . Fortsetzungen sind sehr leistungsfähig, sehr einfache Kontrollstrukturen, die Sie alle üblichen Kontrollstrukturen sind wahrscheinlich bereits vertraut mit (while, do, if, switch, etc.) darstellen kann.

Wenn das verwirrend, können Sie Ihren Kopf um Wikipedia-Artikel versuchen wollen Verpackung, insbesondere auf die cutesy Fortsetzung Sandwich Analogie :

  

Sagen Sie bitte in der Küche vor dem Kühlschrank sind, darüber nachzudenken, ein Sandwich. Sie nehmen eine Fortsetzung genau dort und halten Sie es in Ihrer Tasche. Dann erhalten Sie etwas Truthahn und Brot aus dem Kühlschrank und machen Sie sich ein Sandwich, das jetzt auf der Theke sitzt. Sie berufen sich auf die Fortsetzung in der Tasche, und Sie finden sich wieder vor dem Kühlschrank stehen, um ein Sandwich zu denken. Aber zum Glück gibt es ein Sandwich auf der Theke, und alle Materialien verwendet, um sie weg sind zu machen. So essen Sie es.

Andere Tipps

Sie haben nicht einen Call-Stack verwenden, weil sie href="http://en.wikipedia.org/wiki/Continuation-passing_style" rel="noreferrer"> Stil Fortgang in . Wenn Sie nicht vertraut mit Endaufruf Optimierung sind, das ist wahrscheinlich ein guter erster Schritt zu verstehen, was das bedeutet.

den traditionellen Anruf zu emulieren / Rückkehr zu diesem Modell, sondern eine Rücksendeadresse des Drückens und erwartet den Rest des Rahmens zu bleiben unberührt die Anrufer über den Rest seines Codes schließen und alle Variablen, die noch benötigt werden (der Rest sind befreit). Es führt dann einen Schwanz Aufruf an den Angerufenen, diese Fortsetzung als Argument übergeben. Wenn der Angerufene „zurückgibt“, tut sie dies durch diese Fortsetzung Aufruf, vorbei an der Rückgabewert als Argument zu.

Was die oben geht, ist es nur eine komplizierte Art und Weise Funktionsaufrufe zu tun. Es ist jedoch verallgemeinert sehr schön zu komplexeren Szenarien:

  1. Ausnahme / finally / etc Blöcke sind sehr leicht modellieren - wenn Sie eine „return“ Fortsetzung als Argument übergeben können, können Sie passieren 2 (oder mehr) ebenso leicht. Lisp-y „Zustand Handler“ Blöcke (das kann oder nicht die Kontrolle an den Aufrufer zurück) sind auch leicht -. eine Fortsetzung für den Rest dieser Funktion übergeben, die nicht genannt werden könnte oder
  2. Mehrere Rückgabewerte ähnlich leicht gemacht werden -. Mehrere Argumente für die Fortsetzung übergeben
  3. Zurück Provisorien / Kopieren nicht mehr anders, als Funktionsargument Passing. Dies macht es oft einfacher zu Provisorien zu beseitigen.
  4. Endrekursion Optimierung ist trivial - der Anrufer geht einfach auf die „Rückkehr“ Fortsetzung es eher erhalten, als eine neue Erfassung
  5. .
scroll top