引言
我们正处于 JavaScript 的第三个时代(The Third Age):业界普遍倾向用 Rust 或 Go 编写 JS 工具以换取性能。
但撰写 JavaScript 工具本身就很难,更别提用 Rust。我在学习路上踩过很多坑, 希望后来者不必重复同样的痛苦。
我写这份指南,希望对社区有所帮助,让你少走一些弯路。
Rust 侧的开发者并不多,我很期待与你同行, 一起为大家打造更快、更好的工具。
概览
这篇指南沿用标准编译器前端各阶段:
Source Text --> Lexer --> Token --> Parser --> AST写 JavaScript Parser 在思路上并不算难——大约 10% 是架构权衡,90% 是把细节磨平。
架构选择主要影响两类事情:
- 解析器的性能上界
- 消费我们 AST 的体验
在动手用 Rust 实现之前,把各种选项与取舍想清楚,会让整段旅程顺滑很多。
性能
Rust 程序要快,关键是 少分配内存、少占 CPU 周期。
只要去找 Vec、Box、String 一类堆分配对象,就能大体看出哪里在分配内存; 分配越多,通常就越慢。
Rust 的零成本抽象让我们不必过度担心「抽象变慢」, 真正要盯紧的是算法复杂度。
INFO
也推荐阅读 The Rust Performance Book。
阅读 Rust 源码
当一个函数的热点行为无法通过文档一眼看出时, 别害怕在 Rust 文档里点开 「source」 直接读源码;多数时候它们足够易读。
INFO
在 Rust 源码里搜索定义非常简单:检索 fn 名称、struct 名称、enum 名称 等即可。 这比在 JavaScript 里「猜定义」友善得多 😉。