为什么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把自己改成了headeronly的库,终于不需要单独编译了。B和C在引用D的时候设置的宏不一样,导致编译出的弱符号不兼容,链接完运行崩溃,爆炸。以上种种,最后对于C++库的作者来说,就变成了这样一个结果:
如果我要提供一个好用、好编译、不给我天天找事情的库,那么我不能引用其它的开源库
没有比这更矛盾的事情了,要造轮子,第一件事情是不能用别人的轮子。但是如果你要正经开发一个系统,你能保证自己不会有一天需要把这个代码重构成一个通用的库吗?那你就得从第一天开始避免用第三方开源库……
在Linux上面唯一有点生态的意思的做法,是引用yum/apt源里面的xxx-dev这样的库,这些库通过pkgconfig的方式组织,而且通过包管理系统保证大家下载到的都是相同且兼容而且编译好了的二进制库,引用起来很方便。但是,只有把接口限定到纯C才能发布确保二进制兼容的库,那折腾了半天,就算内部是C++开发的,一到库的边界上还得转成纯C,也就失去了C++语言的优势了。
本文仅代表作者观点,版权归属原创作者,如需转载请在文中标注来源及作则名字。
免责声明:本文系转载编辑文章,仅做分享只用,如有疑问请联系邮箱:110@zbj.com
python微服务框架排行榜?
关于python在企业开发中的工作是什么
python的前端和web的前端有什么区别?
编程语言Python有哪些好的Web框架?
用Python爬虫可以爬过去的网站吗?
python和web哪一个更好啊?
python和php哪个更适合做web开发?
Python的优势和缺陷是什么?
如何用python和web.py搭建一个网站?
Python,turtle海龟作图,如何添加背景图片?
用python怎么不刷新网页而监控网页变化?
前端好入门还是Python好入门?
怎么理解Python语言基本算法编程?
python怎么建立socket服务端?
近几年非常流行Python的学习和应用,很多小伙伴都不清楚学了Python之后具体能干啥,还有人问可以用Python开发app吗?今天小编就来解答这个问题,顺便跟大家聊聊Python能干啥。
Python有多好用?为什么很热门?
如何用Python模拟人为访问网站的行为?
python和c语言的区别在应用方面?
0基础自学python,有入门书籍推荐下么
从python基础到爬虫的书有什么值得推荐?