Skip to content

引言

我们正处于 JavaScript 的第三个时代(The Third Age):业界普遍倾向用 Rust 或 Go 编写 JS 工具以换取性能。

但撰写 JavaScript 工具本身就很难,更别提用 Rust。我在学习路上踩过很多坑, 希望后来者不必重复同样的痛苦。

我写这份指南,希望对社区有所帮助,让你少走一些弯路。

Rust 侧的开发者并不多,我很期待与你同行, 一起为大家打造更快、更好的工具。

概览

这篇指南沿用标准编译器前端各阶段:

Source Text --> Lexer --> Token --> Parser --> AST

写 JavaScript Parser 在思路上并不算难——大约 10% 是架构权衡,90% 是把细节磨平。

架构选择主要影响两类事情:

  • 解析器的性能上界
  • 消费我们 AST 的体验

在动手用 Rust 实现之前,把各种选项与取舍想清楚,会让整段旅程顺滑很多。

性能

Rust 程序要快,关键是 少分配内存少占 CPU 周期

只要去找 VecBoxString 一类堆分配对象,就能大体看出哪里在分配内存; 分配越多,通常就越慢。

Rust 的零成本抽象让我们不必过度担心「抽象变慢」, 真正要盯紧的是算法复杂度。

INFO

也推荐阅读 The Rust Performance Book

阅读 Rust 源码

当一个函数的热点行为无法通过文档一眼看出时, 别害怕在 Rust 文档里点开 「source」 直接读源码;多数时候它们足够易读。

INFO

在 Rust 源码里搜索定义非常简单:检索 fn 名称struct 名称enum 名称 等即可。 这比在 JavaScript 里「猜定义」友善得多 😉。