Myths of CPP的小思考

11 Oct 2019

Bjarne Stroustrup的一个小系列,貌似在我的Pocket存了两年了。在我上个月的大扫除中终于把它给读完了。 Part 1 的地址: https://isocpp.org/blog/2014/12/myths-1

先说明原文的大概内容

三部分

我理解的三个部分强调的几个方面:

  1. Part 1
    • C++的灵活性
    • 更加脚本化的代码风格和抽象能力
    • 同时保持了底层性能
  2. Part 2
    • 更加优秀的内存管理
  3. Part 3
    • CPP is not heavy

五迷思

  1. “To understand C++, you must first learn C” C++本身的语言风格与C是可以很不一样的,保持一样的部分只是为了存量代码的兼容性;但是在增量上,如果依然还是写出和C一样的代码,那就是你的问题了。
  2. “C++ is an Object-Oriented Language” 本身可以有泛型编程、函数是编程的风格,虽然因为是静态语言,一些meta的信息没有那么灵活。
  3. “For reliable software, you need Garbage Collection” 资源管理也躲不开显式的开关, C++可以利用scope的特性帮你隐式的做了。之前对象拷贝的坑,也有右值引用来填了。实在不行,还有smart pointer。
  4. “For efficiency, you must write low-level code” 举了一个qsort的例子,因为有类型信息,编译器容易优化,不需要指针转换一类的拖性能的操作。
  5. “C++ is for large, complicated, programs only” 讲真,这个我都觉得里面的例子有点撑不住。

我的简单思考

1. CPP的库

CPP的标准库相比现在的各种语言,属于覆盖范围很小的。覆盖多了估计也搞不定,不同平台、不同硬件,主要还是和底层接触的太多同时还是个通用语言。

于是,实际开发中必须要用三方库,有些任务还好说,比如我一直涉及的就是CV开发,一个OpenCV就基本能搞定所有主要问题了,OpenCV的质量也足够好。

但是有很多任务,三方库数量多,质量参差不齐。用CPP的,90%情况下都还要考虑性能(否则,架构师可以拉出去枪毙了)。 到底选哪个就成了哲学问题。时间一长,耐不住自己再搞一套,铛铛铛,一坨新的三方库又出现了。大部分情况下,三方库要么大而重,要么就是乌合之众,再加上一个快速的标准演进……

什么时候标准库的范围可以覆盖日常使用,CPP才能算得上脚本化了。不过我不报希望,因为根本就做不到类似Python标准库这样的范围。

这个页面里面,依次点进去看看,有多大概率出现下面的情况:

  • 已经被放弃了
  • 长时间没有活跃开发
  • 复杂到完全摸不到头脑的
  • 构建系统要额外增加投入的
  • 只是为了填坑现有标准库范围的

2. 我的屎山理论

所有的编程语言都会形成屎山,只是其中的某些更加容易形成。

CPP就属于那种容易的。需要一个严格自律的团队,才能让屎山堆积的速度保持在低水平。

3. 太重了

语言核心太重 CPP的教学资料,都是大部头。 因为语言核心不断扩展,越来越复杂,没有大部头根本没法说清楚。

起步价这样高,教学起来会让人绝望。如果说,只快速学一点子集就可以上手,后续再学扩展也没关系,但是CPP做不到,不把整个体系学得差不多,写出的代码可能到处都是坑。

实践学习的话,只能在一个专家的带领下,利用Code Review进行培训,严格控制在cpp特性的某一个子集中,并且遵循现代CPP标准。

语言开发太重 难以适应快速变化的开发,所以适合后台、稳定、成熟业务开发。变化大的场景,容易把人逼疯。讲真,CPP重构起来一样也是火葬场。

4. 建设性观点

除了批判,同时还要有建设性观点:

  1. 开发过程中,要保证现代cpp的代码风格,从源代码角度来说,目前的风格已经很接近脚本语言风格了。
  2. 如果没有必须的技术需求,c和cpp这两个应该优先选择cpp。避免raw pointer和显式的内存分配可以降低很多无谓的错误,c恰恰绕不过这两点。
  3. 尽量跟进最新的标准,尤其是考虑到开发过程的时间和未来技术债的因素。即使用了最新的标准,等到交付和维护的时候,已经属于成熟期的标准了。
  4. 需要老道的程序员对代码的控制,这样可以大幅度增加项目代码保持在正轨上的可能性。
  5. 我要去看看Rust。