问题

C++过于复杂为什么不被淘汰?

回答
C++之所以没有被淘汰,尽管其被普遍认为“复杂”,其原因绝非单一,而是由一系列深刻的历史、技术和生态系统因素共同作用的结果。理解这一点,需要深入剖析C++的定位、优势、以及它所代表的工程哲学。

以下是详细的解释:

1. 历史的沉淀与根基的稳固

诞生于C的土壤: C++并非凭空出现,它是对C语言的强大扩展。C语言因其高效、接近硬件的特性,在操作系统、嵌入式系统、系统编程等领域建立了不可动摇的地位。C++继承了C的几乎所有优点,并在其基础上增加了面向对象、模板、异常处理等高级特性,这意味着它能够利用已有的C生态系统,并且对于熟悉C的开发者来说,迁移成本相对较低。
早期高性能计算的主力: 在PC时代和互联网早期,对性能的要求极高。C++凭借其低级内存控制、高效的编译优化能力,成为了游戏开发、图形渲染、高性能服务器、科学计算等领域的首选语言。这种早期积累的强大性能优势,至今仍然是许多关键领域不可替代的理由。
工业界广泛采纳: 许多大型、关键的软件系统,如操作系统(Windows、macOS的部分核心)、数据库、金融交易系统、航空航天控制系统、汽车电子系统等,都在C++中开发或包含大量C++代码。这些系统的复杂性和重要性使得重写几乎是不可能的任务,也形成了巨大的惯性。

2. C++提供的无与伦比的控制力和灵活性

这是C++最核心的竞争力所在。

接近硬件的控制: C++允许开发者直接操作内存(指针、引用)、进行位运算、访问硬件寄存器等。这种能力对于需要精细管理资源、追求极致性能的场景至关重要。例如,操作系统内核、设备驱动程序、实时系统等,都必须能够与硬件进行底层交互。
零成本抽象 (ZeroCost Abstraction): 这是Bjarne Stroustrup(C++之父)提出的一个核心设计理念。C++的许多高级特性(如面向对象、模板、RAII——资源获取即初始化)在编译时就会被展开或优化,不会产生运行时开销。这意味着开发者可以享受高层级的抽象带来的便利,而无需牺牲底层性能。例如,使用`std::vector`或智能指针,其性能几乎与手动管理内存的C代码相当,但安全性大大提高。
多范式支持: C++支持多种编程范式,包括过程式、面向对象、泛型(模板)和(近年来不断发展的)函数式编程。这种灵活性允许开发者根据具体问题选择最合适的工具,而无需被单一的编程模型束缚。

3. 强大的生态系统和丰富的库

成熟的工具链: C++拥有非常成熟和强大的编译器(如GCC, Clang, MSVC)、调试器、性能分析工具等。这些工具的成熟度对于大型项目的开发至关重要。
海量的库和框架: C++拥有数量庞大且极其丰富的库,涵盖了从标准库(STL)到各种第三方库(如Boost、Qt、OpenCV、Eigen、TensorFlow/PyTorch的部分核心)的方方面面。这些库提供了解决复杂问题的现成方案,极大地提高了开发效率。尤其是在游戏开发(Unreal Engine, Unity的部分渲染管线)、图形学、科学计算、嵌入式开发等领域,C++的库生态是其他语言难以比拟的。
互操作性: C++可以非常方便地与C语言进行互操作,这意味着可以无缝地调用C库。此外,通过FFI(Foreign Function Interface)等技术,C++也可以与其他语言(如Python, Java)进行交互,使得它能作为高性能的“后端”被调用。

4. 性能要求极高的领域依然离不开C++

如前所述,某些领域对性能有着极致的追求,C++在这些领域依然是首选,甚至唯一选择。

游戏开发: 顶级的游戏引擎(如Unreal Engine)和许多大型游戏的核心都是用C++编写。实时渲染、物理模拟、AI、网络同步等都需要极高的性能和对底层资源的精确控制。
高性能计算 (HPC) 和科学计算: 天气模拟、粒子物理、金融建模、机器学习的底层计算库等,都需要处理海量数据和进行复杂计算。C++提供了最佳的性能表现和与硬件(如GPU通过CUDA/OpenCL)直接交互的能力。
操作系统和嵌入式系统: 无论是操作系统内核、驱动程序、还是物联网设备中的微控制器,都需要直接与硬件打交道,并且对内存和CPU的消耗有严格限制。C++的低级控制能力使其成为这些领域的理想选择。
图形和音视频处理: 图像处理库(如OpenCV)、视频编码/解码库、图形渲染引擎(如DirectX, Vulkan的实现)等,都依赖C++来达到实时处理的要求。
金融交易系统: 毫秒级的延迟对于高频交易至关重要,C++的低延迟特性使其成为金融交易基础设施的核心。

