写点什么

C++:后现代的系统编程语言

  • 2016-02-05
  • 本文字数:2343 字

    阅读完需:约 8 分钟

C++ 作为一门经典的编程语言,从上世纪八十年代起至今一直被广泛应用在系统开发和高性能计算领域。近几年来随着各种编程语言和范式的兴起,C++ 的身影渐渐淡出了人们的视野。但是作为一个仍在不断进步的语言,C++ 在最近几年飞速发展,已经具备了现代语言应有的特性,而且也有了许多已有的和正在进行的新的拓展。

经典的 C++

作为 C 语言的超集,一方面,C++ 集成了 C 在系统编程优点,能够精确的控制内存中的每一个 bit;另一方面,提供了丰富的抽象机制和编程范式,引入了面向对象、泛型编程和函数式编程等风格。因为这一点,C++ 拥有了与 C 媲美的运行时性能,另一方面,也简化了 C 语言带来的领域建模的难度。但是因为 C++ 的整体设计结合了多种风格,几乎相当于嵌套了几个小语言的一个庞大的系统,这也使得 C++ 的整体易学性和易用性上有些差劲。同时,由于标准库更新跟不上需求,在诸如 Concurrency/Network 等应用层的软件设计方面逐渐被 Java 等后来者取代。而且,各个 C++ 厂商对编译器的实现并没有完全参考 ISO 标准,也造成了很多跨平台可移植性和兼容性问题。

现代 C++

C++ 在最近几年进行了几次探索和蜕变,让整个语言变得更具备现代化的特色。

资源管理

RAII(Resource Aquiration is Initialization,资源获取即初始化)作为 C++ 的特色之一,被广泛地应用到 C++ 的程序中。RAII 通过堆对象的生命周期来控制资源(包括堆内存、文件句柄、网络连接等)的生命周期,使得资源管理变得更加自动化,同时也避免了引入垃圾回收带来的运行时负担。但这种模式有一个很重要的问题,就是当需要对资源进行共享时,需要做更多额外的工作来进行检查和同步等工作。

作为更现代的资源管理方式,C++11 中引入了两种智能指针,std::shared_ptrstd::unique_ptr。前者拥有线程安全的引用计数,后者则是通过所有权(owenrship)转移来控制资源的生存周期。C++11 中也引入了右值引用和移动语义,来避免资源传递的过程中的不必要的复制。

与 Rust 中的生命周期(Lifetime)和所有权(Ownership)的概念类似,C++ 的std::unique_ptr在每一次值传递的时候将自身持有的资源转移到赋值的目标,同时结合移动语义,将赋值过程进一步地优化。

Lambda

Functor 作为 C++ STL 的一个重要组件,也是 C++ 中被使用很多的一个功能。一个 Functor 其实就是一个重载了operator()的类的实例对象,这种对象配合 C++ 模版的行为,可以被简单看成一个函数来调用,所以被称为 Functor(函子)。但是,由于 C++ 对于匿名类和内部类支持并不够好,使用 Functor 必须提前进行设计。一方面不方便使用,另一方面,定义和使用分离,对代码的组织和理解也造成了一定的困难。

首先,lambda 作为 Functor 的替代品,解决了不能即时定义并使用的问题。配合 STL 中的容器和算法,lambda 也能将 C++ 的函数式风格发挥到极致。其次,出于 C++ 一贯对性能和抽象的考虑,引入了 lambda capture 的概念,使得对象的生命周期能够绑定到 lambda 表达式,也就能够构建出闭包对象(closure)。另外,C++14 中加入的 generic lambda,增强了 lambda 的类型推导算法,在不损失类型安全特性的基础上,让组合式编程(Combinator–based Programming)更加易于实现。

并发

在 C++ 设计的初期,并发并未作为核心的语言特性考虑在内。并且,线程等并发模型在不同平台之上也有各种不同的实现,构建一个统一的并发模型也很困难。

C++11 中重新设计了 C++ 的内存模型,在保持原有兼容性的基础之上加入了并发的内容。同时标准库中也加入了线程(<thread>)、信号量(<condition_variable>)、互斥锁(<mutex>)和原子操作(<atomic>)等内容。同时也在此基础上封装了future/promise模式和async等操作。

元编程

C++ 自身对元编程提供了良好的支持。作为主要组件之一的模版,提供了编译时的数值计算和类型计算。但一方面由于使用模版减慢编译速度,另一方面,在使用模版的时候,非常难以调试和排错,这让很多人望而却步,甚至对基于模版的 STL 组件也有一种畏惧感。

C++11 中对元编程支持做了加强。首先是把 type traits 作为标准库引入,能够给模版提供一套直观的约束,也让类型作为 C++ 中的第一类值(first-class value)存在;另外 constexpr 的引入简化了编译时的值运算,配合用户自定义字面量(user-defined literals)以及可变参数模版(varadic template/parameter pack)等特性,让 C++ 能够更方便地定义内部 DSL。

