C 语言为什么没有发展出类似依赖管理的框架?

2018-01-17 09:26:38 +08:00
 zjsxwc

就算浏览器上 es5 这种没有依赖注入容器,但也有 requirejs 这种管理依赖的东西,

C 语言是怎么管理代码执行时依赖关系?

这里我指的不是 makefile 这种只能算是文件层面的依赖管理。

6789 次点击
所在节点    程序员
34 条回复
northisland
2018-01-17 12:08:33 +08:00
历史包袱。

当年内存还是几十 k,硬盘百十 M 的时代。
你生成个 20M 的 LAPACK 库比取经都难。
所以所有执行文件,都链接这个宝贝库。

不像现在,很多语言能随便打包模块。


解决方法很多人都说了。
northisland
2018-01-17 12:13:48 +08:00
这点黑 C 不过分。

C 系列里库的管理,很屎,比较吃经验。也叫技术门槛。
但因为贴近底层,真心离不开这些"专家"
所以对公司里某套东西现状比较熟的人比较不容易丢饭碗
htfy96
2018-01-17 12:22:31 +08:00
conan + CMake
northisland
2018-01-17 12:31:04 +08:00
仔细看了一下你的描述,你需要了解

1. 目标文件的代码段,数据段,只读数据段是干嘛的。

2. 二进制文件是怎么动态装载,成为运行的程序。

懂了以后你就会发现,你下的 C 要处理数据依赖只能靠手动传结构体指针,完全是胡扯。你学过 extern 关键字么?
zjsxwc
2018-01-17 12:35:06 +08:00
@northisland #24

我刚才看到的几个开源项目,基本上都是通过函数传指针来传数据的,很少用别的方法进行数据共享
zhicheng
2018-01-17 12:42:13 +08:00
看了问题和补充,楼主你是硬把编译型语言往解释型语言的概念上套。有些概念是互相通用的,有些则不是,解释型语言可以在 Runtime 检查依赖,但编译型不行,它必须在 Run 之前解决依赖 (Linker & Loader )。所以你说的那种东西目前在语言层是不存在的。

动态库是可以减少内存使用,但它还有另一个主要作用,如果一个库有更新(比如 libc ),只需要更新这个库就可以了,不需要把所有依赖这个库的程序全部更新一遍。所以很多 OS 现在已经不提供静态库了。
zjsxwc
2018-01-17 12:54:40 +08:00
@zhicheng #26

只是 C 这种传统的编译型语言做不到吧,“新”出来的编译型语言,基本都有类似依赖注入的东西
zhicheng
2018-01-17 13:10:47 +08:00
@zjsxwc 这种方法就是把所有的代码全编译到一个 binary 里完全不使用动态库,可以看一下我回复里关于动态库的解释。这在 C 语言里是不可能的,因为现在很多新的 OS 里没有静态库,只提供动态库。
GeruzoniAnsasu
2018-01-17 13:49:40 +08:00
@hitmanx 动态链接库只是动态链接而已,但链接时的函数签名 ABI 都是固定不可改的,在编译的那一刻起就已经从附带的.h 里编译解析成导入符号写进了 binary 的符号表,说的不可改是指源码意义上无法存在 exec(void* code)这种东西,导入 dll 也好,热更新 dll 也好,源码编译后固定下来的仍然是那些

没想较真所以也没怎么严谨,较真说的话汇编时代就有 smc 自修改用来保护软件,但那对于提升设计毫无帮助



另外怎么说,依赖管理即库 /包管理是不会错的
waruqi
2018-01-17 14:24:53 +08:00
用 xmake
kimown
2018-01-17 18:51:44 +08:00
所以说 c 一直没进步,一点没错,吃老本都能吃十几年,哪个语言赶得上
akann
2018-01-17 23:03:53 +08:00
微软的 visual studio 有 nuget.
akann
2018-01-17 23:08:16 +08:00
google 有 gclient , gyp 一大堆
linux40
2018-01-18 10:37:47 +08:00
你说的这个不就是加载吗?操作系统帮你把加载的事情做了,远程的加载的话有分布式系统支持远程传输共享库啊,你去补一下操作系统的知识吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX