编译器编译器:一个关于 JavaScript 引擎开发的 Twitch 直播系列

上周,我完成了一个名为“编译器编译器”的新 twitch 直播 的三集试播,该直播探讨了 JavaScript 规范,即 ECMA-262,是如何在 SpiderMonkey 中实现的。

JavaScript …… 是一种编程语言。有些人喜欢它,有些人不喜欢。JavaScript 可能有点乱,但很容易上手。它是教会我如何编程并让我接触到更广泛的编程语言世界的编程语言。因此,它在我心中有着特殊的地位。当我自学的时候,我意识到其他人可能也面临着与我相同的许多困难。而这正是“编译器编译器”所要探讨的内容。

该直播中的第一个 bug 是围绕递增/递减的测试失败。如果你想了解目前为止的系列内容,试播集已经发布,你可以在 播放列表 中观看。

未来剧集将 在此安排,并提供描述,方便你查找你感兴趣的特定主题。敬请关注本博客发布的帖子,我们将逐一总结每个 bug 的修复过程。

什么是 SpiderMonkey?

SpiderMonkey 是 Firefox 的 JavaScript 引擎。它与 V8JSC 等其他实现一起,让 JavaScript 运行起来。由于引擎涉及大量的底层知识,因此为引擎贡献代码可能令人望而生畏。

  • 编译器已经过充分研究,但用于学习编译器的现有资料(如 《龙书》 和其他编译器书籍)通常面向大学设置学习,需要大量的专用时间来理解和练习。并非所有人都能获得这种专用时间。
  • SpiderMonkey 使用 C++ 编写。如果你来自解释型语言,需要学习一些工具才能真正掌握它。
  • 它是 ECMA-262 标准 的实现,该标准定义了 JavaScript。如果你从未阅读过编程语言语法或标准文本,阅读起来可能会很困难。

“编译器编译器”直播旨在让贡献变得更容易。如果你不确定如何开始,它就是为你准备的!

目标和结构

我为这个系列设定了两个目标。第一个也是最重要的目标是通过 SpiderMonkey 向人们介绍语言规范和实现的世界。第二个目标是让 SpiderMonkey 尽可能地符合 ECMA-262 规范,幸运的是,这为第一个目标提供了一个很好的框架。

我将直播组织成一系列包含重复元素的片段,每个片段大约包含 5 集。每个片段将从 ECMA-262 符合性测试套件 (Test262) 中的某个在 SpiderMonkey 上失败的测试开始。我们将花一些时间来理解失败的测试告诉我们关于语言和 SpiderMonkey 实现的信息。然后我们将阅读和理解 ECMA-262 文本中指定的行为。我们将逐步在引擎中实现修复程序,并探索出现的任何其他问题。

每个片段中的每集时长为 1 小时,之后是 30 分钟的自由聊天。如果你有任何问题,请随时提出。我将尝试提前发布资料,以便你在直播前阅读。

如果你错过了系列的某部分,你可以在任何片段的开头加入。如果你观看了之前的片段,新的片段将为你揭示规范中的新部分,重复的元素将更容易让你学习。在每个完成的片段之后,将发布一篇博文总结直播中的信息。

 

最后但并非最不重要的是,感谢大家

 

我很幸运能有来自 SpiderMonkey 团队和 TC39 的同事加入聊天。感谢 Iain IrelandJason OrendorffGus Caplan 加入直播并为观众解答问题。感谢 Jan de Mooij 和 André Bargull 的审阅和评论。也要特别感谢 Sandra Persing、Rainer Cvillink、Val GrimmMelissa Thermidor 在制作和启动直播方面提供的支持,以及感谢 Mike Conley 提供的直播技巧。

关于 Yulia Startsev

更多 Yulia Startsev 的文章……


13 条评论

  1. Anand

    很棒的博客

    2020 年 6 月 25 日 下午 10:59

  2. Triandi Sihombing

    是否有更实用的应用场景

    2020 年 6 月 25 日 下午 8:21

  3. Aaron Wright

    没有评论吗?这对我来说很疯狂。我之前只是用过编程语言,而这个就像是对 JavaScript 的“制造过程”。谢谢

    2020 年 6 月 26 日 下午 6:32

  4. paulo

    为什么用 C++ 而不是 Rust?Mozilla 创建了 Rust 以使其更安全更快。为什么不用 C++ 呢?

    2020 年 6 月 27 日 上午 7:15

    1. Yulia Startsev

      项目重写很棘手。它们需要数年时间,并且对最终用户的好处有限。在重写期间,我们通常无法开发新功能(JS 开发人员非常期待这些功能),因为我们需要重新实现旧功能。即使我们实现了某些新功能,也可能需要在两个引擎中进行实现,这意味着工作速度会慢得多。它可能导致代码库的性能或正确性低于之前的代码库。因此,我们需要仔细权衡利弊。目前,我们使用当前代码库获得了非常高的性能,因此进行如此巨大的投资毫无意义。也就是说,在某些情况下,重写成 rust 是有意义的,例如新前端。

      2020 年 6 月 29 日 上午 2:42

  5. Samuel

    非常好。

    2020 年 6 月 27 日 下午 10:54

  6. Mark

    我很喜欢观看这些视频。我是偶然发现的。它是在 Firefox 弹出的窗口中出现的。这种视频可以分享到 Mastodon 上吗?这样也能让更多人看到?

    2020 年 6 月 29 日 上午 2:20

    1. Yulia Startsev

      感谢您的建议。我有一个 Mastodon 账号,https://mastodon.social/@ioctaptceb,我会考虑在那里发布。

      2020 年 6 月 29 日 上午 2:45

      1. Mark

        你又多了一个粉丝!不过,你似乎不太使用 Mastodon。没关系,我理解它不是每个人的菜。我很喜欢看你解决这些 bug,你真的尽力描述了你所做的事情、原因以及你如何思考解决这些问题的思路。你看起来超级紧张。我猜想你的经理是想让你稍微走出舒适区。这对世界级开发者来说非常重要。我也经常感到不舒服,而且我甚至还没有达到你的水平。

        2020 年 6 月 29 日 上午 6:51

        1. Yulia Startsev

          嗯,说句公道话,我对我的经理说我要尝试一下,他说“听起来不错”。我应该为自己的痛苦负责。不过,随着时间的推移,情况应该会好转,只需要多练习一下!

          2020 年 6 月 29 日 上午 7:01

  7. Bhavesh

    太棒了!感谢您分享您的知识。
    继续努力!

    2020 年 6 月 30 日 下午 10:08

  8. ruth

    后缀递增和前缀递增之间 *确实* 有区别
    前缀递增在使用变量之前递增它,后缀递增先使用它,然后递增
    例如

    i=1; j=++i; // 将 i 和 j 设置为 2
    i=1;j=i++; // 将 i 设置为 2,将 j 设置为 1

    2020 年 7 月 17 日 上午 5:16

    1. Yulia Startsev

      没错。在录制版本中可能没有体现出来,但这在直播的评论区中得到了体现,我说话的同时,评论区也一直在讨论这个问题。Jorendorff 和 Iain 刚说我说完我不了解区别之后就提到了这个问题。你提到的那一集是第一集,当时我正在现场思考,而且非常紧张,所以可能没有完全捕捉到这一点。不幸的是,Twitch 会下架录制好的直播,因此这种上下文信息就会消失。

      2020 年 7 月 17 日 上午 5:22

本文的评论已关闭。