写点什么

MISRA C++:2023 已发布,一起来了解下 C++ 发展史及使用技巧

  • 2024-01-02
    上海
  • 本文字数:3777 字

    阅读完需:约 12 分钟

MISRA C++:2023已发布,一起来了解下C++发展史及使用技巧

MISRA C++:2023®——MISRA C++标准的下一个版本来了!为了帮助您更好地了解新版本,Perforce 带来了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写的 MISRA C++:2023 系列博客的第二篇。阅读第一篇请点击……


本篇文章将深入探讨 C++的历史、这门编程语言多年来的发展历程,以及下一步发展方向。

简介:C++历史


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


正因为如此,它在汽车行业等注重安全的应用领域很受欢迎,MISRA 是汽车行业最常用的编码标准之一。

一起来了解这门语言的精彩历史吧!

C++的起源


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


当 Stroustrup 在剑桥大学计算实验室撰写博士论文时,对 Simula 编程语言的程序组织和并发功能印象深刻,并用它编写了一个模拟器。然而,他发现该语言的实现并不能很好地扩展,因此最终用 BCPL 重写了该模拟器。

带类(Classes)的 C 语言


在 AT&T 贝尔实验室工作期间,Stroustrup 决定用他在 Simula 中发现的那些有用的语言特性来增强 C 编程语言。他开始编写一个前处理器 Cpre,将带有类似 Simula 类的 C 程序转换为可以用现有编译器编译的普通 C 代码。这种新语言最初被简单地命名为 "带类的 C 语言"。


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


带类的 C 语言提供:

  • 派生类

  • 公共/私有访问控制

  • 构造函数和析构函数

  • 调用和返回功能(由于不受欢迎,很快被删除)

  • 友元类

  • 函数参数的类型检查

  • 内联函数

  • 默认参数

  • 赋值运算符的重载

C++


在 C++发展历史的这一时刻,这门语言需要一个合适的名字。有一段时间它被称为 C84,但人们认为这个名字难听且容易混淆。最终,计算机科学家 Rick Mascitti 建议将其命名为 C++,这可以理解为该语言是 C 语言的继承者。


随着语言功能的不断增加,Cpre 预处理器已不再适用,于是一个名为 Cfront 的编译器应运而生。为方便起见,Cfront 仍能生成 C 代码,但它是一个正式的编译器,因为它能对语法和语义执行全面的检查,并生成程序的内部表示,每个范围有一个符号表。


新的语言特性包括:

  • 虚拟功能

  • 函数名称和运算符重载

  • 引用

  • 常量

  • 用户对自由存储器(堆内存)的控制

  • 改进了类型检查和 C++风格注释(实际上取自 BCPL)


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

C++的 2.0 版本


C++语言的第二个版本于 1989 年完成,提高了其定义和实现的稳定性。


C++ 2.0 增加了:

  • 多重继承

  • 类型安全链接

  • 改进了重载函数的解析

  • 赋值和初始化的递归定义

  • 改进的用户定义内存管理设施

  • 抽象类

  • 静态成员函数

  • 常量成员函数

  • 受保护的成员

  • 重载运算符->和指向成员的指针

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 的工作重点转移到了语言的开发和标准化上。《C++注释参考手册》于 1991 年出版,成为语言标准的起点。该手册提供了 C++的完整定义,而不仅仅是 Cfront 3.0 实现的功能,并经过了来自不同组织的许多人的审查。新功能包括命名空间、嵌套类和异常处理。

C++98


C++的 ANSI 标准化始于 1989 年,由惠普公司与 AT&T、DEC 和 IBM 联合发起。标准化该语言主要是由于这几个原因:添加重要的新功能,并防止不兼容方言的发展。1991 年,国际标准化组织开始了标准化工作,此后各委员会举行了联席会议。


其中一项重要活动是定义标准库,包括标准模板库(STL)。此外,它还增加了:

  • 实时类型信息(RTTI:dynamic_cast、typeid)

  • 协变返回类型

  • 强制转换运算符

  • Mutable

  • 布尔类型(Bool)

  • 条件声明

  • 成员模板

  • 类内成员初始值设定项(In-class member initializers)

  • 模板的单独编译(导出)

  • 模板部分专用化

  • 重载函数模板的部分排序

C++03 和嵌入式 C++


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

与此同时,日本嵌入式系统工具开发商联盟(包括东芝、日立、富士通和 NEC)提出了嵌入式 C++(EC++)子集。这是为嵌入式系统编程而设计的。该子集删除了那些可能影响性能或被开发人员认为过于复杂,从而被视为影响生产率或正确性的语言特性。


被禁用的功能有:多重继承、模板、异常、RTTI、新式投人和命名空间。此外,标准库中还删除了 STL 和 locales,并提供了 iostreams 的替代方案。有趣的是,EC++的使用并不多,而增加了模板的"Ectended EC++"超集更受欢迎。


作为对 EC++的回应,委员会发布了《性能技术报告》。该报告提供了一个模型,用于说明使用不同 C++语言和库特性所带来的时间和空间的开销。这样一来,它就解决了人们对性能问题的担忧。此外,它还提出了高效实施的技术。因此,国际标准化组织委员会没有批准 EC++。

