ridiculousfish · 2025-01-03

Fish Shell 4.0 从C到Rust的忒修斯之船移植之路

摘要

本文详细记录了Fish Shell从C++迁移到Rust的完整历程。Fish团队采用"忒修斯之船"策略,逐步替换代码库中的组件,确保每个阶段都有可运行的程序。迁移过程中解决了C++工具链差异、线程安全问题以及代码复杂性等挑战,最终成功完成Rust移植,使代码库更加简洁、性能有所提升,并实现了自安装包功能。

内容框架与概述

文章首先阐述了Fish Shell最初使用C++开发所遇到的困境,包括不同平台的工具和编译器差异、人体工程学问题以及线程安全挑战。这些问题的累积促使团队考虑转向更现代、更安全的编程语言。

接着文章介绍了选择Rust的核心理由:更好的工具链体验、清晰友好的错误信息、便捷的rustup安装方式,以及Rust在安全性和并发性方面的设计优势。Rust对多平台的广泛支持(macOS、Linux、BSD)也确保了Fish的兼容性不会受影响。

最精彩的部分是"忒修斯之鱼"移植策略的详细说明——团队没有选择重写,而是逐步将C++组件移植到Rust,利用autocxx生成C++与Rust之间的绑定,确保整个迁移过程中始终有一个可工作的程序。文章还分享了关键时间节点、遇到的挑战(如可移植性和本地化问题)以及最终取得的成就和未来规划。

核心概念及解读

忒修斯之船移植策略:这是一种渐进式代码迁移方法,源自哲学思想实验"忒修斯之船"——如果逐步替换船上的所有木板,它还是原来的船吗?Fish团队将这一理念应用到代码迁移中,每次替换一小部分C++代码为Rust代码,确保每个阶段都有可运行的程序。这种策略避免了重写的高风险,让迁移过程可控且可回滚。

autocxx绑定生成:在C++和Rust共存的过渡期,团队使用autocxx工具自动生成两种语言之间的绑定层。这大大简化了跨语言调用的复杂性,让C++代码可以逐步调用Rust实现的新功能,无需手动编写繁琐的FFI(外部函数接口)代码。

rustup工具链:Rust的官方安装管理工具,让开发者能够轻松安装和管理不同版本的Rust。这解决了C++开发中常见的"我的机器上能跑"问题——不同平台的编译器版本差异导致的行为不一致。rustup确保了全球开发者使用统一、稳定的工具链。

编译时格式字符串检查:Rust的一个独特优势,能够在编译阶段验证格式字符串的正确性。但这给Fish的国际化翻译带来了挑战——因为翻译文件是运行时加载的,无法在编译时检查。团队需要创造性地解决这个问题,在保持类型安全的同时支持多语言。

自安装包:迁移到Rust后,Fish能够提供"自安装"的分发方式。这得益于Rust优秀的打包和跨平台编译能力,用户可以获得更简洁的安装体验,无需复杂的依赖配置。这是Rust生态系统优势的直接体现。


原文信息

字段内容
原文Fish 4.0: The Fish Of Theseus
作者ridiculousfish
发表日期2024-12-28

此文档由 AI 自动整理