关于C++复杂性的零碎思考(myan)

搭建ipv6并发代理池 我开了个知识星球,把将本期搭建写成shell脚本已放到了里面,有需要的小伙伴可以自行去取,jd的参数,阿里bxet纯算、快手滑块,Pdd—Anti,ikuai,b站login之-极验3文字,某音ab,瑞数456vmp补环境等等,主要是某些大佬加我问成品,很多人都打着白嫖的手段去加我好友为目的,问完基本就以后没有任何的交集,这样的交好友雀氏没有任何意义。不如我直接开个星球,里面直接放我逆向的成品以及逆向的思路,这样大家各取所需,我也有点收益,意义更明确点,免得浪费大家的时间。我是pve下的ubuntu。 阅读详情
关于C++复杂性的零碎思考

C++的表面困境来自两方面,一是开发效率低,而是容易犯错,维护难度大。此二者俱是表象,本质就是一个——过度复杂。或有人说C++之关键缺陷是没有统一完整的类库支撑,Bjarne Stroustrup即强调此因素。然而这其实只不过是一个结果,而不是原因。正是因为语言太复杂,才无法在有效期内开发出高质量的大一统的类库。

C++的复杂,并非是其体积庞大之必然结果。复杂是对结构混乱无序程度的描述,规模大,结构不见得必然复杂。

C++的复杂,也并不是如很多人所认为,是若干种编程范式(paradigms)的并存而至。事实上,现代实用编程语言至少有2-3种范式才能登大雅之堂。以范式数量论,Python和Ruby等新型动态语言的范式甚至多于C++,然而它们却以简单和开发效率高著称。

C++复杂的根源在于三大约束:与C的完全兼容、静态类型检查、最高性能。在三大约束下,C++未能完善对于面向对象思想的支持,未能建立强大的动态能力,从而使得C++在OO这个单项上存在本质缺陷。事实上,C++的过程、OB模型相当成熟和稳定,而泛型模型,就单项来说,除了语法丑陋之外也没有大的问题。缺陷集中体现在OO模型的实现,并因此干扰了其他几个范式的完整程度。然而,OO的缺陷绝非设计者的偏执,其原因在于三大约束。如果坚持三大约束,则即使再重新设计一次,结果也与今日相差不远。Stroustrup在多种场合表示,对C++的设计没有大的后悔之处,意思就是这个。侯捷先生早在2001年初即对我说,C++在OO上不及Java,当时体会不深,认为没有大一统的单根类库会使设计更加灵活,后来又认为凭借GP可以抵消OO的不足甚至超越之,现在看来即使不是不可能,这条道路也必然是艰辛异常,成败难以预料。

又因为上述所有因素的综合作用,C++基础类库的建设只能进行到很低的高度上就停下来,因为再往上走就面临重重困境和无穷无尽的争论。C++标准库实际上是一个距离应用相当遥远的非常基础的程序库,其主体部分只相当于Java中System和Util两个package。而C++宁可停在这样的低层次,也不愿意放弃三大约束中的任何一个。这种执着使得高层标准库设施的建立异常困难,使用也不容易。Boost库中相当部分组件的易用性不佳。

模板的复杂语法与三大约束也有直接的关系。另一个原因是Bjarne在发明模板时目标单纯。C#和Java加入泛型机制的时候,没有继承C++最好的经验,却不约而同地继承了C++模板机制中最坏的部分——语法,短期来看,丧失了一次改革的良机。长远来看,必成累赘。

不完善的异常机制则是在木已成舟的情况下迫不得已的设计。

C++中的多种范式并行,是一些最复杂问题的表面原因。以至于Doug Lea建议在一个项目里只坚持一个范式。但是这仍然只是表象。归根结底还是因为OO的缺陷,使得与其它范式合作时困难成倍放大。故自接受Doug Lea思想以来,我的C++(乃至其他现代语言,尤其是Python等多范式语言)的开发设计思路是:

1. 首先选定一种思维方式(即范式),尽可能只用这一种思维方式解决问题;
2. 如果在局部遇到其他思维方式更得力的问题,则经慎重考虑后,可以将另一种风格包装在局部,解决局部问题。但整个系统在某一层次之上看来,应当是统一一致的。一般C++的开发,应以OB为基本风格。除非有类似MFC那样庞大而成熟的OO库支持,不应贸然在整体上使用OO风格。
3. 多种风格混用,除非有已被充分讨论并验证的方案(即成熟模式),可提供单一风格不能提供的较大优势,否则应极力避免。当然鼓励在研究中探索,但实践是另一回事。

C++完全可以在90年左右摆脱C的约束,随后简化模板语法,完善异常模型,接纳可选GC,建立完整的单根类库,付出性能小幅度下降的代价之后,实现语言整体升级。

