喜欢本篇文章速速💖点赞💬评论⭐收藏

MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写的 MISRA C++:2023 博客系列的第二部分。

在这篇博客中,我们将深入探讨 C++ 的历史、编程语言多年来的发展历程以及它的下一步发展方向。



简介:C++ 历史

C++是一种常用的通用编程语言,可以用它来编写高效的程序。

正因为如此,它在安全关键型应用领域也很受欢迎,例如汽车行业,MISRA是最受欢迎的编码标准之一。

让我们来看看这门语言的迷人历史。

C++是如何开始的

C++是由AT&T贝尔实验室的丹麦计算机科学家Bjarne Stroustrup于1979年发明的。它起源于对 UNIX 内核的分析,目的是研究它可以在多大程度上分布在网络上。

当 Stroustrup 在剑桥大学计算实验室撰写博士论文时,他对用于编写模拟器的Simula编程语言的程序组织和并发特性印象深刻。然而,他发现实现的扩展性不好,所以最终用 BCPL 重写了模拟器。

C 与类

在AT&T贝尔实验室的工作中,Stroustrup决定用他在Simula中发现非常有用的语言功能来增强C编程语言。他开始编写一个预处理器 Cpre ,将带有类似 Simula 类的 C 程序转换为可以使用现有编译器编译的常规 C 代码。这门新语言最初被简单地命名为“C with Classes”。

从一开始,目标就是让新语言可以用于 C 语言的所有用途,因此它是一种通用编程语言。此外,由于 C 编译器已经可用于许多平台,因此它继承了 C 的可移植性,这是迄今为止它的重要质量特性之一。该语言的另一个目标是为 C 语言的不安全特性提供更好的替代方案,同时保持其效率和对底层硬件特性的直接访问。

C提供的类:
• 类
• 派生类
• 公共/专用访问控制
• 构造函数和析构函数
• 调用和返回功能(由于缺乏普及,很快被删除)
• 友元类
• 函数参数的类型检查
• 内联函数
• 默认参数
• 赋值运算符重载

C++

在 C++ 历史上的这一点上,该语言需要一个专有的名称。一段时间以来,它一直被称为C84,但这被认为是丑陋和令人困惑的。最终,计算机科学家Rick Mascitti提出了C++这个名字,这可以解释为该语言是C的继承者。

随着更多的功能被添加到该语言中, Cpre 预处理器不再适用,因此编写了一个合适的编译器名称Cfront。为了方便起见,它仍然生成 C 代码,但它是一个合适的编译器,因为它对语法和语义进行了完整的检查,并生成了程序的内部表示,每个范围都有一个符号表。

新的语言功能包括:
• 虚拟功能
• 函数名称和运算符重载
• 引用
• 常量
• 用户控制的空闲存储内存控制
• 改进了类型检查和 C++ 样式注释(实际上取自 BCPL)

1986年,《C++编程语言》一书的第一版出版,根据 Cfront 1.0编译器描述了该语言。

C++ 版本 2.0

该语言的第二版于1989年完成,提高了其定义和实现的稳定性。
添加了 C++ 2.0:
• 多重继承
• 类型安全联动
• 改进了重载函数的分辨率
• 赋值和初始化的递归定义
• 改进了用户定义的内存管理功能
• 抽象类
• 静态成员函数
• Const 成员函数
• 受保护的成员
• 运算符重载 -> 和指向成员的指针的重载

C++ 版本 3.0

这是该语言标准化之前的最后一个 C++ 版本。C++ 3.0 于 1991 年完成,并添加了类和函数模板。C++ 4.0 应该在 1993 年发布,增加异常处理功能,1992年惠普完成了该功能的初步实现,但一直没有完成。

带注释的 C++ 参考手册

AT&T计划推出新的C++编译器计划从未实现,而其他C++编译器,包括商业编译器(包括Borland,IBM,DEC和Microsoft)和开源GNU编译器g++都出现了。因此,Stroustrup 的重点转移到了语言的开发和标准化上。1991 年出版 的《注释 C++ 参考手册 》成为语言标准的起点。该手册提供了 C++ 的完整定义,而不仅仅是 Cfront 3.0 实现的功能,并且来自不同组织的许多人都对其进行了审查。新特性包括命名空间、嵌套类和异常处理。

C++98

C++ 的 ANSI 标准化由 Hewlett-Packard 与 AT&T、DEC 和 IBM 于 1989 年共同发起。标准化语言之所以成为必要,有几个原因:增加重要的新特征,防止不兼容方言的发展。1991年,ISO标准化开始,从那时起,委员会举行了联席会议。

一项重要的活动是标准库的定义,包括标准模板库(STL)。此外,它补充说:
• 实时类型信息(RTTI:dynamic_cast、typeid)
• 协变返回类型
• 强制转换运算符
• 可变
• 布尔
• 条件声明
• 成员模板
• 类内成员初始值设定项
• 模板的单独编译(导出)
• 模板部分专用化
• 重载函数模板的部分排序

C++03 和嵌入式 C++

C++03 是 C++98 的维护版本,经过修订,并批准了技术勘误的更正。委员会也开始考虑C++0x。

与此同时,包括东芝、日立、富士通和NEC在内的日本嵌入式系统工具开发商联盟提出了嵌入式C++(EC++)子集。这是为嵌入式系统编程而设计的。该子集删除了可能损害性能或被认为对开发人员来说过于复杂的语言功能,因此被视为生产力或正确性风险。

