【问题标题】:Why does `enable-javascript-harmony` prevent StackOverflows in Web Workers?为什么 `enable-javascript-harmony` 会阻止 Web Worker 中的 Stack Overflow?
【发布时间】:2016-07-08 17:28:59
【问题描述】:

我有一些使用 js_of_ocaml 从 Ocaml 编译为 Javascript 的代码。现在,当将该代码移动到 Web Worker 线程中时,我开始收到StackOverflows。

但是,当我在主线程上运行代码时,或者如果我在 worker 版本中启用 chrome://flags/#enable-javascript-harmony,代码运行良好!

知道会发生什么吗? enable-harmony 标志到底在做什么?

我认为它可以启用尾调用优化,但对我来说似乎很奇怪,它尚未启用。此外,单独的尾调用并不能解释为什么代码在主线程中运行时不会溢出。

有关实际代码的示例,请参见下面的链接。在第一个链接中,代码在主线程中运行,在第二个链接中,代码的主要部分委托给了一个worker:

当我们到达optimize_0plus_sound 引理的第一个归纳时,worker 版本中会发生堆栈溢出; Coq 在主线程中运行的版本完全没有问题。很奇怪。

谢谢!

【问题讨论】:

    标签: javascript google-chrome ecmascript-6 web-worker ecmascript-harmony


    【解决方案1】:

    确实是尾调用消除。这是 ES6 的一个特性,在 V8 中仍然是实验性的,所以目前只能通过标志启用。

    我的猜测是,您只是看到了对工作人员的影响,因为您在更改标志后没有重新启动 Chrome?

    【讨论】:

    • 感谢安德烈亚斯的确认!但是,我确实使用了一组不同的浏览器,并且工作版本和非工作版本之间的行为确实似乎有所不同,我不知道为什么;但我需要进行更详细的测试。
    • 所以我确实确认了工作线程和主线程之间的不同行为,问题已更新。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2021-05-23
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多