Rust:重塑微软开发范式的力量
Rust正在重塑微软的开发范式,通过编译器强制提高代码安全性。
微软把 Rust 列入一级语言,新闻里都在讲内存安全、讲 CVE 数字、讲 Mark Russinovich 的演讲。但我更在意那个没人爱说的细节:Windows 内核组的工程师,现在提交 PR 时,不再需要在代码审查里专门留一轮给「指针算术」和「释放后使用」。这才是范式变了的信号。
Windows 和 MSVC 共同进化了三十年。C 和 C++ 不只是语言,它们是平台的骨架、工具链的血肉、SDL 流程的肌理。微软内部有上亿行 C++ 代码,每年新增的 CVEs 里,70% 以上依然是内存安全问题——这个比例从 2006 年算到 2024 年,几乎没变过。静态分析工具跑了二十年,SAL 注解写了几百万行,/analyze 开关也没关过,但缓冲区溢出、双重释放、悬垂指针,依然像慢性病一样留在每个发布周期的安全公告里。Rust 不是来「替代」C++ 的,它是来把这三十年的技术债,用编译器强制还清一部分。
所谓「一级语言」,不是在 README 里加个 badge 就完事。微软内部给 Rust 铺的路,具体到:工具链由平台团队统一构建、签名、分发,每个版本都要通过 SDL 合规测试;cargo 能直接拉取内部私有注册表,依赖审计接入了公司级的策略引擎;VS 和 VS Code 的 Rust Analyzer 集成由专职团队维护,调试器原生支持 std::sync::Arc 这种类型的可视化;甚至连 Windows SDK 的元数据,都自动生成 windows crate 的绑定。以前团队想用 Rust,先得花半年搭建工具链、谈法务审批、对齐合规;现在新项目开仓库,选 Rust 和选 C# 一样简单。这就是「铺好路」的含金量。
当然,反方观点很整齐:「现代 C++ 配合 Core Guidelines、Clang-Tidy、AddressSanitizer,完全能达到同等安全性。」这话乍听没错——Google 的碳语言、C++26 的 Profile、Checked C 都在往这方向卷。但这忽略了一个根本差异:C++ 的安全是「事后检查」,Rust 的安全是「事前约束」。借用检查器在编译期就把所有权、借用、生命周期锁死,迫使你在写第一行 unsafe 之前,先把安全边界想清楚。这不是工具差异,是思维模式差异。一个习惯了 unique_ptr 和 shared_ptr 的 C++ 程序员,面对数据竞争时的第一反应是「加锁」;而写惯 Rust 的人,第一反应是「把共享状态变成消息传递」。后者改变的不是代码风格,是架构决策的起点。
这事儿要是放在国内大厂,早就出「全面拥抱 Rust」的 OKR 了:Q1 完成核心库改写,Q2 所有新项目强制 Rust,Q3 老代码逐模块替换,年底考核挂挂掉。这就是中国互联网和硅谷的范式差异——我们习惯用行政命令推技术变革,把工程问题当执行问题;微软选的是造平台、铺路、降门槛,让团队在「选 Rust 的边际成本低于不选」时自然切过去。前者快但脆,后者慢但稳。Windows 内核组没人下达「必须用 Rust」的指令,但 Azure 的新控制面组件、Hyper-V 的新设备模拟层、甚至 Office 的某些同步引擎,悄无声息就用上了。因为选 Rust 的团队,代码审查会议从两小时缩到四十分钟,上线前的安全扫描报告里不再刷红屏。
去年我认识一个在 Windows 存储团队的工程师,老张,写了十五年文件系统过滤驱动。以前他最头疼的是 IRP 完成例程里的竞态条件:一个请求在取消时正好被完成,引用计数稍微算错一步,就是蓝屏。团队为此写了三百多行的手工锁逻辑,配上密密麻麻的注释和 ASSERT。去年他们把这个模块用 Rust 重写了一遍,用 Arc<Mutex<>> 和 channel 替代了所有手工同步。编译器报了三十七个错误,每一个都对应着以前可能漏掉的边界情况。重写后的代码行数少了 40%,但老张说最爽的不是少写代码,是代码审查时,没人再问「这里会不会有 use-after-free」,大家只讨论「这个取消语义对不对」。这就是借用检查器把认知负载从「怎么不出错」转移到了「业务对不对」上。
但别把话说死。Rust 在微软的推进,核心动力从来不是「我们爱安全」,而是 Azure 卖不出去安全。企业客户在采购云服务时,安全合规清单上的「内存安全语言占比」正在变成硬指标。AWS 也在推 Rust,Google 也在推。微软不跟上,SDL 再完美也是昨天的故事。所以 Rust 成为一级语言,本质上是商业护城河的技术表达——用编译器把安全成本前置,把原本要在运维、法务、公关上花的钱,压缩在开发期。这笔账,Satya Nadella 算得比任何工程师都清楚。
真正的考验不在 Windows 内核,也不在 Azure 控制面。而在于:当下一个十万行级别的新服务立项时,架构师会不会把 Rust 当作默认选项,而不是「勇敢者的实验」。如果答案是肯定的,那才叫范式重塑。否则,这不过是 C++ 换了件更体面的马甲,继续在那三十年的共同进化里打补丁。
工具重塑人的前提,是人愿意把思维模式交给工具重塑。微软铺好了路,剩下的,看各个团队愿不愿走。