C++11


这个版本引入了许多新的主要功能,因此对许多程序员来说,它就像是一种新的语言!


C++11 新增了:

  • 内存模型

  • 并发性

  • 自动和声明类型

  • 基于范围的 for 循环(Range-for)

  • 移动语义和右值引用

  • 统一初始化

  • 空指针

  • 常量表达式函数

  • 用户定义的文本

  • 原始字符串文本

  • 属性

  • Lambdas(拉姆达斯)

  • 可变参数模板

  • 模板别名(使用)

  • Noexcept

  • 覆盖和最终

  • 静态断言

  • Long long

  • 默认成员初始值设定项

  • 在构造函数中初始化

  • 枚举类


标准库也有了重大的补充。1998 年,Boost 组织成立,免费提供经同行评审的可移植 C++源代码库。Boost 库之所以重要,是因为它很早就提供了各种库功能,这样 ISO 标准就可以从中获益。内存模型是并发支持的重要基础,它提供了线程和锁。


移动语义可以提高效率,因为它消除了不必要的复制,而复制对于大型对象来说是昂贵的。它允许开发人员控制是否复制资源,或其所有权是否应转移到另一个对象,从而能够控制对象的生命周期和资源管理。

C++14


ISO C++委员会打算更改主要版本和次要版本,因此,C++14 的目标是完善 C++11。 它增加了:

  • 二进制文本(0b)

  • 数字分隔符

  • 变量模板

  • 函数返回类型推导

  • 通用 lambda

  • constexpr 函数中的局部变量

  • 移动捕捉

  • 按类型访问元组

  • 标准库中的用户定义的文本

C++17


在 C++14 小版本发布之后,C++17 本应是一次重大更新。遗憾的是,一些主要的预期功能(如概念和例程),并没有出现在这个版本中。


新的主要功能包括:

  • 类模板参数推导(推导指南介绍)

  • 结构化绑定

  • 内联变量

  • 折叠表达式

  • 条件下的显式测试

  • 保证复制省略

  • 更严格的表达式计求值顺序

  • 自动作为模板参数类型

  • 用于发现常见错误的标准属性

  • 十六进制浮点文字

  • “if onstexpr”


其中一些新功能体现了对函数式编程风格越来越多的支持。这方面的关键元素在 C++11 中已经由 lambdas 提供,但折叠表达式(一种使用运算符将参数列表缩减为单个值的方便符号)和推导指南增加了语言的函数式风格。

C++20


C++17 中没未能实现的主要功能在 C++20 中得以实现。因此,该版本向前迈进了一大步,相当于从 C++03 迈进了 C++11,可以说该版本是 C++17 应有的重大升级。


主要的新语言特性包括:

  • 协程(Coroutines)

  • 概念

  • 模块


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


模块提供了一种比基于预处理器(包括从 C 语言继承的文件机制)更好的模块化表达方式。协程提供了一种无栈机制,用于执行顺序代码的异步操作。概念是对模板参数的要求的命名集合,是模板接口的一部分。它们使指定模板的预期用途成为可能,并在不满足约束条件时,大大提高了编译错误的清晰度。与以前使用的"替换失败不是错误(Substitution Failure Is Not An Error)"做法相比,这样可以避免出现约束违规时产生的冗长和复杂的编译错误,是一项显著的改进。

C++的未来


自 1979 年迈出第一步以来,C++已经取得了长足的进步,并还在不断发展。


C++23 即将发布,并将进行小而重大的调整,而 C++26 的开发工作已经开始。


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

适用于 C++的值得信赖的 Perforce 静态分析


30 多年来,Perforce 的静态分析工具Helix QACKlocwork在保障 C、C++等语言的安全、可靠和高质量代码方面一直备受信赖。它们可以在您编写代码时识别缺陷、漏洞和合规性问题,并经过认证,可用于安全关键型应用。


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


作者简介:


弗兰克-范登博肯(Frank van den Beuken)

首席技术支持工程师,Perforce


作为技术支持专家,弗兰克在集成 Perforce 静态源代码分析解决方案以进行软件质量控制方面拥有超过 20 年的经验,服务于客户的软件开发环境。近年来,他专注于为各种编译器配置静态分析。他还提供代码质量培训和咨询服务。


Frank 拥有 Nijmegen 大学数学与计算科学博士学位,研究领域为系统规范语言。

文章来源:https://bit.ly/48wKF0G

用户头像

还未添加个人签名 2021-05-18 加入

分享DevSecOps解决方案最新动态,帮助您学习与使用Atlassian, Perforce, Whitesource, Cloudbees及龙智自研产品,实现软件研发的高度协同与自动化,提高交付效率与质量,并确保开发过程可追溯、可度量。

评论

发布
暂无评论
MISRA C++:2023已发布,一起来了解下C++发展史及使用技巧_MISRA C++:2023_龙智—DevSecOps解决方案_InfoQ写作社区