Ich habe einen rekursiven Pfadfindungsalgorithmus, den ich in JavaScript implementiert habe, und möchte wissen, ob (alle?) Browser möglicherweise Ausnahmen für Stapelüberläufe erhalten.
91
Ich habe einen rekursiven Pfadfindungsalgorithmus, den ich in JavaScript implementiert habe, und möchte wissen, ob (alle?) Browser möglicherweise Ausnahmen für Stapelüberläufe erhalten.
only
Optimierung ist. Die Unterstützung sollte Teil der Sprachspezifikation sein, nicht des Compilers / Interpreters, da Code, der gegen einen Interpreter / Compiler mit TCO geschrieben wurde, auf einem Interpreter / Compiler ohne TCO wahrscheinlich nicht funktionieren würde.Antworten:
Die ECMAScript 4-Spezifikation sollte ursprünglich die TCO unterstützen, wurde jedoch gestrichen:
Keine Tail Calls mehr in JavaScript?
Soweit ich weiß, führen derzeit keine allgemein verfügbaren Implementierungen von JavaScript automatische Gesamtbetriebskosten durch. Dies kann Ihnen jedoch von Nutzen sein:
Tail Call-Optimierung
Im Wesentlichen wird durch Verwendung des Akkumulatormusters der gleiche Effekt erzielt.
quelle
Momentan keine Freude, aber dankenswerterweise sind für Harmony (ECMAScript Version 6) die richtigen Tail Calls geplant. Http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
quelle
So ziemlich jeder Browser, dem Sie begegnen, wird "zu viel Rekursion" anzeigen. Hier ist ein Eintrag im V8-Bug-Tracker , der wahrscheinlich interessant zu lesen sein wird.
Wenn es sich um eine einfache Selbstrekursion handelt, lohnt es sich wahrscheinlich, eine explizite Iteration zu verwenden, anstatt auf die Beseitigung von Tail-Calls zu hoffen.
quelle
Die Tail Call-Optimierung wird zukünftig im strengen ECMAScript 6-Modus unterstützt. Weitere Informationen finden Sie unter http://www.2ality.com/2015/06/tail-call-optimization.html .
Unter http://kangax.github.io/compat-table/es6/ finden Sie aktuelle Motorunterstützung.
Derzeit (18-07-2019) unterstützen die folgenden Engines die Tail Call-Optimierung:
Unterstützung, wenn das Flag "Experimentelle JavaScript-Funktionen" aktiviert ist:
Chrome 54 / Opera 41 Dieaktuelle Version der kompatiblen Tabelle listet sie nicht mehr aufquelle
Die Tail Call-Optimierung ist jetzt in LispyScript verfügbar , das in JavaScript kompiliert wird. Sie können mehr darüber lesen Sie hier .
quelle
Derzeit erkennen keine JavaScript-Implementierungen die Schwanzrekursion. In ECMAScript 6 werden Änderungen vorgenommen , und wie andere bereits gesagt haben, gibt es für V8 ein offenes Ticket .
Hier sehen Sie den von V8 generierten Assembler für eine Schwanzrekursionsfunktion:
Beispiel dafür, wie V8 die Rekursion kompiliert
Vergleichen Sie das damit, wie Clang dieselbe Funktion in C kompiliert hat
Beispiel für eine C-Compiler-Schwanzrekursion
V8 behält den rekursiven Aufruf bei, während der C-Compiler die Endrekursion erkannt und in eine Schleife geändert hat.
quelle