English Original
- Microsoft SCHIE(Silicon and Cloud Hardware Infrastructure Engineering,硅与云硬件基础设施工程)团队首席固件架构师
- 行业资深专家,专长于安全、系统编程(固件、操作系统、虚拟机管理程序)、CPU 与 platform 架构以及 C++ 系统
- 2017 年在 AWS EC2 开始使用 Rust 编程,从此爱上了这门语言
这是一本关于如何利用 Rust 类型系统,让整类 bug 在编译阶段就无法出现 的实用指南。虽然配套书籍 Rust 模式 讲解了相关机制(Traits、关联类型、Type-state),但本指南将展示如何将这些机制 应用 到真实世界领域——如硬件诊断、密码学、协议校验和嵌入式系统。
这里的每一个模式都遵循同一个原则:将运行时检查的不变量推动到类型系统中,从而让编译器强制执行它们。
| 符号 | 级别 | 受众 |
| 🟢 | 入门 | 熟悉所有权 + Traits |
| 🟡 | 中级 | 熟悉泛型 + 关联类型 |
| 🔶 | 高级 | 准备学习 Type-state、Phantom Types 和 Session Types |
| 目标 | 路径 | 时间 |
| 快速概览 | 第 1 章、第 13 章(速查卡) | 30 分钟 |
| IPMI / BMC 开发者 | 第 2、5、7、10、17 章 | 2.5 小时 |
| GPU / PCIe 开发者 | 第 2、6、9、10、15 章 | 2.5 小时 |
| Redfish 实现者 | 第 2、5、7、8、17、18 章 | 3 小时 |
| 框架 / 架构师 | 第 4、8、11、14、18 章 | 2.5 小时 |
| “构造即正确”新手 | 按顺序阅读第 1 到 10 章,然后完成第 12 章练习 | 4 小时 |
| 完整深潜 | 按顺序阅读所有章节 | 7 小时 |
| 章节 | 标题 | 难度 | 核心思想 |
| 1 | 核心理念:为什么类型胜过测试 | 🟢 | 正确性的三个层次;作为编译器检查保证的类型 |
| 2 | 类型化命令接口 | 🟡 | 关联类型将请求与响应绑定 |
| 3 | 单次使用类型 | 🟡 | 移动语义作为密码学的线性类型 |
| 4 | 能力令牌 | 🟡 | 零大小的授权证明令牌 |
| 5 | 协议状态机 | 🔶 | 适用于 IPMI 会话 + PCIe LTSSM 的 Type-state |
| 6 | 量纲分析 | 🟢 | Newtype 包装器防止单位混淆 |
| 7 | 已验证边界 | 🟡 | 在边界处一次性解析,在类型中携带证明 |
| 8 | 能力混入 | 🟡 | 组成式 Traits + Blanket 映射 |
| 9 | Phantom Types | 🟡 | 用于寄存器宽度、DMA 方向的 PhantomData |
| 10 | 综合应用 | 🟡 | 在一个诊断平台中组合全部 7 类模式 |
| 11 | 一线实践中的十四个技巧 | 🟡 | 哨兵值转 Option、Sealed Traits、Builders 等 |
| 12 | 练习 | 🟡 | 带解决方案的六个综合问题 |
| 13 | 速查卡 | - | 模式目录 + 决策流程图 |
| 14 | 测试类型层保证 | 🟡 | trybuild, proptest, cargo-show-asm |
| 15 | const fn | 🔶 | 内存映射、寄存器、位字段的编译期证明 |
| 16 | Send 与 Sync | 🔶 | 编译期并发正确性证明 |
| 17 | Redfish 客户端实战讲解 | 🟡 | 将八种模式组合成类型安全的 Redfish 客户端 |
| 18 | Redfish 服务器实战讲解 | 🟡 | Builder Type-state、源令牌、健康汇总、混入 |
较低安全性 较高安全性
运行时检查 单元测试 属性测试 构造即正确
---------------- ---------- -------------- -----------------------
if temp > 100 { #[test] proptest! { struct Celsius(f64);
panic!("too fn test_temp() { |t in 0..200| { // 不能在类型层面上
hot"); assert!( assert!(...) // 与 Rpm 混淆
} check(42)); }
} }
无效程序? 无效程序? 无效程序? 无效程序?
在生产中崩溃。 在 CI 中失败。 在 CI 中失败 无法编译。
(概率性的)。 根本不存在。
本指南工作在最右侧的位置——在那里, bug 不存在,因为类型系统 无法表达它们。