但是C++选择了另一条路,三大约束坚持到底,坚守系统层面,以替代C为己任。是福是祸,实难判别。如果90年代初选择升级,胜则扼死Java于摇篮之中,败则寸土不保。不过以C++之高性能,胜面应稍大。如今看来,在系统面彻底取代C已无可能。

1994年为STL拖延标准立案时间长达四年,如今来看功过亦存争议。错过黄金时机不说,STL典范一立,库设计风气为之一改。然而在解决应用问题上,泛型较之OO,适应能力远逊之,且应用困难。

总之,C++的三大约束,既是其兴起之要素,也是其衰落之源头,同时,又是其今天得以屹立不倒的重要基石。其是非功过,实难一言以蔽之。

补充:2004年10月20日
C++/CLI之对于C++的意义,其实并不在于使C++重新获得了制胜Java或者C#的机会,而在于巩固了C++作为.NET平台上系统语言的地位。由此知,C++/CLI的发展,的确如Stan Lippman所说,是C++一贯发展思路的延续。三大约束固然已经放弃,但其精神实质仍在,形攻而实守,未来将可作为.NET上唯一最强之系统语言而长命百岁。

C++/CLI决不简单,但在大多数时候,它能够比传统的C++表现的简单些。这就是Andrew Koenig说的,通过复杂实现简单。

C#和Java的繁荣期,则有赖于人们对于大一统的中层次语言的信仰有多坚持。此两种语言无论在系统开发还是在应用开发中都非最优选。目前C#出现一些迹象,引入一些动态语言特性如cmdlet,又强化系统编程能力,想上下通吃。这是一条不归路,必会使C#变得更加复杂怪异。

学习编程语言,通语法能实践,不过十分之一。真正重要的是掌握其多种多样的实用的idioms或模式。这些模式才是体现了语言精神的东西。未掌握各种语言中的主要应用模式,则应羞于用“会”字。常听有人说某某语言一周乃至一两天即可掌握,这个掌握的层次肯定是很低的。真正要“掌握”语言,则我等凡人,诸事缠身,非得集中精力学习实践一两年,将该语言所擅长领域的应用问题熟悉过一遍,才有可能。若论精通,则十年也不容易。Henry Spencer用了30年C,仍乐此不疲;Pragmatic Programmer中评价Ruby说,学上四个小时就可以用它解决实际问题,但是10年之后还为它层出不穷的新意感到惊讶。偶见有人举出自己“精通和掌握”的工具和语言,动辄长达八九上十种,实为笑柄。真正掌握一种,已经是难能可贵,熟练掌握两种层次不同,思维不同的语言,应是有抱负的程序员的自我要求。何况如今之软件开发涉猎甚广,仅通编程层次还显不够。不过总之百招会不如一招精,做什么工作都要有自己的过人之处。

霍尼韦尔SoftMaster使用说明 立即下载

相关推荐

使用-flat.vmdk文件恢复ESXI虚拟机的vmdk文件

解决flat.vmdk文件丢失恢复问题

神秘人的博客 6772

关于C++复杂性的零碎思考

本文系数月前随手写下的,没有起承转合与段落章法,观点更是未经推敲。仅供参考。------------------------------------------------------------------------------------------C++的表面困境来自两方面,一是开发效率低,而是容易犯错,维护难度大。此二者俱是表象,本质就是一个——过度复杂。或有人说C++之关键缺陷是没有统

孟岩 2万+

将3DMax编辑的动画,导入给已经绑定蒙皮好的模型给Unity使用

现在程序猿想做独立游戏,即容易,也难。 说容易,引擎越来越傻瓜化。 说难,到哪去找靠谱的美术? 好在伟大的AssetStore(还有淘宝上)有大批不赖的资源可以用。 现成的模型,是好,但是,没有配套的动作,却是一件让人头疼的事情,即使用IK动画,也不能完美的弥补这一缺陷。 虽然Unity具备 retargeting 功能,但是,也不是万能的,很多情况下,非标准的骨骼会导致

正经的时候都在打游戏 1万+

为什么说C++太复杂?复杂的必要性是为什么?

文章目录1 常见观点2 反驳观点3 为什么要解决的问题越复杂,工具就不得不复杂?3.1 类库和语言语意3.2 折中方案3.3 复杂度的守恒 1 常见观点 可以轻易的找出许多文献说明C++太复杂了,例如学习C++的书籍的厚度。 这样以至于C++的设计者Bjarne都曾怀疑具有类的C是不是已经太庞大了。 因为,总有大量对语言的新特性的要求: 对如何利用现有特性完成某些任务没有足够的了解 天生喜欢评价...

