高在,别人用JAVA写了一堆比较垃圾的代码,你把这个jar包进来,就不改了。
而C++的情况是,别人写了一堆比较垃圾的代码,你把源码include进来,顺便手贱点了进去……骂了几天~几个星期娘后,他的代码有一半被你改了。
也可能高在,别人写JAVA需要一个功能,搜了搜到maven里加了几行,自动下了几个1m的包就开始干正事了。
而C++的情况是,你搜到了几个知名的开源库,下下来一看,好多个近百K的hpp,拖慢了编译速度不说,好多功能还用不上!于是你挽起袖子花了好几天自己写了一个轮子,然后以后花了更长的时间去修bug。
说白了,不是语言的问题,而是使用者心态问题。
我写java的时候,就为了个bimap,引了个guava进来,为了几个流的拷贝把apache commons引了进来。
当然C++也可以用的很随性,我也见过别人同时用armadillo和opencv(前者矩阵按列存,后者按行存),结果动不动就转置矩阵来转换格式的。。。。
有几个原因
1. 语言上,Java是一个比C++更容易parse得多的语言,所以相应的工具链IDE会更容易做,无论多大的Java的项目,就是新手写完都不会有编译错误。但是写上千行C++程序,写完不需要改编译错误的,都不是一般高手。实际上,C++的语言特性太丰富,一般的团队都是裁剪出一个子集来用,就这个子集来说,大家的认识也千奇百怪。
2. ABI依赖,C++还是一门面向底层的语言,直接面向ABI接口这样底层环境的编程。我就不提什么Linux下程序移植到Windows下这种坑爹的事情了,我有一次把一个在fedora下跑得好好的程序拿到ubuntu下重编译就莫名crash了,开着gdb debug N久汇编。
3. 没有包管理,这样库就不容易分发,不可能有Maven这样的东西,这个缺陷严重限制了C++的使用,就是你的项目必须要有依赖的全部代码,因为原因2,很多时候static lib都不靠谱,更不要提dynamic lib了。
4. 因为前三个原因,C++上面用于解决通用问题的库和框架比起Java World是差很多的,反过来会更加使得C++的用途边缘化,迈向特定领域。
C++开发效率的问题还不止这些,越写越想吐槽,但是还是不提了。但对于Java来讲,开发效率比C++强很多,被JIT充分优化过的代码的效率基本接近C++,当然内存使用的效率是远低于C++的,但是省内存这个需求现在已经很少见了。