【发布时间】:2020-06-01 20:09:05
【问题描述】:
我正在编写一个从函数式语言到 JavaScript 的编译器。由于我的语言是基于表达式的,因此很自然地将其编译为 JavaScript 表达式。问题是在编译let 表达式时,我们需要能够“内联”声明和分配变量。例如:
function foo(x) {
return (let y = x * x; y);
}
显然,这段代码不起作用,因为我们不能在表达式中使用let。一种解决方案是将所有内容包装在 lambda 中:
function foo(x) {
return (()=>{let y = x*x; return y})();
}
但这在某些情况下会产生巨大的运行时成本。另一种选择是仅调整编译器以生成语句而不是表达式,但这将是一个重要的更改,如果可能的话我宁愿避免它。
有什么方法可以将局部变量作为表达式而不是没有额外运行时成本的语句声明和分配给 JavaScript?
【问题讨论】:
-
真正的 lambda 版本是
return (y => y)(x * x);这可能也更容易后处理以简化。 -
为什么不只是
function foo (x) { return x*x } -
这是一个很好的选择,但遗憾的是,它也有很大的运行时成本,特别是在非常数字的代码中。我不确定为什么 JS 运行时不能优化它,因为它只是一个内联步骤,但事实就是这样。
-
@epascarello 考虑像
pow2(x) { return (let y = pow2(x-1); x === 0 ? 1 : y + y); }这样的函数。如果我们按照您的建议删除let,我将成为pow2(x) { return x === 0 ? 1 : pow2(x-1) + pow2(x-1); }。注意第一个函数是O(n),第二个函数是O(2^n)。在某些情况下,这样做可能会导致指数级减速。
标签: javascript