10 月 23 - 25 日,QCon 上海站即将召开,9折优惠最后2天 了解详情
写点什么

74 岁 C++ 之父最新蓝图:让代码更安全,还能兼容 40 年前的老程序!

  • 2025-05-15
    北京
  • 本文字数:3081 字

    阅读完需:约 10 分钟

大小:1.48M时长:08:36
74 岁 C++ 之父最新蓝图:让代码更安全,还能兼容40年前的老程序!

本文最初发布于 THENEWSTACK 博客。


图片来源:维基百科


C++ 仍在不断发展,但许多开发者的使用方式似乎还停留在上个世纪。Bjarne Stroustrup 表示:“我希望整个社区,尤其是 WG21 的成员,能了解我对 C++ 未来发展的看法。”


这位 74 岁的 C++ 创建者用 40 年的时间见证了他在 1985 年设计的这门语言的成长。


为了推动一些渴望已久的特性,上个月,Stroustrup 在《ACM 通信》上发表了“21 世纪的 C++”一文(https://cacm.acm.org/blogcacm/21st-century-c/)。这篇长达 6300 字的文章旨在展示现代化的、类型安全的 “21 世纪 C++ ”中的一些“关键概念”,以便可以创建 “C++ on steroids”。例如,在文中,Stroustrup 着重介绍了长期以来一直在尝试的方法,如使用 guideline-enforcing 配置文件编写更安全的代码。为了与几十年来已经编写的 C++ 代码保持兼容,“我们不能改变语言,但我们可以改变它的使用方式…”,Stroustrup 写道。


然而,这种演变并不完全取决于他自己。在文章末尾,Stroustrup 提到了 WG21(标准化工作组),以及它将如何不可避免地对语言的变化产生影响。Stroustrup 写道,”我不愿意对未来做出预测,部分原因是这本身就很冒险,更重要的是因为 C++ 的定义是由一个庞大的 ISO 标准委员会基于共识来管理的。“


“我上次看时,会员名单上有 527 条。这表明大家有着很高的热情和广泛的兴趣,并且提供了广泛的专业知识,但对于编程语言设计来说,这并不理想,而且 ISO 的规则也无法进行大幅修改"。


尽管如此,对于关键受众,Stroustrup 告诉 TNS,“有些人缺乏历史感,忽略了一些关键点。例如,指南和配置文件要符合 C++ 的长期发展方向。“因此,他正在采取措施教导他们。”为此,我必须说明关键特性的适用范围”。


他这篇内容详尽的文章是一个很好的开始,但也只是众多措施中的一种。最终,它将改变整个 C++ 生态系统的发展轨迹,同时为程序员带来他们渴望已久的高性能、类型安全和灵活的语言。


在完成这一切的同时,Stroustrup 也实现了自己从上世纪 80 年代起就一直坚持的目标…

呼吁采取紧急行动

Stroustrup 还直接与 WG21 进行了沟通。The Register 指出,“过去三四年来,业界和政府的网络安全专家一直在劝阻人们使用 C 和 C++,同时鼓励人们使用具有更好内存安全性的语言”。因此,在发表这篇文章三天后,Stroustrup 给 C++ 标准委员会留下了一份官方说明,他将其描述为 “呼吁采取紧急行动,部分是为了应对 C++ 所受到的前所未有的严重攻击”。


“我认为, WG21 需要做一些有意义的事,并让人们看到它在做这件事。Profiles 是一个可以实现这一目标的框架。“


Stroustrup 的观点很明确。他在文章中写道:“指南没问题,也有用处,但在一个庞大的代码库中,要始终如一地遵循它们基本上是不可能的。我们需要的是一种执行机制,它能标记并防止诸如悬空指针、范围错误和 nullptr 解引用等问题。”


幸运的是,这样的执行机制已经以执行准则配置文件的形式提供了。参考资料部分提供了在 Visual Studio 2019 中使用这些配置文件的示例。它实现了 “Lifetime” 配置文件的早期版本,可检查 C++ 对象生命周期中的悬空指针和引用以及其他常见错误…


一般来说,每个配置文件通常都是在编译时验证要求是否得到满足,是否实现了特定的效果。除了 “Lifetime” 检查配置文件,他们还计划推出更多配置文件,包括 “Bounds” 配置文件,以便确保所有访问数组的代码都包含范围安全检查。


在我们的电子邮件采访中,Stroustrup 指出,通过 2020 年推出的新 span 类模板,C++ 已经为防止范围错误提供了更好的支持。Bounds Profile 只是为了确保这些用于保证边界安全的功能确实已经执行到位。


Stroustrup 告诉我:“其中很多都是标准的,现在就可以使用“。此外,他们还计划推出其他几个配置文件,从而帮助开发人员避免代码中的类型或算术错误。Stroustrup 认为:”在不久的将来,Profiles 将为各种约束的执行提供一个框架。“


希望这能为 C++ 提供人们所期待的安全保证。不过,这也是 40 年前 Stroustrup 最初的 C++ 构想的一个自然发展过程。

“更好的近似”

像类型安全等特性一直是 Stroustrup 为 C++ 设定的安全和性能目标之一。


他在文章中写道:“这一点从一开始就没有变过”,并在参考资料中向读者介绍了他 1994 年出版的《C++ 语言的设计与演化》一书。但是,当代 C++ 比早期版本更好地实现了这些长期目标,其中一部分原因是这种语言“从设计之初就在不断发展”,Stroustrup 在文章末尾写道。因此,经过几十年的改进,他将 C++ 23(10 月份发布的版本)这样的 “当代 C++”称为他最初理想的 “更好的近似”。



在敦促 WG21 采用 Profiles 的说明中,他也强调了这一点:“正如我之前所说,这也是一个机会,因为类型安全和资源安全(包括内存安全)从一开始就是 C++ 的关键目标"。


“对于这一点,我的感受很强烈。请不要被我相对平静的语言所迷惑"。


Stroustrup 在文中指出,语言不断发展的一个问题是“许多人对 C++ 的理解已经过时。如今,我们仍然可以看到人们不断地提及神话语言 C/C++,这通常意味着,人们认为 C++ 是 C 语言的一个次要扩展,包含了 C 语言所有最糟糕的方面,以及对 C++ 复杂特性的怪异滥用…” 但是,C++ 仍在继续发展,Stroustrup 强调说,C++  “正在进行中的工作”及实验性功能已经可以改进异步计算通用模型和 SIMD。


Stroustrup 写道:“一个严重的问题是,如何将不同的想法整合成一个连贯的整体。与大多数软件项目——甚至是学术界的大多数计算机科学工作——不同,设计一种语言需要“在一个并非所有相关因素都能为人所知的空间里做决定,而且接受以后数十年内都不会有重大改变”。


简而言之,这是一个棘手的问题——这仍然是一个已知的问题。“几十年来,几乎所有的语言设计工作都以失败告终,这说明了这个问题的严重性“。


但这并不意味着 C++ 要不再尝试进化…

显著改进

Profiles 并不是 21 世纪 C++ 采用的唯一改进方式。Stroustrup 在接受我们的电子邮件采访时说:“我还要指出,模块是一种能使代码更简洁并大大缩短编译时间的机制。”


Stroustrup 在文章中提到,导入已编译模块比使用老式的 #include 语句速度“高出 7 到 10 倍”。


他告诉我:“现在,大多数人都可以使用 C++23 提供的功能大幅改进他们的代码。“展望未来,Stroustrup 预测,未来会有更多提升性能的特性。“在 C++26 中,我们很可能会看到经过改进的并发支持、静态反射和契约,以及许多细微的改进和标准库组件。”


这种前瞻性的希望或许可以解释,为什么 Stroustrup 在宣传 Profiles 时会以 C++ 的历史为基础。Stroustrup 告诉我,他的文章“展示了 C++ 演进的方向。安全保证即将到来。这在 C++ 中并不是一个新奇的想法,而是长期目标的一部分。完备的类型安全和资源安全是 C++ 最初的目标之一,但推动大量应用领域的发展需要时间,而且必须循序渐进。”


他知道,已安装的代码库非常广泛,C++“目前涵盖了大量的应用领域”。安全保证必将涉及那些已经使用 C++ 提供高质量应用程序的领域。


“关注内存安全的人应该注意到,C++ 并非 C 语言。在 C++ 中,基于更安全的编程风格和加固库的解决方案已经广泛部署。“


我问,是否有迹象表明他在 ACM 发表的文章产生了影响——显然这很难量化。Stroustrup 说:"我不愿意对未来做预测,但我们已经看到,泛型编程已经从 concepts 中获得了更好的支持。”


Stroustrup 指出,如果你正在寻求有效的改进,那么你也可以将目光投向语言之外。目前,有很多工具可供 C++ 开发人员选择。


“语言不仅仅是语言规范或正式标准中的内容“。


原文链接:

https://thenewstack.io/bjarne-stroustrup-on-how-he-sees-c-evolving/

2025-05-15 09:004531

评论 1 条评论

发布
用户头像
编译器变量自动初始化和禁止之前的未定义行为都能把安全性提高。
2025-05-16 10:09 · 广东
回复
没有更多了

基础篇:JAVA基本类型

csc

Java Java 25 周年

架构师训练营第六周总结

陈靓-哲露

数据分析之AB testing实战(附Python代码)

JackTian

Python 编程 程序员 数据分析 AB testing实战

架构师训练营第六周作业

烟雨濛濛

11个提高产品经理工作效率的必备工具,果断收藏

马踏飞机747

大数据 设计 产品经理

iOS - CollectionViewCell对应不同flow layout的实例

teoking

ios

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

newbe36524

Docker .net core netcore ASP.NET Core

Vagrant 快速入门

FeiLong

vagrant

并行流ParallelStream中隐藏的陷阱

Throwable

Java

看动画学算法之:排序-冒泡排序

程序那些事

算法 动画 排序算法 轻松学

修炼我们的智慧之眼

J.Smile

认知提升

关于架构的几件小事:架构概述(1)

北风

架构 架构设计 架构师 架构设计原则

“新基建”来了!云南三年投资3776亿!

CECBC

北京区块链规划重点发展海淀朝阳通州等区,加大对代币监管力度

CECBC

北京行动计划 四个高地 需求导向 为政务服务

谈谈对分布式事务的一点理解和解决方案

Throwable

分布式 分布式事务 架构设计

list vs tupple

Leetao

Python 数据结构 Python基础知识

不会有人还不知道全文检索工具Lucene怎么用吧?文字长文教程

给你买橘子

Java 搜索引擎 lucene 程序员 开发工具

【计算机网络】网络层——路由器与路由选择协议

烫烫烫个喵啊

计算机网络 网络层

ARST Week7

时之虫

ARTS 打卡计划

云原生实践系列:概述

孤岛旭日

Serverless 微服务 Service Mesh 服务架构

架构师训练营第六周总结

烟雨濛濛

3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案

Throwable

Java 监控 Grafana Prometheus springboot

SpringBoot 入门:02 - 实现 MVC

封不羁

Java spring springboot

玛雅密码社区不忘初心 共筑未来通证新经济

Geek_116789

基础篇:Object对象

csc

Java Java 25 周年

DolphinScheduler-1.3.0-dev功能体验

Eights

大数据 hadoop

百万级别数据Excel导出优化

Throwable

架构设计 springboot

如何搭建Hive 环境

Rayjun

大数据 hive

架构师训练营第六周作业

Melo

SpringBoot2.x入门:应用打包与启动

Throwable

springboot

大话设计模式 | 4. 装饰模式

Puran

C# 设计模式

74 岁 C++ 之父最新蓝图:让代码更安全,还能兼容40年前的老程序!_编程语言_David Cassel_InfoQ精选文章