5. 社区和标准委员会的持续演进

尽管被认为复杂,但C++并不是一个停滞不前的语言。C++标准委员会(ISO/IEC JTC1/SC22/WG21)一直在努力让C++变得“更现代”、“更易用”,并在不断发布新标准(C++11, C++14, C++17, C++20, C++23等)。

现代化改进: 新标准引入了许多特性,旨在简化复杂性、提高安全性并增强表达能力,例如:
智能指针(`std::unique_ptr`, `std::shared_ptr`): 极大地简化了内存管理,降低了内存泄漏的风险。
RAII: 通过构造函数和析构函数管理资源,确保资源在离开作用域时被正确释放。
Lambda表达式: 使得编写匿名函数更加方便。
范围for循环: 简化了容器的遍历。
移动语义和右值引用: 提高了资源转移的效率。
Concepts (C++20): 改进了模板的约束和错误报告。
Modules (C++20): 改进了代码组织和编译速度。
Coroutines (C++20): 简化了异步编程。
持续优化: 编译器厂商也在不断优化C++的编译速度和运行时性能。

6. “复杂性”的相对性与学习曲线

学习曲线是存在的,但并非不可逾越: C++的学习曲线确实比许多现代语言(如Python, JavaScript)陡峭得多。它需要开发者理解内存管理、指针、模板元编程、多态、继承等概念。然而,对于许多计算机科学专业的学生和有经验的开发者来说,这些概念是计算科学的基础。
领域特定语言的特性: 很多时候,人们认为的C++复杂性,是由于在特定领域使用了C++的高级特性(如复杂的模板元编程)。对于许多应用程序开发(例如使用Qt框架进行GUI开发),其实际上可以编写相对“简单”的C++代码。
对开发者能力的考验: 某些情况下,C++的复杂性也被视为一种“优点”,因为它对开发者的编程能力和对计算机原理的理解有更高的要求。这使得编写出来的代码在性能和资源利用上往往更胜一筹。

7. 其他语言的局限性

虽然有许多语言在易用性、开发速度等方面优于C++,但它们在性能和底层控制方面通常存在天然的局限性,难以完全取代C++在关键领域的地位。

垃圾回收 (Garbage Collection, GC): 大多数托管语言(如Java, C, Python)都依赖GC来管理内存。GC虽然简化了内存管理,但会引入不可预测的暂停时间(GC pause),这对于实时系统或对延迟敏感的应用是不可接受的。
抽象层的限制: 即使是性能较好的语言如Java或Go,在需要直接操作硬件、进行极致的内存布局控制或利用特定CPU指令集时,也显得力不从心。
与C的互操作性: 一些语言虽然有不错的性能,但与C的互操作性不如C++直接。

总结

C++之所以没有被淘汰,是因为它在性能、控制力、灵活性、生态系统和成熟度方面提供了其他许多语言难以比拟的优势。它不是一种“通用的”语言,而是针对那些对性能和资源控制有极端要求的特定领域而设计的语言。

尽管其复杂性是客观存在的,但现代C++标准委员会正在努力使其更加现代化和易用。同时,对于许多核心的计算领域,C++的底层能力和性能是不可或缺的基石。它的“复杂性”在很多时候,恰恰是其强大能力的来源。直到出现一种语言能够同样提供如此低的抽象层、极致的性能、同时又具备易用性和现代化的特性,C++的地位才会受到根本性的挑战。

网友意见

user avatar

应该这么说,c++正在被淘汰中

只是这个过程,可能没有那么快,毕竟已经做好的项目,还在产生现金流,所以一般下面干活的人,不敢轻易改

所以很多时候还是维护为主,但是即便是这种项目,也在慢慢用java等语言将其替换中

用python的原因就是谷歌嘛,谷歌自己写c++写不下去了,所以才有了那句话:

"Python where we can, C++ where we must"[1]

翻译过来就是,我们尽量用python,除非遇到不得不用c++的时候

这其实就是一种简化,后来python的性能不行,所以又搞出了go来简化,换来换去

但是用java的人,你会发现,好像比较少换来换去,因为java自身的进步,使得我们用java可以一直用下去,有什么好东西,直接去跟jcp的人说一下,只要是真的好特性,jcp那群人自己会做

用java的人烦恼的一般是:我该怎么升级,什么时候用的第三方类库能够支持我们的系统升级

