近年来,C、C++ 编程言语成了美国官方的「眼中钉」,而内存宁静的 Rust 等言语摇身一变成了「新宠」。
近日,在一份 19 页的演讲《回归基础构件:通往宁静软件之路》中,白宫国家网络主任办公室(ONCD)号令开发者应用「内存宁静的编程言语」,比如 Rust 言语。演讲指出,从一开始就选择内存宁静的编程言语,是以宁静设计方式开发软件的重要途径。
此外,ONCD 表示,演讲中的建议是与包括科技公司、学术界和其他机构合作制定的,并收集了包括惠普、埃森哲和 Palantir 在内等多家科技公司支援演讲的意见。
演讲地址:https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf
其实,这并不是美国官方机构第一次号令放弃应用 C 和 C++ 了。
去年 12 月,美国网络宁静和基础设施局(CISA)联合其他机构颁发了一份《内存宁静路线图指南》, 其中就指出了 C 和 C++ 是内存不宁静的编程言语,并号令软件开发商采用 Rust、Java 等其他内存宁静的编程言语。
来源:https://www.cisa.gov/sites/default/files/2023-12/The-Case-for-Memory-Safe-Roadmaps-508c.pdf
放弃 C、C++,转向 Rust,只为内存宁静
既然强调了要应用内存宁静的编程言语,那首先来了解一下什么是内存宁静。所谓内存宁静是指防止处理内存访问时出现 bug 和毛病,比如缓冲区溢出和悬空指针。
内存不宁静的危害有多大呢?2019 年,微软宁静工程师演讲的数据是:大约 70% 的宁静题目是由内存宁静题目引起的。2020 年,google针对在 Chromium 浏览器发现的 bug 也演讲了类似的数据。
对于编程言语而言,C 和 C++ 都允许应用直接内存地址来进行任意指针运算,并且没有边界检查。演讲中指出,专家发现了一些编程言语既缺乏与内存宁静相关的特征,又在一些关键体系中具有高度扩散性,以 C 和 C++ 为代表。因此,C 和 C++ 被以为是「不宁静的」编程言语。
与 C 和 C++ 相对应,Rust 被以为是内存宁静编程言语的典型示例。Rust 是一门体系编程言语,专注于宁静,尤其是并发宁静。它支援函数式和命令式以及泛型等编程范式的多范式言语,且 TensorFlow 等深度学习框架也把它作为一个优秀的前端言语。
在程序员问答网站 Stack Overflow 2021 年度开发者调查演讲中,Rust 言语成为最受开发者喜爱的编程言语。Rust 在体系编程领域很受欢迎,原因之一就是它可以帮助消除与内存相关的宁静毛病。
Rust 内存宁静的特性早已得到业内验证。2021 年 4 月,google就宣布 Android 加入对 Rust 言语支援。原因是 C 和 C++ 中的内存宁静 bug 是最难解决的错误源,google已经投入了大量的精力和资源来检测、修复和缓解这类 bug,并有效地防止了大量 bug 进入 Android 版本。
然而,尽管做出了这些努力,内存宁静 bug 仍然是稳定性题目的主要原因,它在 Android 严重宁静毛病中长期占据大约 70% 的比例。因此,google为操作体系开发者增加了第 3 个选择 Rust。
华盛顿大学计算机科学教授 Dan Grossman 表示,几十年来,大家都了解 C 和 C++ 的危险,现在终于迎来了推动内存宁静编程言语的好时机,毕竟已经有了实用且成熟的替代方案。
他也以为,摆脱 C 和 C++ 并不是一朝一夕就能完成的,尤其是在嵌入体系中。不过,随着 Rust 等其他编程言语在体系软件中的更广泛应用, 这一进程预计会加快。
对于官方对 C 和 C++ 的态度,更多的人似乎并不买账。
有人以为现代 C++ 是内存宁静的,所有操作体系都应用 C 或者 C++ 进行编程。也有人以为,即使 C++ 不能算是内存宁静,但现代 C++ 拥有更多的「护栏」,并且成本低甚至不用花钱。
对于被「钦点」内存宁静的 Rust,有人觉得它的支援程度没有那么高,也不值得集成到政府体系中。
除了 Rust,内存宁静编程言语还有哪些
2022 年 11 月,美国国家宁静局 (NSA) 发布了一份网络宁静信息表,详细介绍了它以为内存宁静的编程言语
Rust
Go
C#
Java
Swift
JavaScript
Ruby
Python
Delphi/Object Pascal
Ada
以上这些编程言语的流行度如何呢?2024 年 2 月的编程言语流行度指标 TIOBE 显示,在编程方面,Python 排名第一,C# 排名第五,Java 排名第四,JavaScript 排名第六,Go 排名第八,Delphi/Object Pascal 排名第 12,Swift 排名第 16,Rust 排名第 18,Ruby 勉强排名第 20。
可以看到,大多数 NSA 选择的言语都在前 20 名中,只有 Ada 不在,但前十名只有 5 种。
来源:https://www.tiobe.com/tiobe-index/
该演讲还号令更好地衡量软件宁静性。ONCD 以为:更好的衡量标准使技术提供商能够在毛病成为题目之前更好地规划、预测和缓解毛病。
这份演讲还回顾了阿波罗 13 号任务,NASA 将这次任务归类为「成功的失败」。该任务本身遭遇了灾难性的失败,三名宇航员临时进行维修并缓解了一些题目,以便宁静返回家园。该演讲指出:内存宁静代码对于太空计划来说是非常重要的。人类探索太空应该应用一种内存宁静言语,一种尽可能接近内核的言语,以免将来发生事故。
随着世界上越来越多的地方变得数字化,更好的编码变得越来越重要,不良代码可能会被恶意应用。
Rust 言语
Rust 言语是由 Mozilla 主导开发的通用、编译型编程言语。设计准则为「宁静、并发、实用」,支援函数式、并发式、过程式以及面向对象的编程风格。
Rust 言语最突出的优势就是可以提供内存宁静保证,而且没有额外的性能损失。在传统的体系级编程言语( C/C++) 的开发过程中,经常出现因各种内存错误引起的崩溃或 bug ,比如空指针、野指针、内存泄漏、内存越界、段错误、数据竞争、迭代器失效等等。
内存题目是影响程序稳定性和宁静性的重大隐患,并且是影响开发效率的重大因素。google和微软两大科技巨头曾表示:旗下重要产品程序宁静题目 70% 由内存题目引发,并且这两个巨头都考虑利用 Rust 言语来解决内存宁静题目。
此外,Rust 还具有优秀的跨平台性,支援交叉编译,对嵌入式环境同样友好。
然而,Rust 言语也有一些棘手的缺点。
首先,由于 Rust 存在一些特殊的语法,因此初学者入门稍显困难,例如「生命周期(lifetime)」。相比之下,Python、Java 等言语更加简单、易学。但如果你已经掌握了 C++ 言语,学习 Rust 言语就容易得多,因为借鉴了大量 C++ 的语法。
其次,Rust 言语的编译器检查非常严格,开发过程的大多数时间都是在解决编译题目。不过,一旦编译通过,开发人员就不需要关心内存宁静,内存泄漏等头疼题目,只需关注业务逻辑。
延伸阅读:
半小时入门 Rust,这是一篇 Rust 代码风暴
C 和 C++ 不宁静?google宣布 Android 加入对 Rust 言语支援
编写完 10 万行代码,我发了篇长文吐槽 Rust
参考链接:
https://www.tomshardware.com/software/security-software/white-house-urges-developers-to-avoid-c-and-c-use-memory-safe-programming-languages
https://www.whitehouse.gov/oncd/briefing-room/2024/02/26/memory-safety-statements-of-support/