我使用js_of_ocaml从Ocaml到Javascript编译了一些代码。现在,当移动该代码以在Web Worker线程中工作时,我开始得到StackOverflow
s。
但是,当我在主线程上运行代码时,或者如果我在worker版本中启用 chrome://flags/#enable-javascript-harmony
时,代码运行正常!
知道会发生什么事吗? enable-harmony
标志究竟在做什么?
我认为它可以启用尾调用优化,但对我来说似乎很奇怪它还没有启用。此外,单独尾部调用并不能解释为什么代码在主线程中运行时不会溢出。
有关实际代码的示例,请参阅以下链接。在第一个链接中,代码在主线程中运行,在第二个链接中,代码的主要部分被委托给worker:
当我们到达optimize_0plus_sound
引理的第一个归纳时,工作者版本中会发生堆栈溢出; Coq在主线程中运行的版本完全没有问题。怪异。
谢谢!
答案 0 :(得分:1)
确实是尾部呼叫消除。这是一个ES6功能,在V8中仍然有点实验性,因此它目前仅由旗帜启用。
我的猜测是,您只是看到了对工作人员的影响,因为您在更改旗帜后没有重新启动Chrome?