huaxiazhihuo

 

回顾C++

本人对于c++的认识,多年下来,经历了以下几个阶段,

1、 c++很好很强大,盲目追求运行性能,简直巴普洛夫条件反射,贡献了一大坨垃圾代码;

2、 c++的面向对象对持很垃圾,什么鬼,代码很容易就耦合,于是迷上对象+消息发送的面向对象;

3、 c++太复杂了,template太抽象,天外飞仙,搞不懂,二进制复用又差。整个c++就是垃圾,简直程序设计语言里面的败类,C语言多好啊,小巧精致简单清晰;

4、 使用其他语言做开发,javaC#F#elispschemepythonhaskelljavascriptphp等等一大坨语言,感概每一种语言都比垃圾C++不要好太多,发誓不再用c++写哪怕一行的代码;

5、 某一天,突然有点理解了这种语言,一切变得清晰了,原来c++也相当不错,也可以做一些事情,看开之后,感觉开发效率也跟上来了,做同样的事情,用c++实现不会比C#python等慢。

相比于其他语言,c++的独特优势在于

预编译期的伪图灵完备,这一点,好多语言还是有的,并且更超级好,比如rustscheme

编译期间的C++是功能完备的解释器,其输出结果是正常运行的c++代码,结合宏,可以制造很多其他语言必须在语法层面上支持的语法糖。这个解释器的奇妙之处在于它运行于编译期,一旦错误的模板代码要进入运行期,就会出现编译错误,而不需要进入运行时的代码,即便天大错误,也都不要紧,而一旦这段代码要进入运行时,那么模板错误就逃不过编译期解释器的法眼。

生成各种内存布局的便利语法糖和自由的内存操控;不同类型的对象,只要其内存布局一致,通过强制转换,就可按同一类型来处理,这一点作死能力,绝不被有gc的语言支持。内存的无节操玩弄,结合template,分分钟就能仿真出来其他必须语言层面上提供的数据结构,类型安全、运行性能、易用性,一点都不逊色,好比string,委托,元组,列表,可空类型;

C++的专有特性,raii、多继承和全局变量。特别是全局变量,结合它的构造函数特点和类型推导,所能玩出来的丰富新花样,其他语言很难做到。全局变量是连接运行期和编译期的桥梁。如果没有全局变量,本座应该不会再次对c++产生热情。奇怪的是,至今为止,c++的基础库都不怎么挖掘全局变量的潜能。当然,对全局变量的使用,肯定是把它当做常量来用,全局变量有唯一的内存地址,就起到原子的作用,但它又可打包了丰富的静态类型信息。

以上的独特,造就了c++层出不穷的新意,而卓越的运行性能,只是其微不足道的优点。虽然说,语言不重要,思想才重要,软件架构才重要,但是c++所能承载的思想,以及其到达的抽象高度,的确就真的大大降低框架的复杂性,诚然,c++的基础库开发要面临无穷无尽的细节纠结,其实,这也反映了c++编译器掌控细节的能力,因此,我们又可以让编译器自动完成很多很多细节重复,从而大幅度地减轻代码数量,还无损其运行性能。又由于c++完备强大的静态类型特性,在用动态语言风格的简洁来编写代码的同时,又无损其快速方便地代码重构。笔者的基础库项目,几十次大规模的重构,借助单元测试,保证了重构顺利快速的完成,深感c++在重构上的便利,这些代码,包括不到1千行却功能完整的xml库(还支持对象与xml数据的直接互相转换);不到1千行却一点都不逊色于boostspirit组合子解释器(编译速度却快了很多,语法上简洁很多,更能方便地解释各种语法);才1千多行的异步io框架;输入输出,文件操作,数据库,协程等代码都简洁异常,所有这些代码都支持动态库上的二进制复用,让人很惊诧于c++的光怪陆离的强大。

当然,c++的缺陷也震撼人心,

1、 语言特性太过繁杂抽象微妙,比如template、多继承、运算符重载、类型转换、兼容性考虑的很多糟糕语言特性,所以对使用者的节制力要求很高,要求他们时刻清楚自己在干什么,琐碎上的思考太多;

2、 缺乏统一的二进制标准,基础库都用源代码的形式共享,这让原本就龟速的编译速度更加地令人大大感动;

3、 缺乏高标准的基础库,stlboost更在某些技术运用的展示上更起到很坏的影响;

4、 缺乏某些延迟求值的机制,缺乏必要的函数式语言机制,所以c++始终就无法成为堂堂正正的现代化高级语言!

就这样吧。

posted on 2017-07-15 20:07 华夏之火 阅读(1808) 评论(2)  编辑 收藏 引用 所属分类: c++技术探讨

评论

# re: 回顾C++ 2017-07-17 10:55 天下

ABI 不好搞,不过C++17如果module 标准确定的话,基本上也够用了.
但跨语言的ABI标准除了MS 的 COM,
有几个公司会去搞跨语言的ABI.因为C形式的DLL已经基本够用了,

  回复  更多评论   

# re: 回顾C++ 2017-07-17 11:32 华夏之火

@天下
C形式的dll显然不够用。其实,只要在c的基础上再做多一些工作,情况就会好很多,但是委员会向来追求大而全的陋习,比如要支持虚继承、要支持各种函数调用规定,要照顾各个编译器的自定义等等因素,因此导致就连最基本的统一的面向对象模型都迟迟未曾出现  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