In einem sehr interessanten post aus dem Jahr 2001 erklärt Allen Wirfs-Brock, wie Blockverschlüsse implementiert werden können, ohne den (nativen) Stack zu vereinheitlichen.Warum ist eine bestimmte Blockabschlussoptimierung gut und gültig?
Aus den vielen Ideen, die er herausstellt, gibt es eine, die ich nicht ganz verstehe und ich dachte, es wäre eine gute Idee, sie hier zu stellen. Er sagt:
Jede Variable, die während der Lebensdauer eines Blocks niemals zugewiesen werden kann (z. B. Argumente umschließender Methoden und Blöcke), muss nicht in der Umgebung platziert werden, wenn stattdessen eine Kopie der Variablen in den Abschluss platziert wird wenn sie erstellt wird
es gibt zwei Dinge, die ich nicht sicher bin ich gut genug, um zu verstehen:
- Warum in die Umgebung mit zwei Kopien des nur-Lese-Variable ist schneller als bewegt, um die Variable zu haben? Liegt es daran, dass der umschließende Kontext schneller auf die (ursprüngliche) Variable im Stack zugreifen würde?
- Wie können wir sicherstellen, dass die beiden Variablen synchronisiert bleiben?
In Frage 1 muss es einen anderen Grund geben. Ansonsten sehe ich den Gewinn nicht (im Vergleich zu den Kosten für die Implementierung der Optimierung).
Für Frage 2 nehmen Sie ein Nicht-Argument, das in der Methode und nicht im Block zugewiesen ist. Warum würde der im Stapel gespeicherte OOP während der Lebensdauer des Blocks unverändert bleiben?
Ich glaube, ich kenne die Antwort auf Q2: Weil die Ausführung des Blocks nicht mit der Ausführung der Methode verflochten werden kann, d. H. Während der Block lebt, wird der umschließende Kontext nicht ausgeführt. Aber gibt es keine Möglichkeit, den Stack vorübergehend zu modifizieren, während der Block lebt?
Interessanterweise klagte bera nur über Schließung blogged, es scheint, dass Sie den gleichen Fokus teilen https://clementbera.wordpress.com/2015/01/21/context-and-blockschloss-implementation/ –
Danke für den Link. Es ist eine sehr klare Darstellung. (Es gibt einen Tippfehler in der Auswahl, sollte aber ZooKeeper >> ** free ** AllAnimals gelesen haben ;-) –