Google Apps 脚本 (GAS) 是否支持适当的尾调用或尾调用优化?

Does Google Apps Script (GAS) support proper tail calls or tail call optimization?

我想知道花时间为 Google Apps 脚本做 tail call optimization 是否值得。

所以,我了解到 Google Apps 脚本使用 JavaScript 规范的 ES2015 (ES6) 版本(ref1, ref2), running it on the V8 runtime implementation

据推测,ES2015 supports (proper) tail call optimization from the spec. But there are some indications V8 实际上并没有实现它:

此外,我了解到这里有一个重要的细微差别:

The terminology of proper tail calls (PTC) and tail call optimization (TCO) is often conflated. Here's the difference between the two:

  • proper tail calls: functions called in the tail position reuse the current stack frame, preventing the creation of additional stack frames that cause space inefficiency.
  • tail call optimization: rewrites a recursive function into an iterative one, usually by calling goto.

PTC only deals with stack manipulation, while TCO rewrites a recursive function as an iterative function.

所以,鉴于此...

是否 Google Apps 脚本 (GAS):

(此处为 V8 开发人员。)

Does Google Apps Script (GAS) support proper tail calls?

没有。 V8 不支持 PTC(也不支持 STC);您已经 了解了背景故事。由于 GAS 是建立在 V8 上执行 JS 的,所以它也不支持它们。

wondering whether investing time into doing tail call optimization for a script is worth it. / Does GAS support tail call optimization to the point where it is worth doing it, for performance, in any way?

我不确定你的意思:TCO 是编译器可能做的事情,而不是你做的事情。

如果您的意思是“将调用移动到尾部位置,以便编译器可以将它们转换为迭代”:不,V8 不会那样做,因此不值得您花时间。调用是否发生在尾部位置对性能没有影响。 (而且我不会打赌这种情况很快就会改变。)

如果您的意思是“手动将递归转换为迭代”:这对于 performance-critical 代码可能是值得的;在您的特定情况下是否值得做,只能通过尝试并衡量效果来回答。 (与往常一样,一个小的人工测试 a.k.a。“微基准测试”很可能会产生不适用于其他情况的误导性结果。)
这不需要 GAS 或 V8 的任何“支持”。