谷歌百万美元助力编程语言转换:从C++迁移到Rust的背后故事

发表时间: 2024-06-06 15:56



根据帖子,谷歌宣布向Rust基金会提供100万美元的资金,以改善C++和Rust之间的互操作性。

这太巨大了!

为什么,你会问?

C++运行着我们今天看到的世界。

它是用于构建后端和嵌入式系统的最流行的编程语言之一。

根据衡量编程语言受欢迎程度的TIOBE指数,C++在名单上排名第三(仅次于Python和C)。

C++速度快,开销最小,开发人员喜欢它。

但是,C++编程伴随着一个不能不解决的大问题。

这个问题是-内存安全

内存安全问题有什么大不了的吗?

看看谷歌2019年报告中关于Android系统中修复的漏洞的情节。

这些漏洞中有60%来自代码中的内存问题。

2019年Android安全公告中修复的关键和高严重漏洞类型(来源:谷歌安全博客)

大多数主要科技公司也是如此:

  • 微软:每年约70%的漏洞仍然是内存安全问题
  • Chromium项目:70%的高严重性安全漏洞是内存不安全问题(即C/C++指针的错误)。

其中一半是释放后使用错误(当程序在释放后没有清除指向该内存的指针时)。

  • Mozilla:在分析安全漏洞时,在34个关键/高漏洞中,有32个(94%)与内存相关。
  • 谷歌的零项目:2021年67%的零日漏洞是内存损坏漏洞

根据微软Azure的Ryan Levick的说法,2004年,每个与内存相关的错误都花费了该行业约25万美元。

因此,C/C++代码中的这些内存错误总体上花费了科技行业数百万美元

除了财务成本外,互联网上的恶意行为者还利用这些漏洞,并利用它们来攻击真人。

所以,是的,这也比他们意识到的更深层次地影响了非程序员。

但我们不能修复C/C++吗?

之前已经付出了很多努力来尽量减少C/C++代码中与内存相关的错误。

这些包括:

  • 消毒剂,如地址消毒剂、泄漏消毒剂和未定义行为消毒剂
  • 静态分析工具,如Clang Static Analyzer、Coverity、Cppcheck
  • 具有改进编译器警告的现代C++编译器(例如GCC、Clang、MSVC)
  • 现代C++功能,如智能指针和移动语义
  • 安全库(std::vector而不是原始数组)
  • 改进的内存分配器(例如Scudo硬化分配器)
  • 严格的代码审查和团队遵循编写安全高效的C++代码的最佳实践规则

但是,老实说,它们都没有工作得很好,程序员(人)错误仍然会导致关键代码库中的重大内存错误。

生锈救援

1.没有垃圾收集的内存安全

Rust作为现代系统编程语言引入,在编译时引入了类型安全和线程安全。

与C/C++不同,Rust通过其所有权模型防止内存错误(如Dangling指针),而无需垃圾收集器。

消除垃圾收集器还可以消除运行时开销,并使Rust速度超快!

使用超规范的编译器,Rust不会让您编译违反安全和内存管理规则的代码。这大大减少了运行时出现的错误。

想要一个现实世界的例子吗?

npm的授权服务最近在Rust中重写,结果呢?——npm的第一个Rust程序在一年半的生产中引起了0个警报

事情如此有利可图,以至于微软Azure的首席技术官建议停止用C/C++启动任何新项目!

Mark Russinovich的推文(来源:Twitter/X)

2.完美无瑕的并发

与C/C++赋予开发人员使用锁定机制管理线程安全的责任不同,Rust在编译时再次拥有所有权和类型系统。

这使得在使用Rust构建的并发系统中很难引入错误。

3.具有更好可解释性的标准编译器

Rust附带一个名为rustc的标准编译器,该编译器使用LLVM作为其后端构建。

这允许在不同架构之间进行更好的优化和交叉编译能力。

与其他语言不同,Rust编译器错误也很复杂,非常有帮助。

作者的推文

这与C++不同,C++有多个编译器可供选择。

4.更好的依赖管理

Rust附带一个名为Cargo的软件包管理器和构建系统,通过Cargo.tomlCargo.lock文件使依赖性管理成为小菜一碟。

Cargo从名为crates.io的Rust软件包注册表中自动下载和编译项目依赖项,并简化了整个过程。

5.自动文档

Rust有一个名为rustdoc的工具,它从源代码中的注释中自动生成文档。

6.更好的功能

以下功能也使Rust对编写错误更不容易的代码非常有帮助。

  • 默认不可调
  • 匹配语句和模式匹配
  • 使用ResultOption枚举进行显式错误处理

澄清一下,Rust并不完美

例如,程序员仍然可以编写带有逻辑错误和错误处理错误的代码。

Rust还具有陡峭的学习曲线(具有像Lifetimes这样的语法和原则),拥有稳步增长的开发人员社区(与C/ C++建立的社区不同),并且仍处于与现有系统集成的早期阶段。

但谷歌、AWS和微软等科技巨头正在解决这个问题。

谷歌长期以来一直在研究C++/Rust互操作性工具,例如:

  • cxx
  • autocxx
  • 宾根
  • cbindgen
  • 外交官
  • 克鲁比特

谷歌上Rust的一些其他用例可以看到:

  • Android中的操作系统模块,包括蓝牙和Keystore 2.0
  • 低级项目,例如ChromeOS中使用的crosvm虚拟机监视器和驱动程序(QEMU的替代品)
  • Mercurial源代码控制系统
  • 支持FIDO安全密钥的固件
  • 软件国际化项目,ICU4X
  • 新的实验操作系统的一部分,Fuchsia
  • 关于GPU字体渲染的研究
  • 将Rust代码添加到curl中
  • 与ISRG合作,将Rust TLS模块添加到Apache HTTP服务器项目中

最后,其100万美元的资金是朝着在现有软件系统中使用更多Rust并构建新软件系统的目标迈出的一大步!

虽然C/C++很快就会一事无成,但Rust正在迅速取代一个重要的块。