本人对于c++的认识,多年下来,经历了以下几个阶段,
1、 c++很好很强大,盲目追求运行性能,简直巴普洛夫条件反射,贡献了一大坨垃圾代码;
2、 c++的面向对象对持很垃圾,什么鬼,代码很容易就耦合,于是迷上对象+消息发送的面向对象;
3、 c++太复杂了,template太抽象,天外飞仙,搞不懂,二进制复用又差。整个c++就是垃圾,简直程序设计语言里面的败类,C语言多好啊,小巧精致简单清晰;
4、 使用其他语言做开发,java、C#、F#、elisp、scheme、python、haskell、javascript、php等等一大坨语言,感概每一种语言都比垃圾C++不要好太多,发誓不再用c++写哪怕一行的代码;
5、 某一天,突然有点理解了这种语言,一切变得清晰了,原来c++也相当不错,也可以做一些事情,看开之后,感觉开发效率也跟上来了,做同样的事情,用c++实现不会比C#、python等慢。
相比于其他语言,c++的独特优势在于
预编译期的伪图灵完备,这一点,好多语言还是有的,并且更超级好,比如rust,scheme
编译期间的C++是功能完备的解释器,其输出结果是正常运行的c++代码,结合宏,可以制造很多其他语言必须在语法层面上支持的语法糖。这个解释器的奇妙之处在于它运行于编译期,一旦错误的模板代码要进入运行期,就会出现编译错误,而不需要进入运行时的代码,即便天大错误,也都不要紧,而一旦这段代码要进入运行时,那么模板错误就逃不过编译期解释器的法眼。
生成各种内存布局的便利语法糖和自由的内存操控;不同类型的对象,只要其内存布局一致,通过强制转换,就可按同一类型来处理,这一点作死能力,绝不被有gc的语言支持。内存的无节操玩弄,结合template,分分钟就能仿真出来其他必须语言层面上提供的数据结构,类型安全、运行性能、易用性,一点都不逊色,好比string,委托,元组,列表,可空类型;
C++的专有特性,raii、多继承和全局变量。特别是全局变量,结合它的构造函数特点和类型推导,所能玩出来的丰富新花样,其他语言很难做到。全局变量是连接运行期和编译期的桥梁。如果没有全局变量,本座应该不会再次对c++产生热情。奇怪的是,至今为止,c++的基础库都不怎么挖掘全局变量的潜能。当然,对全局变量的使用,肯定是把它当做常量来用,全局变量有唯一的内存地址,就起到原子的作用,但它又可打包了丰富的静态类型信息。
以上的独特,造就了c++层出不穷的新意,而卓越的运行性能,只是其微不足道的优点。虽然说,语言不重要,思想才重要,软件架构才重要,但是c++所能承载的思想,以及其到达的抽象高度,的确就真的大大降低框架的复杂性,诚然,c++的基础库开发要面临无穷无尽的细节纠结,其实,这也反映了c++编译器掌控细节的能力,因此,我们又可以让编译器自动完成很多很多细节重复,从而大幅度地减轻代码数量,还无损其运行性能。又由于c++完备强大的静态类型特性,在用动态语言风格的简洁来编写代码的同时,又无损其快速方便地代码重构。笔者的基础库项目,几十次大规模的重构,借助单元测试,保证了重构顺利快速的完成,深感c++在重构上的便利,这些代码,包括不到1千行却功能完整的xml库(还支持对象与xml数据的直接互相转换);不到1千行却一点都不逊色于boost的spirit组合子解释器(编译速度却快了很多,语法上简洁很多,更能方便地解释各种语法);才1千多行的异步io框架;输入输出,文件操作,数据库,协程等代码都简洁异常,所有这些代码都支持动态库上的二进制复用,让人很惊诧于c++的光怪陆离的强大。
当然,c++的缺陷也震撼人心,
1、 语言特性太过繁杂抽象微妙,比如template、多继承、运算符重载、类型转换、兼容性考虑的很多糟糕语言特性,所以对使用者的节制力要求很高,要求他们时刻清楚自己在干什么,琐碎上的思考太多;
2、 缺乏统一的二进制标准,基础库都用源代码的形式共享,这让原本就龟速的编译速度更加地令人大大感动;
3、 缺乏高标准的基础库,stl和boost更在某些技术运用的展示上更起到很坏的影响;
4、 缺乏某些延迟求值的机制,缺乏必要的函数式语言机制,所以c++始终就无法成为堂堂正正的现代化高级语言!
就这样吧。