韩江雪de 小屋 1万+

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 589

[附源码]计算机毕业设计-Steam游戏平台系统论文Springboot程序

项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.

JSP、ssm毕设程序源码 1494

还在苦恼C++纷繁复杂的语法知识?一文带你读懂70%C++基础知识!

所以也可以理解为c++的出现并不是去替代c,而是对c的扩展,所以在c++中既可以使用c++新特性,并且可以使用c的过程式思维来编写程序。c++起初也叫”c with clsss”.通过名称表明,c++是对C的扩展,因此c++是c语言的超集,这意味着任何有效的c程序都是有效的c++程序。由于C使用不同的扩展名来表示不同文件类型,因此用一些特殊的扩展名(如hpp或hxx)表示c++的头文件也是可以的,ANSI/IOS标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。

m0_63204338的博客 832

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2882

C++应该是目前最复杂难的编程语言吧

C++应该是目前最复杂难的编程语言吧

青少年趣味编程 1312

Unity之如何实现TTS文本转语音(真人发音)

微软Azure TTS 文本转语音 服务 将文本转换为逼真的语音的语音服务功能 支持个各国语言,各种中文各种方言,支持不同音色男音女音 支持离线和在线版本

TxNet 5479

AUTOSAR进阶图解==>AUTOSAR_SWS_COM

AUTOSAR COM模块是AUTOSAR通信堆栈的核心组件,提供信号导向的通信服务。该模块位于通信服务层,连接RTE与PDU Router,主要功能包括信号封装/提取、传输模式管理、信号路由、超时监控和字节序转换等。COM模块架构分为应用层、通信服务层和通信抽象层,包含信号管理、I-PDU处理、传输模式管理等组件。其配置结构包括顶层容器、I-PDU组、I-PDU和信号等多层次配置对象,支持丰富的参数设置。模块采用严格的状态管理机制,包括模块状态和I-PDU组状态转换,确保通信可靠性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1243

C++ 难学?浅谈

问题原因为什么 C++ 精通难?语法复杂、细节多、需要底层知识、标准更新快C++ 环境包括哪些?编译器、调试器、构建工具、版本控制、性能分析工具如何精通 C++?系统学习、深入理解底层、大量实践、持续学习先学 C 语言学 C++ 基础语法学 STL 和标准库学模板和泛型编程学多线程和并发学编译器和调试工具实践项目(如网络编程、操作系统、游戏)

qq_41179365的博客 1866

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于C++复杂性的零碎思考(by myan)

本文系数月前随手写下的,没有起承转合与段落章法,观点更是未经推敲。仅供参考。------------------------------------------------------------------------------------------C++的表面困境来自两方面,一是开发效率低,而是容易犯错,维护难度大。此二者俱是表象,本质就是一个——过度复杂。或有人说C++之关键缺陷是没有统

afxid的专栏 1042

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

为什么大家都怕学C++?

喜欢的可以收藏转发加关注 现在很多人都觉得C++学起来相当的费劲,特别是对刚入门的,看到最后直接就没法看下去了,抽象的逻辑太多了,越看越迷糊,最后也就选择了放弃。笔者看到很多大学开设的第一门编程语言就是C++,如果单纯从学习的角度考虑学习下面向对象整体概念,先让自己有个大致的了解。然后慢慢的切入到最后的泛型编程,再到设计模式。 前些日子有个学习C++编程的小伙伴,跟我聊到说已经换编程语言了...

weixin_45249120的博客 556

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++的致命缺陷:为何现代开发正抛弃它

《C++设计的固有缺陷与现代软件开发困境》一文系统剖析了C++语言在多维度存在的结构性缺陷。文章指出,C++在保持C语言兼容性的同时,积累了语法复杂、特性爆炸等历史包袱;内存管理机制既带来安全风险又增加开发负担;过时的编译模型导致编译效率低下;标准库存在功能缺失与设计缺陷;开发效率与安全性显著落后于现代语言;生态系统呈现严重碎片化。尽管C++在性能敏感领域仍不可替代,但其设计局限性正受到Rust等新兴语言的挑战。作者建议开发者应理性评估C++的优缺点,通过现代编程实践规避风险,同时根据项目需求权衡是否选用更

W20130306的博客 1754

C++网络编程 卷1 运用ACE和模式消除复杂性——笔记1

第0篇 0.3.1 面向对象中间件层 1、常见面向对象中间件体系结构: 1)主机基础设施中间件:对并发和ipc机制封装,如JavaPackage、ACE 2)分布式中间件:扩充1),使一些网络编程任务(连接管理和内存管理、整编、解编、端点和请求的多路分离)自动化,即只需向目标对象请求操作,不关心目标的位置、语言、OS、硬件,核心是ORB(Object Request Broker),如CO

