正巧,c/c++和python都写过项目,题主所述的c++没有python开源库多,我是认同的。
代码本质上。c++是编译型语言,python是解释型语言。c++很多静态或者动态的类库都是闭源的,比如Linux里面的.a文件是静态库,.so文件是动态库,比如windows里面的.lib文件是静态库,.dll文件是动态库,都是二进制文件。所以如果问题把“开源”去掉,就值得商榷了,可以这么说,只要你c++玩的溜,整个操作系统API都是你的类库。c++太底层了,导致其实很多著名的python的库都衍生自c++库。
方便程度上。前面说了,c++的开源库最终都要编译成静态库或者动态库被你自己的代码调用。Linux下面./configure,然后make,readme里面基本就这两句话,看着命令行一堆报错,你会痛骂作者是个大忽悠。windows更惨,你是vs2008的编译器,开源库只给了vs2012的工程文件,这时候你就要考虑是把你的代码升级到vs2012上报错少,还是把开源库降级到vs2008报错少,考虑再三,还是不用第三方库了,看懂开源代码,自己动手实现得了,想偷懒发现更麻烦了。python很简单,pip下下来就可以直接用了,唯一要考虑的就是py2和py3的区别。
应用场景上。python偏应用层,追求的就是开发效率,对程序员要求比c++低,更适合于初学者和编程爱好者,自然需要更多的库来支持,后面自然而然出现pip这样全球共享的平台也不奇怪。c++却感觉慢慢走向精英语言,很多技术被大企业控制,形成商业软件,使用它们的接口价格昂贵,能够在大企业用c++写项目的都是大神,不屑于调用开源库,实现任何功能都是自己造轮子,用时间换取更贴合自己项目的功能,使自己程序更加短小精悍,最终结果也就是越来越闭源。
为什么C++没有Python之类语言这样活跃的生态?我觉得根本原因在于C++没有解决好一个问题:菱形依赖
什么叫菱形依赖呢?就是说A依赖B,A也依赖C,但是B和C同时依赖D,并且我们限定D并不是STL这样的标准库,BCD都是开源库。为了限定到C++,我们这里BCD都是C++库,采用源码的方式发布。
这种情况在生态活跃的语言中则是非常常见的。
在C++当中会怎样呢?
- B和C中至少一个将D的源码合并到了自己的源码里面,放到thirdparty之类的目录里面。A将两份源代码加自己的一起放到thirdparty里面,编译,符号冲突,爆炸。
- B和C在install说明中提到,必须把依赖放到某个地方,然后修改Makefile/CMAKE/Bazel配置,将D的源码目录加进来。结果B和C编译出来的.a里面还是带着D的全部符号,A尝试二进制链接,符号冲突,爆炸。
- B和C在install说明中提到,需要将D的依赖放在某个地方,先编译成.a,设置好参数直接链接.a。但是B和C要求的D的编译参数不一样,链接不到一起,爆炸。
- 把所有的依赖都一个一个放在独立的位置上,设置好include目录,每个都用自己的Makefile独自编译成.a,编译参数用同一套,最后再一个一个指定起来链接到一起——人工成本爆炸。
- A希望B和C通过动态链接方式连接,方便升级。动态链接库里面链接了D的符号,加载起来符号冲突,爆炸。B和C一个动态链接了D,一个静态链接了D,还是符号冲突,爆炸。
- D把自己改成了header only的库,终于不需要单独编译了。B和C在引用D的时候设置的宏不一样,导致编译出的弱符号不兼容,链接完运行崩溃,爆炸。
以上种种,最后对于C++库的作者来说,就变成了这样一个结果:
C++程序员:他们热衷于重复造轮子,别人的东西都是不可靠的,只有自己的才是最可靠的,如果精力、时间允许,用别人的远不如自己造,。
Python程序员:拿来主义编程,有现成的用现成的,没现成的找现成的。
作为一名C/C++开发者,我要在这里来平反了。C++的开源库真的要比Python少吗?下面我来推荐推荐优秀的C++库。
Boost
史上最强大的C++通用库,里面包含大量通用C++库的集合,而且很多优秀的库已经被C++最新标准收纳,例如auto、thread、filesystem等。
作为一个十五年的非专业码农,从大学时代的的C,到工作后的C++、Java,再到如今的Python,说下我的理解。核心关键字:人头,两个核心观点:
- python人多,C++人少,人多开源库自然多
- python原生支持跨平台,面向的用户更广阔,潜在用户多
数量上而言,python取胜,但也要看具体领域
总体而言,python的开源库比C++的开源库多,但具体还是看细分专业领域。尺有所长,寸有所短,python不是万能的,某些领域python不是强项。以下是 github开源仓库下,随机抽的三个主题的语言分布:
- iOS开发是swift和objectiveC的天下
- 算法领域,java、c++、python基本三分天下
- 深度学习领域,python独霸天下
再说,python为什么人多。
人生苦短,我用python。
python 易上手,门槛低,开发效率高,令python开发者众多(个人觉得说是 C++的10倍,不过分)。
没有对比就没有伤害,再看C++,从编写、编译、到跨平台,都十分繁琐枯燥。这种对计算机的精细控制,使得C++开发者对专业要求更高,精细控制,使得程序运行效率高,但也就意味着人少。
python底层几乎全是c/c++库啊,拿python最火的领域来说,opencv, tensorflow,pytorch,甚至numpy,没有一个例外。python只是上面一层很薄的封装,c或c++才是水面下占99.99%体积的冰山。
你看看opencv源码就知道,python的绑定只有几个小文件,而真正实现部分却是成千上万的c++文件。
如果说有1个好用高效且强大的python开源库可用,请相信那很可能因为它下面有数倍甚至上万倍大小的c/c++开源库在默默支持着。点下鼠标看看原码就不会这么天真无邪的胡说八道了。
为什么会这样?你心爱的python居然只是件漂亮的衣服?因为python从出生开始就注定了它跑的慢,那是真的慢!现在几乎没有什么其他流行语言比它还慢的! 比如一个普遍使用的语言javascript,优点之一就是跑的快!所以很多人把c/c++反过来编译成javascript跑在浏览器里, 同样情况却永远不会发生在python身上;多年来人们绞尽脑汁提高它的速度都没辙,甚至还推出了cython,但也最多只是小范围使用罢了,无法改变python的内在基因。一旦python离开c/c++,基本就只能像蜗牛一样爬!
刚好经历了这个时代的变迁,我来说说为什么C++没有python那么多的开源库。
1.经济模式的问题。那个时代IT从业人员很少,互联网也远没有现在发达。一个公司的核心资产就是代码,代码就可以卖钱。产品迭代周期都是以年为单位计的,代码的开发耗费巨大,一旦代码泄露就损失惨重,所以没有人愿意把辛辛苦苦开发出来的代码开源出来。即使愿意将代码开源出来,没有互联网的支撑也无法普及。
2.开源的力量被逐渐认识。随着IT行业的逐渐成熟,特别是LINUX的这个开源旗帜的影响,人们发现原来通过开源可以培养自己所需的人才,将产品渗透到各行各业。作为开源库作者,更可以提高自己在业界的知名度,同时带给自己成就感,一举多得。各种因素使得开源行为被大家所推崇,营造出开源的流行趋势。
3.学习门槛和从业人员的问题。从学习门槛上看,python比C++低很多,开发效率相反却高很多。开发一个python开源库所耗费的精力比开发一个C++库节省太多人力,一个人可以利用业余时间很容易的开发出一个开源库。
4.标准化的提高。得益于IT行业的标准化程度越来越高,很多标准被发布出来。这些标准使得接口行为一致化。在这个前提下,大家也会越来越乐于使用开源库,而不必因为不一致从轮子开始做起。
以前很多语言都不太注重包管理这块,库没有统一的管理中心,会出现很多重复的轮子,社区的力量被分散,高质量的库就少了,你看近几年出来的golang和rust,特别是rust,和C++对标的语言,包管理做得很好,管理中心crates.io上的库也积累越来越多
这似乎不应该这么比,我用Python用的多,c++用的少,以我自己的理解来看,c++多是创造性的东西,而Python多是应用性的东西,举个不恰当的例子,c++的工作更多的是像伏特发明伏打电堆、欧姆发明电流表、法拉第发明电动机一样的创造性工作,而Python更多的是像用电动机组装个电动车、用电流表测量电量、用伏打电堆给电动车供电等类似的应用性工作。
它们的应用场景决定了他们的外在特点,就如同现实世界一样,国际单位只有七个基本单位,物理学的力就那么几种,其他基本效应也屈指可数,可是社会上各种发明物就多了去了,人造的物体根本数不过来,光车就分独轮车、双轮推车、四轮推车、自行车、三轮车、平衡车、遥控车、电动车、拖拉机、越野车、跑车、房车、卡车。。。数不过来根本。
这就是Python库多,而c++看着貌似少的原因
这个问题,其实我们可以观察一下,所有越高级,或者说复杂性越低的语言,你可以用到的来源库,开源框架越多。
像java、python、 php这类语言,更像是一种工具性语言。
而c天/c++更像一种基础性语言。
所以,开源库多少,很大程度是各种语言自身所擅长的领域决定的……
C++时代,还不是开源时代,大家都是闭源。写个功能,dll就能卖钱。那个时代技术值钱,网络也不发达。很多功能是要买的。