为什么我要用 Rust 重写 tmux?
💡
原文中文,约10600字,阅读约需26分钟。
📝
内容提要
作者在过去六个月内将tmux从C语言移植到Rust,完成了100%的Rust代码。虽然使用C2Rust工具生成的代码可运行,但维护性差,因此决定手动翻译。项目中遇到许多错误,最终实现了Rust接口并简化了构建过程。尽管代码安全性仍有待提高,作者已发布0.0.1版本,期待进一步改进。
🎯
关键要点
- 作者在过去六个月内将tmux从C语言移植到Rust,完成了100%的Rust代码。
- 项目开始时使用C2Rust工具,但生成的代码维护性差,因此决定手动翻译。
- 手动翻译过程中遇到许多错误,最终实现了Rust接口并简化了构建过程。
- 构建过程需要对项目的构建方式有深刻理解,使用了自定义的build.sh脚本。
- 在翻译过程中引入了许多错误,作者分享了几个错误的发现和修复过程。
- Rust中使用原始指针来替代C语言中的指针,因Rust引用的某些不变量无法维护。
- tmux广泛使用的侵入式宏数据结构在Rust中得到了良好的实现。
- 作者使用lalrpop库重新实现了tmux的自定义解析器,简化了构建过程。
- 开发过程中使用了多种文本编辑器和AI工具,最终决定停止使用C2Rust。
- 尽管代码已完成100%,但作者认为仍需改进代码的安全性,并已发布0.0.1版本。
❓
延伸问答
为什么作者选择用Rust重写tmux?
作者选择用Rust重写tmux主要是出于个人兴趣,尽管没有特别的理由,但这是一个业余爱好项目。
在将tmux从C语言移植到Rust的过程中遇到了哪些主要问题?
主要问题包括生成的Rust代码维护性差、翻译过程中引入的错误,以及对项目构建方式的深刻理解。
作者是如何简化tmux的构建过程的?
作者通过编写自定义的build.sh脚本和使用cc crate来简化构建过程,确保Rust和C代码能够正确链接。
Rust中如何处理C语言中的指针?
Rust中使用原始指针(*mut T和*const T)来替代C语言中的指针,因为Rust引用的某些不变量无法维护。
作者在翻译过程中使用了哪些工具和编辑器?
作者使用了多种文本编辑器和AI工具,主要使用neovim进行开发,但最终停止使用AI工具,因为没有显著提高效率。
tmux的自定义解析器是如何实现的?
tmux的自定义解析器是通过使用lalrpop库重新实现的,该库的代码结构与yacc相似,便于进行一对一的转换。
➡️