微软为什么从 C/C++ 转向了 Rust?


微软为什么从 C/C++ 转向了 Rust?文章插图
作者 | JOAB JACKSON
译者 | 弯月 , 责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
以下为译文:
在上个月的AllThingsOpen虚拟会议上 , 微软云开发推广部的Ryan Levick解释了为什么微软在构建基础设施软件中逐渐从C/C++转向了Rust 。 他表示:“无论软件公司在工具和人员的培训上投入多少精力也不能解决问题 , 因为C++本质上就不是安全的语言 。 ”并鼓励其他软件行业巨头也应该思考这个问题 。
他说:“我们使用的语言由于年代久远、来自不同时代 , 无法为我们提供保护 , 让我们免受此类漏洞攻击 。 C++不是一种内存安全的语言 , 相信这一点无人有异议 。 ”
实际上 , 微软认为C++无法胜任编写关键任务的软件 。 业界非常需要高性能、内存安全的编程语言来开发底层系统 。 Levick表示 , 当今市场上最好的选择是Rust 。
微软为什么从 C/C++ 转向了 Rust?文章插图
C/C++的问题无法解决目前 , C和C++是编写核心系统软件的默认语言 。 这种语言速度快 , 而且源代码可以直接汇编成机器语言 。
但是 , 这些语言引发的与内存相关的bug(其中很多是安全隐患)让整个行业苦不堪言 。 Levick表示 , 如今源自微软的CVE中有70%是内存安全问题 。 他说:“前途未卜 , 情况没有任何改变 。 尽管我们为解决这个问题付出了巨大的努力 , 但这个问题依然普遍存在 。 ”
从财务的角度来看 , 换成Rust很有道理 , 因为修补这类与内存相关的没完没了的bug需要付出昂贵的成本 。 Levick说 , 早在2004年 , 每个与内存相关的bug都会给业界造成大约25万美元的损失 , 而且微软的估计可能还比较保守 。
当然 , 为了提高C++的安全性 , 软件业界已经付出了大量努力 , 尽管种种努力都有效 , 但并不能完全解决这个问题 。
长期以来 , 我们最常使用的一种方法是 , 就如何编写更安全的代码对程序员展开更多培训 。 但是 , “没有证据表明 , 对C和C++开发人员进行整体培训可以显著改善这个问题 。 ”Levick根据微软大量的开发人员内部培训结果说 。
静态分析是另一种解决方案 。 但是静态分析会带来太多开销 , 必须将静态分析紧密结合到构建系统中 。 Levick说:“因此 , 人们有很多借口不使用静态分析 。 如果静态分析不是默认就启用的 , 那么就起不到任何作用 。 ”
运行时检查也是如此:“了解何时使用运行时检查、何时没有使用是非常困难的 , 有时甚至不可能 。 ”他还补充说 , 这也带来了运维开销 。
微软为什么从 C/C++ 转向了 Rust?文章插图
业界最佳机会为了解决与内存有关的bug , 微软安全响应中心发起了“安全系统编程语言”计划 。 他们投入了一些开发人员专门支持C/C ++ 。 同时 , 他们还创建了一门新编程语言Verona , 来开发安全的底层系统 。 但是 , 这个项目策略中第三个主要的部分 , 也是他们最有信心的部分 , 就是支持“直接解决这个问题的业界最佳机会” 。
他说:“我们相信这个重任落到了Rust肩上 。 ”
就性能而言 , Rust与C/C++旗鼓相当 , 甚至更快 。 Rust通过软件包管理、现代测试框架等提高了开发人员的生产力 。 因为这个原因程序员非常喜欢Rust 。
但是 , 微软如此着迷于Rust的主要原因是它是一种内存安全的语言 , 而且只需要最少量的运行时检查 。 Rust擅长创建正确的程序 。 简单来说 , 正确性就是编译器会检查程序是否存在不安全的操作 , 从而减少运行时错误 。 不安全的关键字也可以使用 , 但并不是默认推荐 。 在安全的Rust代码中 , 不安全的代码永远只是一小部分 。 不安全模式对于需要内存分配的任务(例如编写设备驱动程序)是必须的 。 但在Rust中 , 即便内存的不安全部分也封装在API的后面 。