介绍
我们正处于 JavaScript 的第三次时代,当前的普遍趋势是使用 Rust 或 Go 来编写 JavaScript 工具,以获得性能提升。
但编写 JavaScript 工具本身已颇具挑战性,更不用说用 Rust 来实现。我在学习这些技术时遇到了许多困难,希望有更少的人需要经历我曾经走过的艰辛之路。
我希望通过撰写本指南为社区贡献一份力量,让你们不必重走我曾走过的弯路。
目前在 Rust 社区中开发者数量还很少,我希望你能加入我们,与我们一起构建更好的、更快的工具,让每个人都能享受。
概述
在本指南中,将采用标准编译器前端阶段:
源代码文本 --> 词法分析器 --> 标记 --> 解析器 --> 抽象语法树 (AST)编写一个 JavaScript 解析器其实相当容易,其中 10% 是架构决策,90% 是对细节的艰苦工作。
这些架构决策主要影响两个方面:
- 我们解析器的性能
- 我们的抽象语法树(AST)有多易用
在用 Rust 构建解析器之前了解所有选项和权衡,将使我们的整个旅程更加顺畅。
性能
高性能 Rust 程序的关键在于 减少内存分配 和 减少 CPU 周期使用。
通过查看堆上分配的对象(如 Vec、Box 或 String),通常可以清晰地识别出内存分配的位置。合理评估这些分配的使用情况,就能大致判断程序的运行速度——分配越多,程序越慢。
Rust 提供了零成本抽象的能力,我们无需过度担心抽象会导致性能下降。只要注意算法复杂度,就基本没有问题。
INFO
你也应该阅读 《Rust 性能手册》。
Rust 源码
当无法推断某个函数调用的性能时,请不要害怕点击 Rust 文档中的“源码”按钮并阅读源码,大多数情况下它们都很容易理解。
INFO
在浏览 Rust 源码时,查找定义的方法就是寻找 fn 函数名、struct 结构体名、enum 枚举名 等。 这是 Rust 具有恒定语法规则的一个优势(相比 JavaScript 😉)。
