C到Rust迁移指南
从C迁移到Rust而不破坏世界 确保和现代化软件是当今的首要任务。技术债务和内存安全漏洞仍然是漏洞的最大来源,这就是为什么团队越来越多地转向Rust以确保其可靠性和内存安全。但是重写既困难又令人恐惧,并且伴随着很大的风险。Mainmatter将我们帮助客户成功现代化一些世界上最重要的软件的经验汇聚成这本书。无论您是从零开始重写一个自包含的库,还是逐步迁移一个不断变化的大型复杂代码库,这本书都会教您成功的技巧。您将学习如何维护一个安全的混合C-Rust代码库,设计和构建干净的API,以及如何将常见的C习惯用法转换为地道的Rust。 C到Rust迁移指南 开始学习 本课程围绕我们的自我节奏练习哲学构建。每个概念都与您在实际Rust包中解决的练习配对,并有测试套件来检查您的解决方案。它假设您对Rust和一些C有先前的了解。不需要先前的FFI经验。这就是课程所教授的。到课程结束时,您将能够以富有成效的方式将Rust引入C代码库。 目录 1. 外部函数接口 FFI的基本原理:C和Rust如何通过C ABI、符号表和链接器在二进制级别上通信。您将自己手动编写第一个extern "C"块,并看到在声明绑定时您向编译器承诺了什么,以及当签名不匹配时出错的地方。 2. 越过边界的类型和数据 如何在保持所有权清晰的情况下,跨越语言边界移动原始值、字符串、结构体和集合。您将使用bindgen从C头文件生成Rust绑定,并使用cheadergen,Mainmatter的反向工具,从您的Rust代码生成C头文件,并为非平凡类型配置两者。 3. FFI安全类型 原始指针和未类型化原始值是FFI边界的主要bug来源。您将学习更安全的替代方案:NonNull、Option、新类型包装器,以及带有含义的枚举判别字段,而不是裸值,以及如何设计类型使无效状态无法表示,即使与没有类型安全的C代码交互。 4. FFI验证 每个FFI函数都是一个信任边界。C调用者可以传递空指针、超出范围的值或无效的UTF-8,而Rust在编译时无法捕获这一点。您将建立在边界验证和缩小输入的纪律,这样来自C的无效数据永远不会到达安全的Rust或您的业务逻辑。 5. 错误处理和API设计 Rust的Result和?在extern "C"处停止。您将把Rust错误类型转换为与C兼容的结果,使用错误代码枚举和输出参数,并在不泄露Rust内部结构的情况下提取失败信息。您还将学习如何公开粗略操作而不是每个字段的设置器,将您的API界面保持得尽可能小。 6. 生产质量FFI 您将使用Rust的/// #安全约定和编号不变式来记录FFI函数,以便每个不安全的合同都是明确的,并通过cheadergen作为生成的头文件中的C文档注释呈现。我们涵盖构建集成、自动检查,并将您的FFI接口视为您将永远维护的API。 关于作者 Jonas Kruckenberg是一位系统工程师和技术专家,专注于下一代计算基础设施。他是k23的首席作者,这是一种实验性的高可靠性操作系统。作为TC39邀请专家,他通过将非浏览器视角带入JavaScript语言标准化,帮助塑造网络的未来。Mainmatter是一家专注于Rust的工程咨询公司。我们为希望从C迁移到Rust或在现有代码库中引入Rust的公司提供工程服务、培训和指导。 社区 EuroRust 2026 EuroRust是一场为所有与Rust有关事宜而举办的两天会议,外加两天的附加活动、研讨会和黑客马拉松。欢迎您于十月莅临巴塞罗那参加。获取您的票。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