C++“中年危机”有救了!C++之父新动作!

在不久前TIOBE发布的10月编程语言排行榜上,C++一举越过JAVA,摘得探花位 , 仅次于Python/ target=_blank class=infotextkey>Python和C 。年过四旬的C++依然是全球最流行的编程语言之一,不过近年来一些巨头的动向也让C++的安全性频频走向争议的中心 。
前有微软透露正基于Rust 语言改写 windows 11 内核,部分替代之前的 C++,后有谷歌声称正在将 Android 原生代码从 C++ 迁移到 Rust,从而进一步减少安全漏洞 。
就在外界纷纷揣测C++如何应对突如其来的中年危机 , 是否真的应该让位于后起之秀时,近日C++之父Bjarne Stroustrup在上个月举办的编程语言年度大会上公开表态:他将增加新的安全工具应对批评,为全球数十亿行C++代码带来新的解决方案 。

C++“中年危机”有救了!C++之父新动作!

文章插图
1、反驳:切换到新语言,没那么简单对于那些认为问题出在C++本身、解决方案是改用另一种语言的批评人士,这位已经72岁的大佬予以了驳斥 。
第一,安全性指的不仅仅是内存安全 。
第二,语言之间的互操作性需求往往会被忽视 。
第三 , 语言切换的成本通常会被低估 。
Stroustrup首先指出“通常提到的安全性只是内存安全——这是不够的......与其他语言(包括C++和C)进行互操作的需求往往不会被提及 。而且转换的成本可能非常高 。这一点很少被提及......”
“从我所看到的观点来看 , 我们将用大约7种不同的语言来取代C++ 。也许在距今四十年后,我们可能会有20种不同的语言,它们必须相互操作 。这将会很困难 。”
Stroustrup还指出 , “许多所谓的‘安全’语言将所有底层的东西都外包给了C或C++”,暂时脱离原始语言来访问硬件资源,甚至操作系统(通常是用C编写的)——甚至可能是极为古老的、藏在外部库中的“可信代码”……
Stroustrup把我们目前的情况称为“一种渐进式和进化式的方法,而不是一味追求全新的方法 。”就像盖尔定律:“一个有效的复杂系统势必是从一个有效的简单系统发展而来的 。”
归根结底,就像Stroustrup所指出的,切换语言可能看起来是在构建一个新系统 , 但是想越过所有旧系统的问题来解决一切,只是一个幻想 。切换语言所要付出的代价可能远比你理想中的要高 。
2、出新:“小心”是行不通的,“我们需要强制执行的规则”Stroustrup提到了安全性的许多概念,重点介绍了资源泄漏、溢出、内存损坏、计时错误、并发错误、终止错误——当然还有类型错误 。随后,他就C++安全性的发展趋向进行了详细阐释 。
Stroustrup称当前是“一个机会”,他强调,类型和资源安全从C++诞生之初就一直是它的目标 。“我们当时的硬件无法提供完全的安全性,现在也无法对所有语言和所有用例提供完全的安全性 。”但是Stroustrup也不希望看到对C++表达的限制,事实上他设想了一个仍然遵循该语言的ISO标准的解决方案 。
“我们需要它是C++ 。也就是说,我们能做什么不应该受到限制,即使我们如何做可能会受到限制 。”
与此同时,Stroustrup 也不希望看到大量的额外运行时开销 。“性能不应该有任何下降......实际上,编写安全代码的一些技术可以提高性能 。我主要谈论的是编译器和静态检查可以做什么,因为它是免费的,或者实际上可以提高性能 。”
Stroustrup找到了他的解决方案:配置文件 。也就是说,一套规则,只要遵守,就能实现特定的安全保证 。它们将由ISO C++标准定义,解决常见的安全问题,如指针和数组范围 。
至于添加新工具的困难 , Stroustrup指出,C++编译器本身现在是一个相当复杂的静态分析器 , 也可以满足配置文件的要求 。因此,在添加提高安全性的工具时 , “我认为配置文件注释应该有助于解决这个问题” 。
Stroustrup列出了一般策略:使用静态分析来消除潜在的错误 。但Stroustrup补充说:“全局静态分析是负担不起的 。”
“所以基本上我们需要规则来简化我们正在编写的内容,使其能够高效、低成本地分析——本地静态分析……然后提供库,使依赖这些规则变得可行 。”
另外,他还指出了这种策略的另一个优势:“支持从旧代码到提供担保的现代代码的逐步转换 。”将有一套标准的“基本”担保,以及更大、更开放的可用担保 。Stroustrup说:“我想象的是类型和资源安全,内存安全,范围安全 。诸如算术安全之类的东西是可以标准化的 。”此外 , 还将制定规则 , 对不同的代码片段应用不同的保证 。代码甚至可以得到应用了哪些保证的显式表达式(从而使将来的读者放心) 。


推荐阅读