Bright Future

作为一门经典的编程语言,C++ 至今还在不断地更新着。即将到来的 C++17 中,正在筹备着这些重要的特性:

  • 更丰富的标准库:C++ 中对 File System、Network 等重要的组件进行了标准化的支持,
  • Module TS:模块化提案,用于替代继承自 C 语言的头文件,简化 C++ 的编译模型和模块依赖,
  • Concepts TS:用于增强类型约束和类型推导,同时也简化模版的用法,
  • Reflection TS:提供编译期静态反射的支持,简化和增强 type traits,提供更丰富的元编程功能。

Conclusion

可以看到 C++ 发展至今一直都走在时代的前列线上。一方面,增加了更多适合应用和系统开发的组件,另一方面,通过语言特性的扩充来简化抽象复杂度。作为这样一个兼具新生特性和历史责任的编程语言,足以预见其应用的广度;同样,更多的系统级开源项目,像 Mesos 等,也选择 C++ 作为主要的编程语言。有足够的理由让我们相信,C++ 正在重获新生。

编后语

《他山之石》是 InfoQ 中文站新推出的一个专栏,精选来自国内外技术社区和个人博客上的技术文章,让更多的读者朋友受益。本问转载自《TW 洞见》。文章推荐可以发送邮件到editors@cn.infoq.com。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-02-05 17:115384

评论

发布
暂无评论
发现更多内容

JVM Sandbox入门教程与原理浅谈

Zhendong

Java JVM

浅谈MVC、MVP、MVVM框架模式

闫同学

mvc MVP MVVM 11月月更 框架模式

Java Web(九)会话跟踪技术

浅辄

javaWeb session Cookie 11月月更

秒云加入OpenCloudOS操作系统开源社区,携手打造更智能、更可控、更可信的云原生环境

MIAOYUN

开源社区 opencloudOS

数据预处理和特征工程-特征选择-Embedded嵌入法

烧灯续昼2002

Python 机器学习 算法 sklearn 11月月更

【愚公系列】2022年11月 微信小程序-app.json配置属性之Worker

愚公搬代码

11月月更

从0开始,让你的Spring Boot项目跑在Linux服务器

闫同学

spring Linux 服务器 11月月更

AI音乐创作,让每一个人都成为音乐家

HarmonyOS SDK

音频 HMS Core

泛型由入门到精通(3)

好程序员IT教育

Java 泛型

工信部电子五所李冬:在龙蜥社区的一站式自动化测试平台的探索和实践|2022云栖龙蜥实录

OpenAnolis小助手

开源 操作系统 自动化测试 龙蜥社区 2022云栖大会

构建高质量的持续交付体系

老张

软件工程 持续交付

分布式事务详解、理论分析、及强一致性(2PC、3PC)剖析

C++后台开发

数据库 分布式 后端开发 Linux服务器开发 C++开发

Kotlin变量声明和类型推断

子不语Any

kotlin Andriod 11月月更

4K60帧!RayLink远程控制软件如何帮助设计师远程办公?

RayLink远程工具

远程控制软件 远程办公软件 远控软件 远程桌面连接 RayLink

湖仓一体架构下的数据研发及管理

数造万象

EMI 滤波电路是由哪些元件组成的,一文看懂!

元器件秋姐

元器件采购 元器件电商 EMI滤波电路 滤波电路 元器件知识

深入浅出学习透析Nginx服务器的基本原理和配置指南「初级实践篇 」

洛神灬殇

nginx 正向代理与反向代理 11月日更 nginx 开源版 开发指南

浅析云原生

鲸品堂

甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩

阿里巴巴云原生

阿里云 Kubernetes 云原生 AHPA

基础逻辑门

芯动大师

Verilog 11月月更 Xilinx

MySQL事务的隔离级别以及脏读、幻读和不可重复读

闫同学

MySQL 事务 11月月更

【Go电商实战04】为什么GoFrame不支持migrate功能?我还特意去问了框架作者

王中阳Go

golang 高效工作 学习方法 程序员 11月月更

从HelloWorld看Java与Kotlin

子不语Any

kotlin Andriod 11月月更

九科信息受邀参加中国总会计师协会财务数智化转型研讨会

九科Ninetech

mysql的高可用方案以及优缺点

想要飞的猪

精益创业者的用户体验设计

产品海豚湾

产品经理 产品设计 精益思想 用户体验 11月月更

Thymeleaf入门教程

Studying_swz

前端 thymeleaf 11月月更

泛型由入门到精通(2)

好程序员IT教育

Java 泛型

数字化转型有可能让所有人满意吗?

优秀

数字化转型

阿里云弹性计算总经理张献涛:智能化、高效能、新交互将重塑互联网

云布道师

弹性计算 云栖大会

谈谈我对服务网格的理解

阿里巴巴云原生

阿里云 云原生 服务网格

C++:后现代的系统编程语言_语言 & 开发_刘清_InfoQ精选文章