Hacker News 中文摘要

RSS订阅

介绍 tmux-rs -- Introducing tmux-rs

文章摘要

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)。

移植过程

  1. C2Rust 工具的使用
    作者首先尝试使用 C2Rust 工具将 C 代码转换为 Rust 代码。虽然生成的代码可以运行,但其可维护性极差,且代码量是原 C 代码的三倍。最终,作者放弃了自动生成的代码,决定手动将 C 代码逐行翻译为 Rust。

  2. 构建过程
    作者详细描述了如何通过 autotoolsMakefile 来构建项目,并逐步将 C 文件替换为 Rust 文件。最终,作者使用 cc crate 将 C 代码编译为库,并在 Rust 项目中链接这些库。

  3. 有趣的 Bug
    作者分享了在移植过程中遇到的两个典型 Bug:

    • Bug 1: C 代码中隐式函数声明导致返回的指针被截断。
    • Bug 2: 由于 Rust 结构体定义中漏掉了一个 *,导致内存访问错误。
  4. C 模式在 Rust 中的实现

    • 原始指针: Rust 中的 *mut T*const T 用于替代 C 中的指针。
    • Goto 语句: 通过 Rust 的 breakcontinue 语句模拟 C 中的 goto
    • 侵入式宏: 作者实现了类似于 C 中的侵入式红黑树和链表的数据结构。
    • Yacc 解析器: 使用 lalrpop crate 替代了 C 中的 yacc 解析器。
  5. 开发工具

    • Vim: 作者使用 Vim 和自定义宏来加速代码转换。
    • AI 工具: 作者尝试了 Cursor 等 AI 工具,但发现其生成的代码仍需手动检查,最终放弃了使用。

结论

尽管代码已经 100% 移植到 Rust,但作者认为代码质量仍有待提高,特别是需要将 unsafe 代码转换为安全的 Rust 代码。作者发布了 tmux-rs 的 0.0.1 版本,并邀请 Rust 和 tmux 爱好者通过 Github Discussions 进行交流。

图片

  • 构建过程
    展示了项目的构建流程,涉及 Makefileautotoolscargo 的交互。

相关链接

评论总结

以下是评论内容的总结,涵盖了主要观点和论据,并保持了不同观点的平衡性:

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在代码翻译中的应用被认为是未来的趋势,尽管目前仍存在挑战。