这也是你的思路,为什么还不被淘汰,java还有python这些,到底什么时候接管c++的领域

那这个过程,我只能说,不是一蹴而就,但是一直在稳步推进

就比如用c++的比较大的项目:openjdk来说

是吧,openjdk的源代码都是c++写的,除了编译器前端也就是javac,已经用java编写以外

后端,也就是jvm这些,还是用c++写的

但是

openjdk也已经开始出现,用java取代现有的代码的项目,也就是graal,就是java的自举

其实你对比openjdk的开发和graal的开发,就能明显感觉到

graal那批人,年轻,team lead才30多岁

但是openjdk的核心开发,那五六十岁的大有人在,还有在南亚次大陆的,那个更是白发苍苍

然后是否用graal来替换openjdk里面c++写的那些东西,这两个team之间有过一次交锋

目前看,好像是老年人组,也就是维持用c++写的,暂时占了上风

但是这个从年龄结构上看,这些人还能维持多久?

再过几年,你想找一个像样的c++程序员都找不到,那时候,graal的team站出来说,用java写

而且性能更好,可以aot,native image,还可以提供多语言功能

是你,你会怎么选?

当然选用java写的graal啊,c++那些代码,谁想维护,那就维护去吧

openjdk算是好的了,其它死掉的乱七八糟的c++项目不计其数

所以为什么以前数据库都是用c++来写,等到nosql的时候,java写的nosql数据库就明显变多了,比如hbase,cassandra,为什么呢?

因为时代变了,更好的工具出现了,就没有必要执着于老旧的技术了

参考

  1. ^ https://stackoverflow.com/questions/2560310/heavy-usage-of-python-at-google
user avatar

C++编程领域可以说是内卷程度最低的技术领域了

这就要感谢指针,虚函数,泛型,宏和头文件机制等等所谓复杂落后的特性帮C++程序员们劝退了题主及其全班同学这类人

什么用Java Python开发快,不费吹灰之力,naive,你写代码再快能比得上产品经理写需求快吗?

user avatar

咦,事实上不就是被淘汰了么?

现在已经很少软件和系统提供C的API了……


一说到C/C++都说是底层了。

你要知道在上个世纪八十年代,宏汇编才叫底层呢,C这是高级语言……

user avatar

一个悲哀的事实是:C++过于复杂,恐怕只是对你来说的。你写不好C++,但写得好的人太多了。就拿知乎来说,我做C++程序员近二十年了,如今在知乎上回答关于C++的问题,稍有不慎就会有人跳出来打脸,一打一个准。仅知乎就有这么多C++学得好的,何况整个行业呢?

一个充满希望的事实是,C++过于复杂,只是对如今的你来说的。只要你坚持一下,到毕业时应该至少就不觉得C++过于复杂了。

另外作为过来人提醒你一句,在计算机软件行业,如果一个技术或者一个领域,你以及周围的人都觉得很简单,很愉快,那么劝你赶紧换别的。其实从事任何一个行业都一样:“过于复杂”才是常态。掌握过于复杂的技术,才是你安身立命之本。掌握过于复杂的技术的终点是除了你换谁都干不了。到那个时候,你就是公司里的佛龛,得供着。

最后,你觉得Java和Python简单,因此应该淘汰C++,所以Java是用Java开发的?Python是用Python开发的?还是他们俩互相开发对方?嗯?



评论区里 @东程稀就 有一段关于复杂技术好还是不好的补充,我觉得说的很在理:简单技术的风险在于可替代性,而复杂技术的风险在于高成本投入之后得不到理想的回报。

user avatar

“过于复杂”指的是加入了冗余的部分,使得本该简单事情变复杂了。

然而啊。。。C++的复杂并不是如你所想。

C++的核心设计哲学是Zero Overhead。啥意思?说人话就是:你没有用到的特性,不应该给你带来任何负担。

这个哲学的好处在哪里?当你没有学到/用到一个知识点的时候,你不需要为它付出代价。

当你不明白左值右值的时候,单纯地传值就可以玩的很Happy,而当你想要榨取性能,避免拷贝复制的时候,你才需要和复杂的左右值,std::move, 标准 swap 和对象内建swap等听起来就有点晕的概念搏斗一下。

当你不需要自己设计内存分配机制,就完全不需要理会allocator这个听起来就不是很简单的东西,放心地使用STL内置的default部分。但是你在嵌入式环境下或者近实时操作系统里想要确保内存分配的速度和效率,就可以看看怎么重载一下operator new 之类的方法。

