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

复现论文《大规模风电场电磁暂态高效建模仿真方法》 本文提出了一种针对大规模风电场电磁暂态(EMT)仿真的高效建模方法。通过三种关键技术实现仿真加速:(1)永磁直驱风电机组一体化等效建模,采用节点导纳矩阵降维将25节点机组简化为4端子电路,仿真速度提升1-3个数量级;(2)基于戴维南/诺顿等效和OpenMP并行计算的风电场整体建模,通过串并联叠加实现节点收缩,30台机组仿真加速近万倍;(3)受控源映射解耦方法提高故障仿真灵活性。复现代码展示了核心算法实现,包括导纳矩阵Schur补降维、多进程并行计算框架以及受控源解耦方法。 阅读详情
关于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年之后还为它层出不穷的新意感到惊讶。偶见有人举出自己“精通和掌握”的工具和语言,动辄长达八九上十种,实为笑柄。真正掌握一种,已经是难能可贵,熟练掌握两种层次不同,思维不同的语言,应是有抱负的程序员的自我要求。何况如今之软件开发涉猎甚广,仅通编程层次还显不够。不过总之百招会不如一招精,做什么工作都要有自己的过人之处。

相关推荐

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

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

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

孟岩 2万+

HT7036计量芯片SPI通信与数据读取实战解析

本文详细解析HT7036计量芯片的SPI通信与数据读取实战,涵盖SPI时序配置、命令发送、数据读取及常见问题排查。重点介绍如何通过SPI接口与MCU通信,实现电能数据的稳定采集与处理,为智能电表等应用提供实用解决方案。

vscode5coder的博客 264

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

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

韩江雪de 小屋 1万+

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1238

(nginx) nginx5 nginx https部署实战

综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐HTTPS 降低用户访问速度(多次握手)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)

weixin_50382197的博客 1505

还在苦恼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

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2716

C++ 难学?浅谈

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

qq_41179365的博客 1866

NSGA-II 多目标优化 —— 理论、案例与交互式 GUI 实现

本文详细介绍了 NSGA-II 多目标优化算法的基本原理、数学模型和实现流程。从非支配排序、拥挤距离计算到遗传操作,NSGA-II 通过对种群进行分层和排序,能够有效求解多目标优化问题,获得 Pareto 前沿解集。通过机械结构优化、资源分配和控制参数调优等典型案例,我们展示了 NSGA-II 在实际工程中的广泛应用。为帮助工程师和研究者更直观地理解算法求解过程,本文提供了基于 Python 与 PyQt6 的交互式 GUI 演示系统代码示例。

闲人编程的博客 2119

Unity 热更新技术 | (二) AssetBundle - 完整系列教程学习

开始学习热更新方面系列知识,就从这一篇开始吧! 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~ 接下来从 AssetBundle - 完整系列教程学习 开始学习吧!

努力前行,总会成为自己心中的那道光 1万+

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

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

青少年趣味编程 1312

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

afxid的专栏 1042

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

weixin_45249120的博客 556

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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++20为止,C++的关键字大约是99个,还有6个特定上下文当中有特殊含义的名字。 作为对比,C语言,截止到C11,关键字是44个 显然,C++比C复杂,其关键字比C多一倍有余。 但也有观点认为,C++只有在被孤立看待的时候,才会觉得复杂性。 设计任何一门语言都是有背景的。 C++面向的是这样的特定用户: 应对各种复杂问题 写出运行相当长时间的解决方法 解决方案要满足任意的性能要求

qq_43351159的博客 1478

C++知识点总结

1、在支持C语言的基础上,全面支持面向对象编程2、编程领域广泛,功能强大3、C++语言标准一直在保持更新4、支持底层操作的面向对象编程语言5、在面向对象编程语言中执行效率高class Demopublic:// 类内声明Demo();// 类外定义cout

WBGZSL的博客 2051

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

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

river4321的专栏 1364

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

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

helinlin007的专栏 1万+

为什么C++是最难学的编程语言?

为什么C++是最难学的编程语言?

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值