文章摘要
Collin Richards在过去六个月里将tmux从C语言移植到Rust,并完成了100%的Rust代码转换。尽管这是一个业余项目,没有特别明确的原因,但他分享了从约67,000行C代码到约81,000行Rust代码的移植过程,包括使用C2Rust工具、构建过程、遇到的bug以及如何在Rust中处理C语言模式等内容。
文章总结
文章主要内容总结
标题: 介绍 tmux-rs
作者: Collin Richards
发布日期: 2025年7月3日
项目背景
Collin Richards 在过去六个月里,将 tmux 从 C 语言移植到 Rust 语言,并完成了代码库的 100% Rust 化(尽管仍包含 unsafe 代码)。这个项目是一个业余爱好,类似于园艺,但伴随着更多的段错误(segfaults)。
移植过程
C2Rust 工具的使用
作者首先尝试使用 C2Rust 工具将 C 代码转换为 Rust 代码。虽然生成的代码可以运行,但其可维护性极差,且代码量是原 C 代码的三倍。最终,作者放弃了自动生成的代码,决定手动将 C 代码逐行翻译为 Rust。构建过程
作者详细描述了如何通过autotools和Makefile来构建项目,并逐步将 C 文件替换为 Rust 文件。最终,作者使用cccrate 将 C 代码编译为库,并在 Rust 项目中链接这些库。有趣的 Bug
作者分享了在移植过程中遇到的两个典型 Bug:- Bug 1: C 代码中隐式函数声明导致返回的指针被截断。
- Bug 2: 由于 Rust 结构体定义中漏掉了一个
*,导致内存访问错误。
C 模式在 Rust 中的实现
- 原始指针: Rust 中的
*mut T和*const T用于替代 C 中的指针。 - Goto 语句: 通过 Rust 的
break和continue语句模拟 C 中的goto。 - 侵入式宏: 作者实现了类似于 C 中的侵入式红黑树和链表的数据结构。
- Yacc 解析器: 使用
lalrpopcrate 替代了 C 中的yacc解析器。
- 原始指针: Rust 中的
开发工具
- Vim: 作者使用 Vim 和自定义宏来加速代码转换。
- AI 工具: 作者尝试了 Cursor 等 AI 工具,但发现其生成的代码仍需手动检查,最终放弃了使用。
结论
尽管代码已经 100% 移植到 Rust,但作者认为代码质量仍有待提高,特别是需要将 unsafe 代码转换为安全的 Rust 代码。作者发布了 tmux-rs 的 0.0.1 版本,并邀请 Rust 和 tmux 爱好者通过 Github Discussions 进行交流。
图片

展示了项目的构建流程,涉及Makefile、autotools和cargo的交互。
相关链接
评论总结
以下是评论内容的总结,涵盖了主要观点和论据,并保持了不同观点的平衡性:
1. 对项目的态度与动机
- 支持态度:许多评论者赞赏作者将tmux重写为Rust的动机,认为这是一个有趣的业余项目,无需过多理由。
- 引用:"We don’t necessarily need a reason to build new things. Who knows what will come out of a hobby project."(我们不一定需要理由来构建新事物。谁知道业余项目会带来什么。)
- 引用:"I love this attitude. We don’t necessarily need a reason to build new things."(我喜欢这种态度。我们不一定需要理由来构建新事物。)
2. 性能与内存管理
- 期待改进:一些用户提到tmux在内存管理上的问题,尤其是当滚动缓冲区较大时,希望Rust版本能有所改善。
- 引用:"tmux has been used a lot of memory on my system, especially when scrolling buffer is large enough."(tmux在我的系统上占用了大量内存,尤其是当滚动缓冲区足够大时。)
- 引用:"I hope the rust version can help a bit here?"(我希望Rust版本能在这方面有所帮助?)
3. Rust的安全性
- 对“unsafe Rust”的担忧:部分评论者对项目中使用“unsafe Rust”表示担忧,希望最终能实现内存安全。
- 引用:"I like the initiative, but all this effort for ... unsafe Rust?"(我喜欢这个倡议,但所有这些努力是为了... unsafe Rust?)
- 引用:"I hope the end goal is to have a memory-safe (and faster) tmux."(我希望最终目标是拥有一个内存安全(且更快)的tmux。)
4. 对Windows的支持
- Windows用户的期待:一些Windows用户期待Rust版本的tmux能在Windows上运行。
- 引用:"I’ll take a rust tmux if it runs on Windows."(如果它能在Windows上运行,我会选择Rust版本的tmux。)
5. 对tmux的依赖与改进建议
- tmux的重要性:许多用户表示tmux对他们的工作流程至关重要,并提出了改进建议,如更好的滚动支持和窗口管理。
- 引用:"Tmux is a gamechanger for me. Being able to start a dozen different projects with one line."(tmux对我来说是一个改变游戏规则的工具。能够用一行代码启动十几个不同的项目。)
- 引用:"I hope this version makes it easier to just scroll with the scroll wheel or ctrl-page-up/down."(我希望这个版本能让滚动滚轮或使用Ctrl+Page Up/Down更容易。)
6. 对AI与自动化工具的讨论
- AI在代码翻译中的应用:一些评论者讨论了使用AI(如LLM)来自动化C到Rust的代码翻译,认为这可能是未来的趋势。
- 引用:"LLM’s are really good at translating one programming language into another."(LLM非常擅长将一种编程语言翻译成另一种。)
- 引用:"rewriting old code in new language is the killer application for AI."(将旧代码重写为新语言是AI的杀手级应用。)
7. 对代码可读性与翻译过程的评价
- 代码可读性问题:部分评论者认为自动生成的Rust代码不如原始C代码易读,且翻译过程中引入了许多bug。
- 引用:"I can read the C version better than the generated Rust code."(我阅读C版本比生成的Rust代码更容易。)
- 引用:"I introduced many bugs while translating the code."(在翻译代码时,我引入了许多bug。)
8. 对项目的未来展望
- 对项目未来的期待:一些评论者期待项目能继续发展,并与其他Rust工具(如rmuxinator)集成。
- 引用:"I’d like to try forking tmux-rs, adding rmuxinator as a dependency and seeing if it would ... just work."(我想尝试分叉tmux-rs,将rmuxinator作为依赖项,看看它是否能...正常工作。)
总结:
评论者对将tmux重写为Rust的项目持积极态度,认为这是一个有趣的业余项目,但也对“unsafe Rust”和代码可读性表示担忧。用户期待Rust版本能改善内存管理,并支持Windows平台。同时,AI在代码翻译中的应用被认为是未来的趋势,尽管目前仍存在挑战。