C++ 语言至今已走过四十余年的历程,回顾其历史与发展,一个常被讨论的话题是:它为何如此复杂?这与它的创始人 Bjarne Stroustrup 最初的设计理念密切相关。
回溯到 1979 年,Stroustrup 在贝尔实验室开始了他的工作,目标是为当时正在发展的“带类的 C”(C with Classes)添砖加瓦。这一切的灵感,很大程度上源于他在丹麦奥胡斯大学时期与图灵奖得主 Kristen Nygaard 的交流。Nygaard 是 Simula 语言的联合发明人,被誉为面向对象编程的“祖师爷”。他们的交流方式很特别——每月一次的啤酒长谈,在轻松的氛围中探讨着前沿的软件构造思想。
Simula 语言优雅且善于描述复杂的软件结构,但其性能在当时是一个明显的短板。Stroustrup 需要一个既具备高级抽象能力,又能贴近硬件、保持高效率的解决方案。他考察了 Algol 68 等语言,但最终还是选择了 C 作为基础。这不仅因为 C 本身“离硬件近、速度快”的特性,也得益于贝尔实验室得天独厚的环境:C 语言之父 Dennis Ritchie 就在隔壁,这种交流的便利性为语言的演化提供了宝贵的土壤。
然而,从简洁的 C 到功能强大的 C++,语言的复杂性也随之显著增加。对此,Stroustrup 有一个有趣且深刻的观点:这种复杂性,在某种意义上,是对C/C++程序员的一种保护。
他以 COBOL 语言的历史为例。COBOL 曾因其易于学习和使用,在金融等领域迅速普及。但当掌握它的程序员变得稀缺时,其薪酬水涨船高;随后,大规模培训又使得人才供给增加,反而稀释了程序员的个体价值。类似的故事也发生在 Java、Python、JavaScript 等语言上。这些语言通过虚拟机、隐藏底层细节等方式降低了入门门槛,使得开发变得“简单”。
Stroustrup 认为,C++ 的设计哲学与之不同。他并非主动将语言复杂化,而是“拒绝让它变得过于简单”。C++ 的核心目标是胜任系统级编程、高性能计算等“大事”。它保留了如指针、手动内存管理等接近硬件的特性,并在此基础上逐步引入了面向对象、模板、STL、现代特性(如智能指针、Lambda 表达式)等一系列强大的工具。
这种“工具箱”式的设计带来了一个结果:C++ 的学习曲线陡峭,编写和理解复杂的 C++ 代码需要深厚的功底。从积极的角度看,这构建了相当高的专业壁垒。掌握 C++ 的程序员,往往是操作系统、浏览器内核、游戏引擎、高频交易系统等核心基础设施的构建者。他们的技能难以被快速复制,因此在就业市场上保持了较强的竞争力和议价能力。
网络上曾有一个形象的比喻来描述 C++:它像一栋从上世纪 70 年代开始修建、从未停工的楼房。地基是 C 语言的裸指针;一楼加入了类和面向对象;二楼是如同“可变形迷宫”的模板;三楼是 STL 标准库;屋顶则是后来不断添加的各种现代特性。开发者可能需要同时处理跨越多个语言标准时代的代码风格。
对此,Stroustrup 的回应带着幽默与务实。他承认这种复杂性,但更强调 C++ 作为“重武器”的不可替代性。正是这种复杂性,使得它在当前人工智能自动生成代码(AI Code Generation)的浪潮中,展现出一定的“抵抗力”。相比起语法简单、模式相对固定的 Python 或 JavaScript,涉及指针操作、模板元编程、复杂内存模型的 C++ 代码,对 AI 模型来说是更艰巨的挑战。这或许在无形中,为深耕此领域的开发者争取了更多的时间。
Stroustrup 曾有一句被广泛引用的话:“我没有让 C++ 变简单,因为我不想让你们变得廉价。”这句话虽带有戏谑成分,却深刻反映了他对于软件工程师职业价值的思考。在技术快速更迭的今天,深入理解像 C++ 这样的底层技术,不仅是构建高性能系统的关键,也可能成为开发者构建自身长期职业护城河的一种策略。关于技术趋势与职业发展的更多讨论,欢迎来到云栈社区与大家交流。
|