fish 是一款适用于 Linux、macOS 的命令行 Shell,最大特点就是方便易用、功能强大、智能并且用户友好。很多其他 Shell 需要配置才有的功能,fish 默认提供,不需要任何配置。
2023 年初,fish 作者宣布将采用 Rust 重写 Fish Shell 项目。
- 没有人真正喜欢 C++ 或 CMake,也没有摆脱旧工具链的明确途径。每年的“开发痛苦”都会加重。
- C++ 正在成为一种“遗留语言”,未来寻找贡献者将变得困难,而 Rust 拥有一个活跃且不断发展的社区。
- 用 Rust 编写将有助于 fish 继续被认为是现代和有价值的。
现在时隔将近两年,fish 4.0 最近发布了首个 beta,开发者称该版本包含 0% 的 C++ 和几乎 100% 的纯 Rust 代码。
他表示将 fish shell 的代码库从 C++ 迁移到 Rust 初步取得了成功 ,从相关数据来看这是一项巨大工程:- 文件变更数 1155 个,110247 次新增(+)、88941 次删除(-),不包括转译
- 将 57000 行 C++ 代码重写为 75000 行 Rust(外加 400 行 C)
Fish Shell 团队还表示,迁移至 Rust 的好处随着时间推移已显现出来。比如之前的 (n) curses 问题——现在已经没了,因为他们不再使用 curses。取而代之的是他们切换至使用 Rust crate 包,它很好地满足了需求,即访问 terminfo 并扩展其序列。这消除了一些尴尬的全局状态,也意味着那些从源代码构建的人不再需要确保 curses 已经“正确”安装在他们的系统上 —— 只需下载一个 crate 包并进行构建即可。开发团队还提到了一些遗憾,比如此次重写 C++ 代码未能实现的一个目标是移除 CMake。这是因为虽然 cargo 在构建方面很出色,但在安装方面却很简陋。Cargo 希望把所有东西都放在几个整洁的二进制文件中,然而这并不适用于他们的项目。Fish 有大约 1200 个.fish 脚本(961 个补全,217 个相关函数),以及大约 130 页的文档(以 html 和 man 页面形式),还有 web-config 工具和 man 页生成器(两者都是用 python 编写的)。
总的来说:
“移植并非一帆风顺,而且并非一切都按计划进行。但总体而言,进展相当顺利。
我们现在有了一个我们非常喜欢的代码库,增加了一些在 C++ 时代难以实现的功能,而且还有更多功能正在开发中。
我们还创建了一个单独的 3.7 版本,其中也包括一些很酷的东西。我们做这件事很开心。”
阅读更多
Fish Shell采用Rust重写会导致性能下降
Fish Shell计划采用Rust重写
https://fishshell.com/blog/rustport
https://github.com/fish-shell/fish-shell/pull/9512