我用 Rust 制作解释器的经验

主要观点:作者去年决定学习 Rust,先读了《Rust 官方书籍》感觉不够,后读《Crafting Interpreters》,决定用 Rust 实现 Lox 语言的虚拟机,过程中遇到诸多挑战,包括安全代码与性能的平衡、垃圾回收器的实现、哈希表性能优化等,最终 Rust 实现接近但未完全达到 C 实现的速度,同时作者享受了用 Rust 编程的过程并对 Rust 社区给予好评。
关键信息

  • 读《Crafting Interpreters》后决定用 Rust 实现 Lox 虚拟机。
  • 坚持使用纯安全代码,利用 Rust 标准库和高级类型系统。
  • 实现安全 Rust 中的垃圾回收器很困难,最终设计简单但有缺点。
  • 性能优化过程中,更换哈希算法、重写 GC、使用原始指针等提高了性能。
  • 动态调度会增加成本,改用enum提高了追踪速度。
  • 还有一些小的不安全优化使代码更快但更危险。
    重要细节
  • 《Crafting Interpreters》分两部分,用 Java 和 C 实现解释器,作者用 Clojure 实现第一部分后用 Rust 实现第二部分。
  • 实现安全 Rust 垃圾回收器时,最初想法是用引用计数,后意识到需用 GC,借鉴相关思路设计简单 GC。
  • 性能优化中,更换哈希算法从 SipHash 到 aHash 再到 fxhash 取得不同程度提升,还模仿 clox 写自己的哈希表实现。
  • 动态调度用 trait 对象成本高,改用enum提高追踪速度,还考虑用结构体继承等方法进一步优化。
  • 小的不安全优化如模仿 clox 的栈和程序计数器实现提高了性能,但代码更危险。
阅读 11
0 条评论