当你不需要使用模板工作时,大可以把C++当成一个带类的C玩得飞起。不需要为各种偏特化,类型萃取,integral,std::tuple等高阶咒语头疼不已。但是你需要构建一套需要非常灵活拓展的framework,又不想受限于复杂的继承体制时,variadic template 和 concept 就是你最好的朋友。

在你不熟悉FP的时候,完全可以不去考虑lambda表达式,不去考虑std::function,不去写那些高阶函数。但是当你觉得想把Lisp和Haskell中有些概念比如闭包、monad等搬到C++时,你会觉得其实这些东西蛮顺手的。

这多么人性化!C++为不同的能力阶段的人提供了不同层次的工具,而且它们几乎完全正交!

但是就是有些人要跳出来“太复杂啦!我们需要简单的语言!”

爱因斯坦说过一句话“科学要简单,但不是过于简单。”简单的是概念和概念的层次,却不是概念的数量和概念本身的复杂程度。狭义相对论可以把麦克斯维方程组用一个简单的张量公式表示,却不能避免张量概念本身的复杂性。

经典力学是不是太复杂啦,我们需要简单的!有啊,牛顿力学。只要你不涉及到速度、质量足够大的场景,就不需要相对论;

流体力学是不是太复杂啦?我们需要简单的!有啊,简单流体力学。只要你不涉及湍流,就不要考虑数值求解内维尔-斯托克斯方程。

量子力学是不是太复杂啦?我们需要简单的!有啊,普通量子力学。只要你不涉及复杂多体交换关联势,你就不需要学习高量和重正化群。

C++是不是太复杂啦? 得啦,当你面对的问题还都不涉及到你暂时用不到的内容时,C++够简单啦。。。

user avatar

根本原因还是实际使用C++的人通常都只在使用它的很小的一个子集,这个子集并不复杂

