Frage

Die Leute sagen, dass die clojure Umsetzung ausgezeichnet ist abgesehen von der Begrenzung keine Endaufruf Optimierung mit - einer Begrenzung der Jvm nicht die clojure Umsetzung.

http://lambda-the-ultimate.org/node/2547

Es ist gesagt worden, dass TCO in Python implementieren würde opfern

  • Stack-Trace-Dumps, und
  • Debuggen Regelmäßigkeit.

Erklären sie mir, was die große Sache mit Schwanz Call-Optimierung und warum Python braucht es

Würden die gleichen Opfer haben für eine Jvm Implementierung von TCO gemacht werden? Würde alles andere geopfert werden müssen?

War es hilfreich?

Lösung

Während andere (in, dass die il Anweisungen gab es schon) es ist erwähnenswert, den zusätzlichen Aufwand der .Net 64-Bit-JIT-Team durch gehen mußte, um alle Endaufruf zu respektieren.

Ich rufe insbesondere den Kommentar:

  

Die Kehrseite ist natürlich, dass, wenn Sie debuggen müssen oder optimierten Code Profil hergestellt werden, mit Call-Stacks zu beschäftigen, die aussehen wie sie ein paar Frames sind vermisst.

Ich würde denken, dass es sehr unwahrscheinlich, dass der JVM dies entweder vermeiden könnte.

Da in Fällen, in denen eine Endrekursion Optimierung angefordert wurde, sollte der JIT davon ausgehen, dass es erforderlich einen Stapelüberlauf zu vermeiden, dies nicht etwas ist, das nur in Debug off baut geschaltet werden kann. Sie sind nicht viel für das Debuggen, wenn sie abstürzen, bevor Sie auf den interessanten Teil zu bekommen. Die ‚Optimierung‘ ist in der Tat ist ein fester Bestandteil und ein Thema für die Stack-Traces davon betroffen.

Es ist darauf hinzuweisen, dass jede Optimierung, die einen echten Stapelrahmen vermeidet erstellen, wenn eine Operation zu tun, das der Programmierer konzeptionell beschreibt / versteht als ein Stapel Betrieb ist (eine Funktion zum Beispiel Aufruf) wird von Natur aus einer Trennung zwischen verursachen Dargestellten den Benutzer beim Debuggen / Bereitstellung des Stack-Trace und Wirklichkeit.
Dies ist unvermeidbar, da der Code, der die Operation beschreibt, wird weiter und weiter getrennt von der Mechanik der Zustandsmaschine der Operation durchgeführt wird.

Andere Tipps

Die Arbeit ist im Gange jetzt tail hinzufügen, um die JVM aufruft. Es gibt eine Wikiseite über einige Details reden.

Ja, es ist in der Regel der Fall, dass TCO Umsetzung werden Sie verhindert, dass vollen Stack-Traces zu bekommen. Dies ist unvermeidlich, weil der ganze Sinn der TCO ist zusätzlichen Stack-Frames zu vermeiden, zu schaffen.

Es ist auch interessant wert zu beachten, dass Clojure ein nicht-Stapel raubend „wiederholen“ -Funktion um diese Einschränkung zu aktuellen JVM-Versionen erhalten hat.

Beispiel:

(defn triangle [n accumulator] 
  (if 
    (<= n 0)  
      accumulator
      (recur (dec n) (+ n accumulator))))

(triangle 1000000 0)

=> 500000500000     (note stack does not explode here!)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top