鱼 4.0:忒修斯之鱼

主要观点:两年前,维护者 @ridiculousfish 开启了最受欢迎的 pull 请求 [#9512 - Rewrite it in Rust],将 fish-shell 从 C++重写为 Rust,现已发布包含 0% C++和近 100%纯 Rust 的 fish 4.0 测试版,回顾此过程中的经验与教训。
关键信息

  • C++存在工具和编译器差异、人体工程学及安全性问题、社区参与度低等痛点,如 C++标准升级困难、线程安全问题、字符串处理繁琐等,而 curses 库使用不便。
  • Rust 很酷且有趣,工具优秀,安装便捷,人体工程学好,添加依赖方便,Send 和 Sync 特性利于实现多线程执行。
  • 平台支持方面,主流平台均受支持,Windows 原生端口不是切换到 Rust 的原因,Cygwin 目前支持不足。
  • 移植过程采用 autocxx 生成 C++和 Rust 代码的绑定,分组件逐步迁移,遇到诸多问题如 autocxx 对某些 C++结构理解困难等。
  • 移植过程历经约 14 个月,7 人为主完成大部分工作,后期因测试、准备可见成果等原因延迟。
  • Rust 在可移植性方面存在不足,如手动枚举系统、与 libc 配合不够完美等,还存在本地化问题及一些失误和摩擦。
  • 移植带来的好处有不再使用 curses 避免相关问题、创建可自安装的 fish 包、可在无 root 权限的服务器上运行等。
  • 移植未成功移除 CMake,因 cargo 在安装方面较简单化,目前仍保留简化后的 CMake 用于一些任务,且失去对 Cygwin 的支持。
    重要细节
  • 初始 PR 于 2023 年 1 月 28 日开启,2 月 19 日合并,fish 3.7.0 在 2024 年 1 月发布,最后 C++代码于 2024 年 1 月移除,首个测试版于 2024 年 12 月 17 日发布。
  • 代码迁移过程中遇到各种问题,如调整所有权规则、修补 autocxx 以去除使用 unsafe 的要求等,导致移植期间性能下降但大部分已恢复甚至超越 C++版本。
  • Rust 代码仍有一些 C 风格的部分,如直接使用 C API 和传递文件描述符,仍使用 UTF-32 字符串等。
  • 移植过程中完成了大量文件更改、提交次数众多、解决众多问题,beta 版性能良好,内存使用有改善。
阅读 11
0 条评论