【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:115111

评论

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

牛客网最新开源!共1600+页 ,堪称Java面试八股文的天花板

采菊东篱下

程序员 java面试

CST 电磁仿真计算时,为什么要关闭超线程?【操作教程】

思茂信息

cst cst使用教程 cst电磁仿真 cst仿真软件

[杂谈]百度飞浆环境配置

alexgaoyh

ubuntu gpu cuda cudnn PaddlePaddl

【参考设计】16芯串联电池包储能系统

元器件秋姐

芯片 电池 元器件 电源 驱动器

1个Java程序员需要具备什么样的素质和能力才可以称得上高级工程师?

Java永远的神

程序员 后端 架构师 java面试 Java性能优化

文档关键信息提取形成知识图谱:基于NLP算法提取文本内容的关键信息生成信息图谱教程及码源(含pyltp安装使用教程)

汀丶人工智能

nlp 知识图谱 信息抽取 命名实体识别 pyltp

Chrome分组插件

soap said

Chrome插件

Gamefi很有潜力?分析链游gamefi系统开发源码!

Congge420

构建高可用云原生应用,如何有效进行流量管理?

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

什么是产品路线图?如何做产品路线图规划

顿顿顿

Scrum 敏捷开发 敏捷项目管理 产品路线图

景区共享电动车合作带动景区新消费

共享电单车厂家

共享电动车投放 景区共享电动车 共享电单车厂家 校内共享电动车

CMake常用命令大全:提高项目构建效率

小万哥

程序员 面试 后端 C/C++ cmake

深度学习进阶篇-预训练模型[2]:Transformer-XL、Longformer、GPT原理、模型结构、应用场景、改进技巧等详细讲解

汀丶人工智能

人工智能 深度学习 nlp 预训练模型 Transformer

成功加冕!用友大易获评2023最佳招聘管理软件供应商

用友BIP

招聘

为什么说财务共享是财务数智化转型的基石?

用友BIP

财务共享

公网对讲SDK——对讲应用场景

anyRTC开发者

音视频 视频会议 指挥调度 快对讲 公网对讲

MobPush 合规指南

MobTech袤博科技

索信达两大营销创新产品获官方认可,都有哪些创新亮点?

索信达控股

什么是数字藏品|数字藏品系统开发源码?

Congge420

3种分页列表缓存方式,速收藏~~

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

财务共享中心释放企业“数据”生产力

用友BIP

财务共享

羊了个羊游戏|链游dapp系统开发方案

Congge420

一名开发者眼中的 TiDB 与 MySQL 的选择丨TiDB Community

PingCAP

MySQL 数据库 TiDB

又一开发者公布高分方案源代码,助力软件杯选手高效解题

飞桨PaddlePaddle

百度飞桨 中国软件杯

教你1分钟搞定2小时字幕

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 5 月 PK 榜

5人5月用容器技术保卫蓝天

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

对话 ONES 联合创始人兼 CTO 冯斌:技术管理者如何打造一支自驱型团队?

万事ONES

单机 T 级流量转发吞吐提升 5 倍,可编程负载均衡网关 1.0 上线

Baidu AICLOUD

负载均衡 可编程网关

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