An Incoherent Rust
⭐⭐⭐⭐ (4星)
核心观点
Rust生态系统的发展受到语言本身coherence和orphan规则的严重限制。
生态系统问题
- 基础crate依赖: serde等定义了Serialize trait,其他crate必须为自己的类型实现该trait
- 替代方案难以推广: 如果有人发布新的序列化库(如nextserde),所有已支持serde的crate都需要添加支持
- 老crate优势: 由于替换困难,先出现的crate无论质量如何都能长期存在
Coherence和Orphan规则
Coherence
确保每个类型对每个trait最多只有一个实现,防止HashMap问题:
- HashMap问题: 两个crate对同一类型实现不同Hash,传递给第三个crate时产生错误结果
- Soundness问题: 不同的associated type实现可能导致类型混淆(例如*const u8 vs Box<u8>)
Orphan规则
只能为自己crate的trait或类型写实现:
- 生态组合: 允许不同crate的代码组合在一起
- 动态链接安全: 在动态链接场景下也能保证类型安全
现有提案分析
- Binary Crate Exemption: 二进制crate豁免,但不影响库演进
- Deferred Coherence: 延迟检查,对库演进有伤害
- Coherence Domains: 工作区作为整体,引入组合问题
- Fundamental属性: 细微扩展,难以理解
- Specialization: 允许部分重叠,但不完全解决问题
- Reflection and Comptime: 避免使用trait来规避限制
核心结论
引入新语言特性来避免trait的限制是错误的做法。我们应该修复核心语言问题,而不是让人们因为限制而避开trait。
Orphan规则对生态组合和动态链接安全性是必要的,但严重阻碍了生态系统演进。这是Rust语言设计中的核心张力。