Ohm's Peg-to-WASM Compiler
2 months ago
- #WebAssembly
- #parsing
- #performance
- Ohm 是一个用于 JavaScript 和 TypeScript 的解析工具包,适用于自定义文件格式或构建语言工具。
- 版本 18 是一次完全重写,将语法编译为 WebAssembly,相比先前版本实现了超过 50 倍的速度提升和仅 10% 的内存占用。
- 先前版本采用 AST 解释和 PExpr 树,其中解析表达式通过诸如 'eval' 的方法进行评估。
- 新引擎将语法编译为 WebAssembly,避免了解释开销并内联表达式代码。
- CST 节点通过 Wasm 线性内存中的碰撞分配器管理,采用基于区域的管理方式以降低开销。
- 终端节点通过标记化的 32 位值进行优化,避免每个字符的单独分配。
- 分块绑定使用固定大小的块,通过消除数组大小调整并使回溯成本低廉来提升性能。
- 记忆化采用块稀疏表高效存储解析结果,条目打包为 i32 值。
- 参数化规则通过静态特化处理,为每个参数组合生成唯一的规则体。
- 优化的空格跳过避免在需要之前为空白字符创建 CST 节点,从而提升许多语法解析的性能。
- 额外优化包括单次使用规则内联和预分配固定结构元素的节点。
- 该版本以 beta 形式通过 npm 发布,并感谢资助者和贡献者,如 Alex Warth。