Skip to content

介绍

我们正处于 JavaScript 的第三次时代,当前的普遍趋势是使用 Rust 或 Go 来编写 JavaScript 工具,以获得性能提升。

但编写 JavaScript 工具本身已颇具挑战性,更不用说用 Rust 来实现。我在学习这些技术时遇到了许多困难,希望有更少的人需要经历我曾经走过的艰辛之路。

我希望通过撰写本指南为社区贡献一份力量,让你们不必重走我曾走过的弯路。

目前在 Rust 社区中开发者数量还很少,我希望你能加入我们,与我们一起构建更好的、更快的工具,让每个人都能享受。

概述

在本指南中,将采用标准编译器前端阶段:

源代码文本 --> 词法分析器 --> 标记 --> 解析器 --> 抽象语法树 (AST)

编写一个 JavaScript 解析器其实相当容易,其中 10% 是架构决策,90% 是对细节的艰苦工作。

这些架构决策主要影响两个方面:

  • 我们解析器的性能
  • 我们的抽象语法树(AST)有多易用

在用 Rust 构建解析器之前了解所有选项和权衡,将使我们的整个旅程更加顺畅。

性能

高性能 Rust 程序的关键在于 减少内存分配减少 CPU 周期使用

通过查看堆上分配的对象(如 VecBoxString),通常可以清晰地识别出内存分配的位置。合理评估这些分配的使用情况,就能大致判断程序的运行速度——分配越多,程序越慢。

Rust 提供了零成本抽象的能力,我们无需过度担心抽象会导致性能下降。只要注意算法复杂度,就基本没有问题。

INFO

你也应该阅读 《Rust 性能手册》

Rust 源码

当无法推断某个函数调用的性能时,请不要害怕点击 Rust 文档中的“源码”按钮并阅读源码,大多数情况下它们都很容易理解。

INFO

在浏览 Rust 源码时,查找定义的方法就是寻找 fn 函数名struct 结构体名enum 枚举名 等。 这是 Rust 具有恒定语法规则的一个优势(相比 JavaScript 😉)。