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

珠江路在线   2023年11月1日  【 转载 】追剧吧 

  本文标签:C++,编程

在不久前TIOBE公布的10月编程语言排行榜上,C++一举越过Java,摘得探花位,仅次于Python和C 。年过四旬的C++依旧是 寰球最 风行的编程语言之一,不过近年来一些巨头的动向也让C++的安全性频频走向争议的 核心 。

前有微软 透露正基于Rust 语言改写 Windows 11 内核, 部分 代替之前的 C++,后有谷歌 声称正在将 Android 原生代码从 C++ 迁徙到 Rust,从而进一步削减安全 漏洞 。

就在外界纷纷 推敲C++如何 应答 从天而降的中年危机,是不是真的应该让位于后起之秀时,近日C++之父Bjarne Stroustrup在上个月举办的编程语言年度大会上公开表态:他将添加新的安全工具 应答批判,为 寰球数十亿行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说:“我 设想的是类型和资源安全,内存安全, 规模安全 。诸如算术安全之类的东西是 能够标准化的 。”此外,还将 制订规定,对不同的代码片段 利用不同的保障 。代码甚至 能够得到利用了哪些保障的显式 抒发式(从而使将来的读者 释怀) 。

Stroustrup简要 注明了丝毫:“小心”是行不通的 。 因而,固然核心指导方针可能 提议安全的编码实际,但“我们需求强制执行的 规定” 。

“我们必须制订安全使用的 规定 。我们必须提供 步骤来验证人们是不是真的在做他们想做的 事件 。”Stroustrup指出,他所 形容的大部分内容已经被尝试过,甚至有规模化的 实际 。“但这些都没有被整合成一个 统一的、连贯的整体 。这便是我认为我们应该做的 。”

“卫生规定+静态综合+运行时 审查”便是被提炼出的公式 。Stroustrup说C++ 能够肃清许多常见的 舛误,包含未初始化的变量, 规模舛误,空指针解引用,资源 透露和悬空引用 。

在 报告接近尾声时,Stroustrup谈到了更多的细节 。“我 提议你采纳基于模块的控件 。”

export My_module[[provide(memory_safety)]];
import std [[enable(memory_safety)]];
import Mod [suppress(type_safety)]];

还在开发中的是代码内控件,用于代码片段 。

[[suppress(type_safety)]] X
[[enforce(type_safety)]] X

3、合力:面向开发者的愿望清单

当前这项工作还在进行中,你 能够查到与之有关的论文和 探讨 。Stroustrup谈到:“从经典的C,从‘带类的C’,到C++11,我们已经走了很长很长的路 。”    

面向开发者,Stroustrup 提议消费者能够协助完善配置文件并将其 标准模式化 。“我 妄想着像 Profiles Light 这样的东西,它提供了配置文件的大 部分保障,但不能做全部最终的 事件,由于,比方说,静态 综合器还不能做到这丝毫 。”

Stroustrup创立了一个 GitHub 存储库,“人们 能够在那里提出提议,我将把我的草稿等放在那里,这样我们就 能够创立一个社区,致力于在正当的 工夫内实现这些事件 。

存储库询问需求什么 能力使配置文件成为“满足各种 C++ 安全需求的全行业工具”,并将该概念称为框架 。“为了实现 宽泛使用,必须创立和安装许多部件 。 固然我们已经做了众多工作,但宽泛可用的 绝对较少 。这是一个愿望清单 。请尽你所能提供协助 。”

免责声明:凡标注转载/编译字样内容并非本站原创,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。