如题。现在的平台/编程语言运行时,按兼容性大致可以分成几类:
- 几乎不变动,程序可以动态链接/调用:POSIX API ,Win32 API ;经常变动,但可以自由安装:Python ,Java ,NodeJS ,C# .NET……;经常变动,但直接嵌入到编译后的程序:Go ,Rust……。
唯独 C 和 C++,在 Linux 下不仅经常变动,并且不向前兼容(即旧版 libc(++) 不能运行新版 libc(++) 的程序)、不互相兼容( musl-libc 的程序不能用 glibc 运行),我在 Arch 上编译的程序几乎没法拿到 Ubuntu LTS 上运行,只能开个 Docker 容器来编译。
这就导致两个奇怪的现象:
- 在面向旧发行版开发 C/C++ 的时候,很多人宁愿自己搭古老开发环境来编译,也不愿/不能升级目标环境。而在 Python 、Java 之类的语言里,第一反应是直接给目标环境装个新版 Python/JRE 。很多 C/C++ 软件不得不发布一堆变体来保证兼容性(此外,C++ 还有 CXX11ABI 的兼容性问题),或者干脆让用户自己编译(然而用户并不是何时都有空、有能力搭环境,尤其是一些编译依赖非常复杂的软件)。
但似乎很少有人会专门去下载标准库实现。除了 Conda ,好像也没人关心怎么打包标准库。
为什么 C/C++ 不像 JRE 那样,发布一个 C/C++ Runtime 呢,这样分发软件不是方便得多吗?