C 运行时,就是实现 C 规范的库。操作系统内核介于硬件与软件间,C 运行时介于内核与用户软件间。
在 Windows 上是 Microsoft Visual C Runtime Library,也就是你经常看到的 vc_redist-x86.exe
安装进来的,在控制面板里叫作 Microsoft Visual C++ 2017 Redistributable。
在 Linux 下,主流的 C 运行时实现是 glibc。大多数软件都是用 glibc 编译的,构成了 GNU 生态,也就是 GNU/Linux 这个名字的由来。GNU 跟 Linux 是紧紧绑定的。
但是后面有另外一个 C 运行时出来挑战 glibc 的地位,叫 Musl。注重更好的性能、更小的可执行程序和安全。作者做的 benchmark 表示 Musl 在很多方面优于 glibc。
看了一个 Reddit 帖子 很好地解释了 Musl 的一些问题:
- glibc 编译出来的软件,无法跟 musl 的兼容。比如你想用 musl 编译你的程序,但是你用的库是 glibc 编译的,那你不得不重新把库用 musl 编译一次
- 大多数发行版会选择 glibc,因为它的生态庞大。如果发行版要同时支持 musl 和 glibc,那它要把全部包编译两份
- Systemd 「故意」用了 glibc 专有的部分 GNU 扩展,导致使用 Musl 的发行版,无法使用 glibc
- 闭源、专有软件等,可能无法重新用 musl 编译;各类驱动,如 nvidia 的显卡驱动,可能写了大量跟 glibc 具体实现相关的代码,移植到 Musl 很难
Musl 的一些使用场景:
- 专注于容器的发行版 Alpine 使用 Musl,非常轻量