【问题标题】:implement infinite lists in v8在 v8 中实现无限列表
【发布时间】:2020-01-27 15:13:58
【问题描述】:

我是一名计算机科学专业的学生,​​作为学校项目的一部分,我被要求在 v8 引擎中找到漏洞,进行一些非常好的优化或添加新功能。

我选择添加一个新功能,这里是:

function* numbers() {
  i = 1;
  while (true) {
    yield i++;
  }
}

var gen = numbers();

var l = [...gen];

var n = l[42];

用一句话来说,我希望有可能使用解构语法来创建一个可以容纳无限数量的对象并访问它们的列表。

在 Haskell 中可以做到这一点,我想尝试用 JavaScript 做同样的事情。

如果 v8 的开发人员可以为我指明正确的方向,那就太好了。

我已经有了工作环境,可以编译引擎,读取源码,​​在带符号的d8二进制文件上运行调试器。

【问题讨论】:

  • 不是开发人员,但我有几点可能值得一提。 1. 解构语法,我假设您的意思是扩展语法。 2. 你如何决定这不想成为一个直接数组,因为这对于索引查找来说比迭代更快,或者这是一个后期绑定特性?记住发电机只能去 1 个方向。 IOW:使用生成器,您可以访问元素 42,但在其消失后不能访问 41,因此如果您不存储以前的值,它们将丢失。
  • 您的“无限”仅限于 9007199254740992 而您的 i 变量是全局变量。

标签: javascript generator v8 destructuring


【解决方案1】:

V8 开发者在这里。

首先:明确一点,stackoverflow 不是一台可以帮你完成作业的机器。 (你只是要求“正确的方向”,没关系。)

其次:V8 按照规范实现 JavaScript,因此任何任意“新功能”都不会出现在我们的存储库中,请注意这一点。

第三:Keith 有几个优点。特别是,您提出的语法已经是有效的 JavaScript 并且急切地评估生成器。如果生成器产生无限的值流,你的想法是切换到惰性求值吗?退后一步,思考一下这个想法的含义。

最后,如果你想出可行的语法/语义,那么在 V8 中做这件事仍然是一大块工作,因为没有类似的先例。您可能想要使用元素拦截器,并将生成器存储在私有属性中。我认为使用代理在纯 JavaScript 中填充整个东西会容易得多。

(重新考虑您选择的项目可能是个好主意,但这取决于您。这也是一个非常时髦的项目描述......他们认为“找到一个漏洞利用或做一些非常好的优化”?如果你发现了一个漏洞,请let us know!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2017-09-06
    • 2019-07-06
    • 2017-04-16
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多