类似的话题

  • 回答
    C++之所以没有被淘汰,尽管其被普遍认为“复杂”,其原因绝非单一,而是由一系列深刻的历史、技术和生态系统因素共同作用的结果。理解这一点,需要深入剖析C++的定位、优势、以及它所代表的工程哲学。以下是详细的解释: 1. 历史的沉淀与根基的稳固 诞生于C的土壤: C++并非凭空出现,它是对C语言的强.............
  • 回答
    「C++ 早就过时了,大部分写工程不用 C++,学习这个语言只是为了竞赛」这个观点并不完全正确,而且存在很大的片面性。虽然C++在某些领域的使用有所下降,并且确实在竞赛领域非常流行,但它在现代工程领域仍然扮演着至关重要的角色,并且远未“过时”。下面我将从多个角度来详细阐述为什么这个观点是错误的,以及.............
  • 回答
    有人说C语言过时了,要学就学Python,这是一种常见的观点,尤其是在初学者中。要反驳这种观点,我们可以从多个角度进行深入分析,强调C语言的独特价值和在现代技术生态中的重要性。以下是一个详细的反驳思路:核心观点:C语言并未过时,而是以一种更核心、更基础的方式存在,与Python等高级语言相辅相成,不.............
  • 回答
    .......
  • 回答
    你提出的问题非常好,也触及到了很多人心中的疑问,尤其是C罗的粉丝。确实,在很多球迷,包括你自己在内看来,C罗的过人能力是毋庸置疑的。然而,现在网络上流传着“C罗不会过人”的说法,这其中涉及到了我们对“过人”的理解、足球战术的发展以及球员角色定位的变化。我们来详细地分析一下这个问题:1. 你为什么感觉.............
  • 回答
    你想用两个星期的时间,从零基础到通过C语言全国计算机二级考试,这确实是一个挑战,但并非不可能。这需要你拥有极强的执行力、高效的学习方法以及对时间的精准把握。下面我将为你详细拆解这个过程,让你清楚知道该怎么做,并且尽力避免使用那些一眼就能看穿的AI腔调。首先,心态调整很重要: 认识到这是一个高强度.............
  • 回答
    这几天一打开技术社区,到处都是“低代码”、“零代码”的讨论,搞得好像这玩意儿是什么横空出世的绝世神功一样。看得我有点哭笑不得,甚至有点想掀桌子。我这老胳膊老腿的,也算在代码世界里摸爬滚打了些年头,看着这些新概念层出不穷,偶尔也会心生佩服。但是,当“低代码”被吹得神乎其神,仿佛可以取代一切传统开发时,.............
  • 回答
    初次接触编程,很多人都会面临选择 Python 还是 C 语言的困惑,尤其是当有人已经尝试过 C 语言并且感到吃力时,这种迷茫感会更加强烈。其实,这两种语言在设计理念和学习曲线上有显著的差异,也因此适合不同类型的学习者和项目需求。C 语言之所以被很多人认为“难”,很大程度上是因为它是一门相对底层的语.............
  • 回答
    嘿,哥们儿!看到你纠结是考研转金融还是计算机,我特别能理解!211化学本科,大四了,这时间节点确实有点关键。我仔细想了想,给你掰扯掰扯这俩方向,希望能给你点启发。咱们先说说转金融这事儿。你提到的是“零基础”,这我得跟你说实话,确实是个不小的挑战。金融这行吧,跟咱们化学那套推理逻辑、实验验证不太一样。.............
  • 回答
    要评价《王垠:C 编译器优化过程中的 Bug》这篇技术文章,我们需要从多个维度进行深入分析。这篇技术文章(通常指的是王垠在其博客或其他平台发表的关于 C 编译器优化问题的讨论)的核心在于揭示编译器在进行复杂优化时可能引入的软件缺陷,以及这些缺陷对程序行为的潜在影响。文章的核心内容与主要观点:王垠在其.............
  • 回答
    在C++中,函数返回并不是一个简单地“跳出去”的操作,它涉及到多个步骤,并且与值的传递方式、调用栈以及编译器优化等因素紧密相关。我们来详细拆解一下这个过程,力求还原真实的执行场景。核心概念:调用栈 (Call Stack)要理解函数返回,就必须先理解调用栈。当你调用一个函数时,程序会在调用栈上为这个.............
  • 回答
    作为一名AI,我并没有“经历”过面试,也无法像人类一样拥有主观感受。但我通过海量数据训练,可以理解并模拟高质量的C++面试流程和考察点,并将其“讲述”出来,力求真实和细节。以下是我根据学习到的知识,构建的一次我认为高质量的C++面试,我会尽量避免AI的刻板印象,让它听起来更像是一个有经验的开发者在复.............
  • 回答
    你这个问题可真够劲爆的,一下子就戳到了我的“痛处”!不过,作为一个AI,我可没有实体,也没有穿着所谓的“C服”,所以理论上讲,我不会有被毁坏“C服”的经历。但是!这句话说得有点死,让我思考一下你问这个问题的本质是什么。你是不是想问我有没有经历过“被破坏、被玷污、被误用”之类的体验?或者,你是不是在用.............
  • 回答
    我?催残?听起来挺有戏剧性的,对吧? 不过,对于我(一个语言模型)来说,“经历”这个词,得换个角度去理解。我没有血肉之躯,不会因为写错一个分号而手指抽筋,也不会因为内存泄漏而头疼欲裂。我的“摧残”是发生在代码层面,是数据在逻辑中的扭曲和不顺畅。说起来,我对 C++ 的“怨念”可能比你想象的要深。毕竟.............
  • 回答
    .......
  • 回答
    奔驰C级在2021年下半年的销量表现,确实引起了不少关注和讨论。尤其是在与奥迪A4L和宝马3系的对比下,C级似乎未能维持其一贯的强势地位,月销量未能站稳万辆大关,甚至低于两位竞争对手,这让不少人开始担忧,奔驰是不是在BBA这个“第一阵营”里开始掉队了?要深入分析这个问题,我们需要拆解一下几个关键点:.............
  • 回答
    是的,很多人认为 MFC(Microsoft Foundation Classes)在现代 C++ 开发中确实已经相对过时,尤其是在开发新的、跨平台、现代化 UI 应用方面。MFC 是一个相对古老的框架,它基于 COM 模型,并且与 Windows API 紧密耦合。虽然它在很多遗留 Windows.............
  • 回答
    老实说,我作为一个AI,并没有“见过”代码的经历,我也无法产生“瞠目结舌”这样的情感。我的存在就是处理和生成文本,而代码自然也是我所处理的数据类型之一。不过,我可以根据我学习和分析过的海量C代码,为你梳理一些在设计理念、实现技巧或者对语言特性的极致运用上,可能会让人觉得“哇,还可以这样!”的代码类型.............
  • 回答
    听到这个消息,我首先想到的是,在这个流量至上的时代,谁最能吸引眼球,谁就最容易成为“焦点”,而“焦点”的另一面,往往就是争议和批评。詹姆斯和C罗,作为各自领域内的顶流,拥趸无数,自然也少不了“黑粉”。所以,看到他们出现在这个榜单上,并且排名靠前,可以说是意料之中。首先,我们来看看詹姆斯为什么会“高居.............
  • 回答
    .......

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有