kaci_csdn的博客 2003

浅论 C++ 的复杂性

C++ 拥有 30 多年的历史,作为一门影响广泛的编程语言,它所受到的关注和争论恐怕是任何一门其他的语言所不能比拟的。十几年前,Java 等新生语言的出现曾导致 C++ 信任危机,但最终 C++ 以自身非凡的品质屹立于主流编程语言的行列。在有着众多编程语言可以选择的今天,到底有没有必要学习、怎样学习、怎样使用 C++?对于广大程序员,特别是刚刚接触编程的初者,这些问题至关重要。C++ 遭受批评最多的是它的复杂性,对于这个话题,已经有很多文献讨论过。

Doublelv 的博客专栏。 6854

C++难都难在这些地方

1.C++抽象层次灵活多样且复杂 自身支持多种编程范式;新手兴奋,长者敬畏,设计模式的应用较为抽象 过程(ADT+PP),面向对象(OO),泛型编程(GP),函数式编程(FP),模板元编程(TMP),Etc 再在操作符重载,继承和多态派生等加持下,看似相同的代码在不同的位置可能完全天壤之别 2.C++语法规则细节琐碎且复杂 编程风格低约束:自由,可读性差 语法迭代版本差异:Old C++(C with Class)、Etc C++新特性学习带来的成本时间:C++11/C++14/C++17/C+

weixin_42142260的博客 3008

我对C++复杂性的一些认识

我学习使用C++,已经有差不多7,8年了。从当年在学校写小程序,到后来在公司写程序做设计。从VC++(虽然它不是标准C++),到后来嵌入式的C++,到现在在项目中,标准的C++。坦白说,C++确实很复杂,和Java, Objective-C,Python,Ruby这些语言比,它确实很复杂。这种复杂来自于几个方面:[1] 编程的模式太多。面向过程,基于对象,面向对象,泛型。而且在面向对象的时候,它可...

AnkyHe's Blog 246

无尽赞叹,《C++和面向对象数值计算》,哪怕仅仅说翻译

在旧书店淘的这本《c++和面向对象数值计算》,是个美国的中国人写的,清华的人翻译的。这本书是韦恩州立大学(Wayne State University)本科生的教科书,水平自然毋庸置疑。 另外需要赞叹的是中文版中的翻译,很多词并非大家常见的“主流”,但却非常言简意赅的说明了一个英文名词的作用。 比如STL中的iterator,许多书都翻译成“迭代器”这个让初学者摸不着头脑的名词

river4321的专栏 1364

为什么都说C++太复杂?

衡量一种语言(广义,不仅限编程语言)是否复杂,我们可以看其单词数量、词性变化以及语法结构。 根据相关数据显示,到目前最新的C++20为止,C++的关键字大约是99个,还有6个特定上下文当中有特殊含义的名字。 作为对比,C语言,截止到C11,关键字是44个 显然,C++比C复杂,其关键字比C多一倍有余。 但也有观点认为,C++只有在被孤立看待的时候,才会觉得复杂性。 设计任何一门语言都是有背景的。 C++面向的是这样的特定用户: 应对各种复杂问题 写出运行相当长时间的解决方法 解决方案要满足任意的性能要求

qq_43351159的博客 1478

C/C++的思索 C++之父访谈录(真的吗?)

贴者:不着大家看完有何感想?C/C++的思索 C++之父访谈录在1998年的元旦,Bjarne Stroustrup(C++之父)接受了IEEE《计算机》杂志记者的专访。编辑很自然的认为他会对于过去七年来使用他创建的语言进行面对对象设计做一个历史性的回顾。而在这个专访中,记者获得了更有价值的新闻,但是最后编辑决定为了整个IT产业,这个稿子不能发表,但是就像其它被砍掉的新闻,往往还是弄得路人

syncmaster550的专栏 1128

C++和Java,绝不只是语法不同这么简单

说到面向对象,我们的脑海中立马会涌现出C++,java,object-C 这几个大类的语言,甚至是C#。似乎看来,他们都是面向对象的不同实现而已(博主这句话就很C++了)。尤其对于初学者而言,很难显见他们之间的不同以及设计哲学上的差异,这种差异需要我们有过几年的编程经验,同时对几种语言都比较熟悉的时候才能够深刻的感受到。       以前有人说C++就是强化版的C++,现在应该没有人继续有这种思

helinlin007的专栏 1万+
上一篇: 名词概念
下一篇: 简单string类及对象构造测试
evers
博客等级 码龄24年 7粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值