百科问答小站 logo
百科问答小站 font logo



为什么C++没有Python那么多开源库? 第1页

  

user avatar   ling-jian-94 网友的相关建议: 
      

看了好多回答,还是觉得有更本质的原因的,根源还是在C++这个语言特性上

为什么C++没有Python之类语言这样活跃的生态?我觉得根本原因在于C++没有解决好一个问题:菱形依赖

什么叫菱形依赖呢?就是说A依赖B,A也依赖C,但是B和C同时依赖D,并且我们限定D并不是STL这样的标准库,BCD都是开源库。为了限定到C++,我们这里BCD都是C++库,采用源码的方式发布。

这种情况在生态活跃的语言中则是非常常见的。

在C++当中会怎样呢?

  1. B和C中至少一个将D的源码合并到了自己的源码里面,放到thirdparty之类的目录里面。A将两份源代码加自己的一起放到thirdparty里面,编译,符号冲突,爆炸
  2. B和C在install说明中提到,必须把依赖放到某个地方,然后修改Makefile/CMAKE/Bazel配置,将D的源码目录加进来。结果B和C编译出来的.a里面还是带着D的全部符号,A尝试二进制链接,符号冲突,爆炸
  3. B和C在install说明中提到,需要将D的依赖放在某个地方,先编译成.a,设置好参数直接链接.a。但是B和C要求的D的编译参数不一样,链接不到一起,爆炸
  4. 把所有的依赖都一个一个放在独立的位置上,设置好include目录,每个都用自己的Makefile独自编译成.a,编译参数用同一套,最后再一个一个指定起来链接到一起——人工成本爆炸
  5. A希望B和C通过动态链接方式连接,方便升级。动态链接库里面链接了D的符号,加载起来符号冲突,爆炸。B和C一个动态链接了D,一个静态链接了D,还是符号冲突,爆炸
  6. D把自己改成了header only的库,终于不需要单独编译了。B和C在引用D的时候设置的宏不一样,导致编译出的弱符号不兼容,链接完运行崩溃,爆炸

以上种种,最后对于C++库的作者来说,就变成了这样一个结果:

如果我要提供一个好用、好编译、不给我天天找事情的库,那么我不能引用其它的开源库

没有比这更矛盾的事情了,要造轮子,第一件事情是不能用别人的轮子。但是如果你要正经开发一个系统,你能保证自己不会有一天需要把这个代码重构成一个通用的库吗?那你就得从第一天开始避免用第三方开源库……

在Linux上面唯一有点生态的意思的做法,是引用yum/apt源里面的xxx-dev这样的库,这些库通过pkgconfig的方式组织,而且通过包管理系统保证大家下载到的都是相同且兼容而且编译好了的二进制库,引用起来很方便。但是,只有把接口限定到纯C才能发布确保二进制兼容的库,那折腾了半天,就算内部是C++开发的,一到库的边界上还得转成纯C,也就失去了C++语言的优势了。


user avatar   skywind3000 网友的相关建议: 
      

因为很多 C++程序员的口号就是:别人的东西都是不可靠的,信不过的,只要我精力和能力允许,用别人的还不如自己造,只有自己的才是最可靠的。因此从性格上就不倾向于协同,碎片严重。

而 Python 程序员的口号则是:有现成的用现成的,没现成的找现成的,找不到,我就不做了,因此从性格上倾向于协作。

很多 C++ 项目造轮子之心比 python 强很多,代码都没写三行,起手就是一个 BaseObject,要用我的库,必须继承我这个 BaseObject 或者 BaseTemplate,所有参数传递都要套一个 base::my_smartest_ptr<xx> 的劣质套套,再来一个 mini 基础库,定义一堆新的数据结构让你用。

人家就是来买你一根烤羊肉的,你就爱在你的烤肉串外面套一层 shit 强卖给人家,人家恐怕连你羊肉串都不想吃了。

Python 不会有这个情况,首先 py 基础库非常强大统一,不需要象 C++ 一样,项目稍微写大点都要发明半套基础库一样,成为新项目使用的障碍。Python 项目大部分就是专注解决 1-2 个痛点,不执着造轮子,不同的项目就容易在统一的基础库的语义下进行协同。

好点的 C++ 库是非侵入式的,比如把 API 封装成 C 的,全部用基础类型作为接口,这样内部你自己用成一朵花都没人管你,用 cffi 让脚本语言直接调用也比较方便。

因此从好恶上,前者更偏向于单枪匹马自己搞定一切,而后者更喜欢协同。


user avatar   iausk 网友的相关建议: 
      

前面的答案靠谱,说一个电视台对政治的影响力:

作为右派大本营,默多克旗下的fox可以说对共和党选战都有不少影响,默多克看来不喜欢罗姆尼,所以Fox news对罗姆尼的支持可谓不痛不痒,默多克更欣赏的共和党人是现任新泽西的州长大人,他曾经数度想邀请州长大人出山,不过未果。

Fox 上的态度大概代表了共和党基本盘,就是所谓广大红脖子保守派,所以看来温和的罗姆尼难以得到这些人坚定支持(太文质彬彬,不够hard或者土气),看看共党头号狗头军师卡尔洛夫之流的人,他们才是共党能选赢的保证。




  

相关话题

  只会c如何快速上手STL? 
  为什么现在部分985高校还是给大一上C语言课? 
  C++动态二维数组如何使用智能指针? 
  如何评价博客园关于 C++ 的这篇热门文章? 
  const TYPE * 究竟限制的是什么? 
  为什么C++的 extern "C" 里面可以使用C里面不存在的STL和引用&等C++才有的特性 ? 
  C++ make_tuple返回值类型,会有效率问题吗? 
  做32位/64位跨版本编程,有什么需要注意的么? 
  如果 C# 当年设计成一个彻底编译到机器码的但有运行时的 AOT 语言,能不能真的拿来代替 C++? 
  MFC、WTL、WPF、wxWidgets、Qt、GTK 各有什么特点? 

前一个讨论
计算机系如何写出优雅的实验报告?
下一个讨论
一个博士生接受怎样的训练是完整、全面的科研训练?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利