`
javasee
  • 浏览: 965090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++的精英化趋势与两个关键缺陷 .

 
阅读更多

C++是一门引起无数争议的语言。

眼下最常听到的声音则是C++将趋于没落,会被某某语言取代。

我很怀疑这种论调的起点是商业宣传,C++的真实趋势应该是越来越倾向于精英化。

 

精英化是指在可用可不用C++的领域中,C++将逐渐退出,

而所有剩下必须用C++的领域通常都是附加值比较高,难度较高的领域,比如:操作系统,数据库,大型网站后端等。

这一过程造成的现象就是在TIOBE上,C++的份额逐步下降。

 

但就像经济上挤泡沫一样,这倒不是C++衰落了,而是原本人们对C++的期望过高了。

早在1995年,美国的调查机构就曾经预测:“终端用户”编程从从业人员比率上将占94%,而“基础结构”编程从业人员只占1.5%不到。

(参见《软件成本估算:COCOMOII模型方法》)

C++本来就不适合“终端用户”这种涉众很多的项目,比如物流程序,而适合对性能要求较高的基础结构项目,比如OS,大型数据库等。

(根据Google的测试,C++的performance远高于其他语言

只是当年OO很火的时候,大家又没有什么别的选择,就一窝蜂的用,实际上很多程序确实不适合用一个没有垃圾收集的程序来写。

这里有一份统计列表,大家可以自己看看,当前C++的主战场是那里。

The Programming Languages Beacon(这个表告诉我们:IT行业的骨头是C/C++做的)

这导致的结果就是修炼C++的程序员必须往高端走,你要么找不到工作,要么就找到很好的工作。

而不像其他语言,大差不差还能混口饭吃。

这个趋势不好绝对化,但估计在未来会被强化。TIOBE上C++的份额跌得越多,这个趋势强化的越厉害。

 

短时间完全看不到C++退出历史舞台的可能性,只要硬件还是软件的基础:

例1:网站A和网站B类似,用C++可以让速度提升30%,你感觉这个网站会选择语言的易用性,还是会选择速度?

例2:公司A要开发一个新的软硬结合的产品,你感觉他会先开发一个虚拟机,再开发产品,还是会直接基于硬件上封装驱动后开发程序?

 

两个关键缺陷

这两个关键缺陷分别是语言的过度复杂和标准库的过度苍白。

 

C++语言过于复杂在业界是共识。

一个指针就使C++比关键字数目相同的语言复杂许多,导入模板后各种应用精巧的应用使这门语言进一步复杂化,个人感觉C++0x使这复杂性又升华了。

Google在公布的C++ Coding Rule开篇就说:

As every C++ programmer knows, the language has many powerful features, but this power brings with it complexity, which in turn can make code more bug-prone and harder to read and maintain.

这里也就不多说了,但贴几个好玩的句子:

 

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." -- Bjarne Stroustrup

Stroustrup还是挺搞的,意译下:C语言让人很容易开枪走火打到自己的脚,C++让走火发生的可能性降低,但一旦走火,你的腿就没了。)

"IMO, good C++ code is better than good C code, but bad C++ can be much, much worse than bad C code." -- John Carmack.

 

C++标准库的苍白倒值得多说一点

不知道没用过C++的人是否能想象,这个世界上还有一门语言的标准库里甚至不覆盖正则表达式和XML。

C++就这样,并且还将持续这样。我专门查了一下,C++0x里好像终于有正则了,但还没有XML的库。

(不用提醒,我也知道boost里有,但boost不是标准库。)

 

C++本身不缺库,并且还都是大佬级的,如:OpenCV,OpenMP,ACE,MPICH2等。

随便那一个都是一方诸侯,如果你没用过OpenCV和OpenMP这些东西,第一次用一定会有点震撼,但关键是标准库不太行。

从这个角度看C++0x方向走错了:锦上添花的事做了不少,雪中送炭的事上不太给力。

 

感想

C++语言已经无法简化,如果编译器能够提供可定制编译也许对这个语言会有帮助。

比如:设定某个选项后,C++就变成了有对象的C。设置某个选项后,多重继承就不支持了。

也许有编译器可以这样,但我确实还不知道。

 

再不行,自己定个规则使用C++的特定子集吧。

0
0
分享到:
评论

相关推荐

    C++标准库(第二版)英文版.pdf

    The C++ Standard Library A Tutorial and Reference (2nd Edition)+cppstdlib-code.zip C++标准库(第二版)英文版.pdf 非扫描版+源代码 Prefaceto the SecondEdition xxiii Acknowledgments for the Second...

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    C++源码 使用Ffmpeg 获取 视频流中的关键帧

    提供的压缩文件中包含两个版本:`ffmpeg-4.0-win64-shared.zip`是预编译的共享库,可以直接在项目中引用;`ffmpeg-4.0-win64-dev.zip`包含了开发所需的头文件和静态库,用于编译时链接。将这两个文件解压后,需要将...

    7本经典C++教程PDF打包.rar

    这个压缩包"7本经典C++教程PDF打包.rar"包含了七本深入学习C++的教程,是提升C++技能的理想资源。以下是这些教程可能涵盖的一些关键知识点: 1. **基础语法**:C++的基础包括变量、数据类型、运算符、流程控制(如...

    Visual C++实践与提高-ActiveX篇.pdf

    Visual C++实践与提高-ActiveX篇.pdf Visual C++实践与提高-ActiveX篇.pdf

    c++实现socket:一个服务器对应多个客户端相互传递信息

    在提供的压缩包文件中,`client`和`server`两个文件可能分别包含了客户端和服务器的源代码。客户端通常会包含连接到服务器、发送和接收数据的功能,而服务器则会包含上述的监听、接受连接和多线程处理逻辑。通过分析...

    gcc-c++-4.4.7-16.el6.x86_64.rpm

    warning: gcc-c++-4.4.7-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: gcc = 4.4.7-3.el6 is needed by gcc-c++-4.4.7-3.el6.x86_64 libstdc++ = 4.4.7-...

    Dev-C++ 6.0(更名为Smart-C++ 1.2.5.174)

    总的来说,Smart-C++ 1.2.5.174是面向编程竞赛者的一款定制化IDE,它集成了多种实用工具,并对Dev-C++的基础功能进行了强化,旨在为参赛者提供一个高效、便捷的编程环境。尽管它的发布违背了原作者的意愿,但其对...

    王桂林老师 c++基础与提高.pdf

    王桂林老师编写的《C++基础与提高》是一本系统讲解C++编程语言的书籍,其中详细介绍了C++的发展背景、应用领域以及与C语言相比扩展出的新特性。以下是根据书中内容整理出的详细知识点: 1. C++的综述:C++由Bjarne ...

    Boost.Asio C++ Network Programming.pdf

    标题《Boost.Asio C++ Network Programming》和描述表明本文档是一本关于使用Boost.Asio库进行C++网络编程的电子书。网络编程是一项要求严谨的复杂任务,涉及底层的网络通信和协议处理。Boost.Asio提供了一种简便的...

    C++ JSON 序列化代码

    JSON(JavaScript Object Notation)是一种轻量级的...总之,C++ JSON序列化是一个关键的编程任务,涉及到数据类型的转换和JSON库的使用。通过理解和实践,开发者可以更有效地在C++应用程序中利用JSON进行数据交换。

    基于QT实现的缺陷检测系统c++源码含图像检测+目标检测支持ONNXRuntime加速.zip

    基于QT的缺陷检测系统,包括图像检测以及目标检测两个部分。 图像检测包括二值化和边缘检测以及图像矩运算,目标检测使用ONNXRuntime推理yolov5s训练模型,支持GPU加速。 支持奥比中光工业相机检测、视频检测以及...

    深入应用C++11 代码优化与工程级应用.pdf

    祁宇 深入应用C++11 代码优化与工程级应用.pdf

    基于QT的缺陷检测系统c++源码(包括图像检测+目标检测两部分,支持ONNXRuntime加速).zip

    基于QT的缺陷检测系统c++源码(包括图像检测+目标检测两部分,支持ONNXRuntime加速).zip 基于QT的缺陷检测系统c++源码(包括图像检测+目标检测两部分,支持ONNXRuntime加速).zip 基于QT的缺陷检测系统c++源码...

    C++的文件 windows.h头文件

    C++的文件 windows.h头文件

    C++C++C++C++C++C++C++

    C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++

    求两直线相交的交点C++源代码

    在源代码中,首先定义了两个结构体`FloatPoint`和`Line`来表示点和线: ```cpp typedef struct FloatPoint_struct { float x; float y; } FloatPoint; typedef struct Line_struct { FloatPoint Start; Float...

    c++ 连接mysql依赖库 mysqlclient.lib libmysql.lib mysql.h

    首先,`mysqlclient.lib`和`libmysql.lib`是MySQL客户端库的两个关键部分。`mysqlclient.lib`提供了连接到MySQL服务器、执行SQL查询、处理结果集等功能的函数声明。而`libmysql.lib`则包含了这些函数的实际实现,它...

Global site tag (gtag.js) - Google Analytics