被禁止的功能是多重继承、模板、异常、RTTI、新样式的强制转换和命名空间。此外,STL 和语言环境已从标准库中删除,并提供了 iostreams 的替代方案。有趣的是,EC++ 的使用并不多,添加模板的“扩展的EC++”超集更受欢迎。

作为对 EC++ 的回应,委员会发布了《性能技术报告》。性能技术报告提供了使用各种 C++ 语言和库功能所隐含的时间和空间开销的模型。在这样做的过程中,它解决了对性能问题的担忧。此外,它还介绍了有效实施的技术。因此,ISO 委员会不认可 EC++。

C++11

这个版本引入了许多新的主要功能,所以对于许多程序员来说,它感觉就像一门新语言!

C++11 添加了:
• 内存模型
• 并发
• Auto 和 decltype
• 范围
• 移动语义和右值引用
• 统一初始化
• 零点
• Constexpr 函数
• 用户定义的文本
• 原始字符串文本
• 属性
• Lambdas
• 可变参数模板
• 模板别名(使用)
• Noexcept
• 覆盖和最终
• Static_assert
• Long long
• 默认成员初始值设定项
• 在构造函数中初始化
• 枚举类

标准库也进行了重大补充。1998年,Boost组织成立,提供免费的同行评审的可移植C++源代码库。Boost 库很重要,因为其中很早就提供了各种库功能,因此 ISO 标准可以从使用中获得的经验中受益。内存模型是并发支持的重要基础,它提供了线程和锁。
移动语义可以提高效率,因为它消除了不必要的副本,这对于大型对象来说可能很昂贵。它允许开发人员控制是否复制资源,或者是否应将其所有权转移到另一个对象,从而完成对对象生存期和资源管理的控制。

C++14

ISO C++ 委员会打算对主要和次要版本进行更改,以便 C++14 旨在完成 C++11。它补充道:
• 二进制文本 (0b)
• 数字分隔符
• 变量模板
• 函数返回类型推导
• 通用 lambdas
• constexpr 函数中的局部变量
• 移动捕获
• 按类型访问元组
• 标准库中的用户定义的文本

C++17

在次要的 C++ 14 发布之后, C++17 应该是一个重大更新。不幸的是,一些主要的预期功能,如概念和协程,没有出现在这个版本中。
新的主要功能包括:
• 类模板参数推导(介绍推导)
• 结构化绑定
• 内联变量
• 折叠表达式
• 在条件下进行显式测试
• 有保证的副本省略
• 更严格的表达式计算顺序
• 自动作为模板参数类型
• 捕获常见错误的标准属性
• 十六进制浮点文字
• “if constexpr”

一些新功能是增加对函数式编程风格的支持的示例。这方面的关键元素已经由C++11中的lambdas提供,但折叠表达式(一种使用运算符将参数列表简化为单个值的方便表示法)和推导指南增加了语言的功能风味。

C++20

C++17 中没有的主要功能在 C++20 中添加。因此,这个版本向前迈出了一大步,与从 C++03 到 C++11 的步骤相当,所以我们可以说这个版本是 C++17 应该的重大升级。

主要的新语言功能包括:
• 推论
• 概念
• 模块

其他新的语言功能包括编译时计算支持、宇宙飞船运算符 <=>、并发性改进、指定的初始值设定项以及非类型模板参数中的类类型(还允许字符串文字作为模板参数)。此外,新的标准库功能包括范围、日期、跨度和格式。

模块最终提供了一种比基于预处理器的更好的表达模块化的方式,其中包括继承自 C 的文件机制。Coroutines为异步执行顺序代码提供了一个无堆栈机制,概念是模板参数上的命名需求集,是模板接口的一部分。它们可以指定模板的预期用途,并在不满足约束条件时大大提高编译错误的清晰度。与以前使用“替换失败不是错误”(SFINAE) 的做法相比,这是一个显著的改进,后者在违反约束时会导致长时间而复杂的编译错误。

C++的未来

自 1979 年迈出第一步以来,C++ 已经走过了漫长的道路,并且还在不断发展。

C++23 将很快发布,并进行了小但重要的调整,并且 C++26 的工作已经开始。

C++的受欢迎程度不断上升,其使用范围也在扩大——包括通过虚幻引擎创建虚拟现实 (VR) 应用程序,以及加密货币应用程序。

信任 C++ 的 Perforce 静态分析

30 多年来,Perforce 的静态分析工具 Helix QAC 和 Klocwork 因其安全、可靠和高质量的 C、C++ 等代码而备受信赖。我们的工具可在您编码时识别缺陷、漏洞和合规性问题,并经过认证可用于安全关键型应用程序。

Helix QAC 还提供合规性模块,用于执行 新的 MISRA C++:2023 指南。Perforce 计划在标准发布时提供完整的 MISRA C++:2023 合规性模块。

⬇️了解为什么Helix QAC是MISRA C和MISRA C++的最佳静态代码分析器,立即免费试用。⬇️
📩邮件至 marketing@polelink.com 📩

➕更多技术文章直播课程,敬请持续关注北汇信息➕
⬇️方案咨询、工具试用等 请平台私信/官网留言/邮件联络⬇️
📩邮件至 marketing@polelink.com 📩
Logo

获取更多汽车电子技术干货

更多推荐