简介
我们正处在 JavaScript 的第三个时代,目前的普遍趋势是出于性能提升方面的考虑,使用 Rust 或 Go 开发 JavaScript 工具。
然而,开发 JavaScript 工具极具挑战性,更不用说在 Rust 中编写它们了。在学习这些技术时我遇到了很多困难,我希望以后能有更少的人经历同样的痛苦。
我想通过编写这份指南来为社区贡献自己的力量,这样你就不必像我一样经历同样的旅程。
Rust 方面的开发人员只有少数,我希望能见到你并加入我们,这样我们就能为所有人开发出更好更快的工具。
概览
本指南将采用标准编译器前端阶段
Source Text --> Lexer --> Token --> Parser --> AST
编写 JavaScript 解析器相当容易,其中 10% 是架构决策,90% 是细致入微的艰苦工作。
架构决策主要会影响两个方面
- 我们解析器的性能
- 消费我们的 AST 的顺畅程度
在 Rust 中构建解析器之前了解所有选项和权衡利弊,将使我们的整个旅程更加顺畅。
性能
执行 Rust 程序的关键在于减少内存分配和减少 CPU 周期。
从堆分配的对象中查找Vec
、Box
或String
等,可以非常清楚地看出内存分配的位置。了解它们的用法将帮助我们认识到程序的速度——分配越多,程序运行越慢。
Rust 提供了零成本抽象能力,因此无需过分担心抽象会导致性能下降。小心算法复杂度,所有问题都会迎刃而解。
信息
您还应该阅读Rust 性能手册。
Rust 源代码
每当函数调用的性能无法推断时,都不要害怕在 Rust 文档中单击“源代码”按钮并阅读源代码,它们在大多数情况下很容易理解。
信息
在浏览 Rust 源代码时,只需查找fn function_name
、struct struct_name
、enum enum_name
等即可轻松搜索定义。这是 Rust 中语法固定的优势之一(与 JavaScript 相比 😉)。