1

Ich habe etwas Code kompiliert von Ocaml nach Javascript mit js_of_ocaml. Jetzt, als ich diesen Code in einen Web-Worker-Thread verschoben habe, habe ich angefangen, StackOverflow s zu bekommen.Warum verhindert `enable-javascript-harmony` StackOverflows in Web Workers?

Wenn ich jedoch den Code auf dem Hauptthread ausführen, oder wenn ich aktivierenchrome://flags/#enable-javascript-harmony in der Worker-Version der Code läuft gut!

Irgendeine Idee von was könnte los sein? Was macht das enable-harmony Flag genau?

Ich vermute, dass es Tail-Call-Optimierung aktivieren könnte, aber es scheint mir seltsam, dass es nicht bereits aktiviert ist. Außerdem erklärt Tail Call allein nicht, warum der Code nicht überläuft, wenn er im Hauptthread ausgeführt wird.

Siehe die folgenden Links für ein Beispiel des tatsächlichen Codes. In dem ersten Link, wird der Code in dem Haupt-Thread, in den zweiten, der Hauptteil des Codes zu einem Arbeiter delegiert wird:

Wenn wir die Reichweite erste Induktion auf dem optimize_0plus_sound Lemma, ein Stapelüberlauf wird in der Worker-Version passieren; Die Version mit Coq, die im Hauptthread läuft, hat überhaupt kein Problem. Seltsam.

Danke!

Antwort

1

Es ist in der Tat Tail Call Elimination. Das ist eine ES6-Funktion und in V8 immer noch etwas experimentell, so dass es momentan nur von der Flagge aktiviert wird.

Meine Vermutung ist, dass Sie nur die Auswirkungen auf Arbeiter sehen, weil Sie Chrome nach dem Ändern der Flagge nicht neu gestartet haben?

+0

Danke für die Bestätigung Andreas! Allerdings verwende ich einen anderen Satz von Browsern, und das Verhalten zwischen der Arbeiter- und Nicht-Arbeiter-Version scheint sich tatsächlich zu unterscheiden, ich weiß nicht warum; aber ich muss detailliertere Tests durchführen. – ejgallego

+0

Also bestätige ich das unterschiedliche Verhalten zwischen dem Worker und dem Hauptthread, Frage aktualisiert. – ejgallego