为什么有些语言似乎需要安装(PHP、Python),而有些则不需要(C++)?
严格的视图看起来是这样的。
编译器只是二进制文件+src的序列,与任何其他软件包相同。以Clang或GCC或Rust为例。在您的操作系统中,您下载源代码并构建它。机器代码是为您的特定处理单元架构生成的,无论是 CPU 或 GPU 还是专用硬件。
它看起来像这个 SRC=>BIN。然后编译器使用自己再次构建它的源代码。
SRC => BIN => SRC => BIN2
问题出现了。如果你需要编译器来构建自己,你如何在第一轮构建它?这个问题有一个简洁的部分,bootstrapping。
另一个问题是,你如何决定何时停止?您可以从不同角度构建编译器,关注“大小”或“速度”或“编译时间”或所有这些。
当您根本不自己构建编译器时,编译器会变得更糟吗?是的,它会更糟,但在什么方面呢?它很可能会变得臃肿,即大小增加,编译时间会更长。
还有编译器之外的东西。在 Linux 上拥有编译器意味着它将生成 ELF 二进制文件,因此您需要“libelf”。它要求您首先获得某些库,即'libatomic'、'libgcc'、'libstdc++'、'mpfr'、'gmp'、'coreutils'。这些库正在构建您的“环境”,因此您可能能够从以前的编译器迭代(在本例中为 GCC)构建下一个编译器迭代。
有些语言有自己编写的编译器,比如 PyPy。但是初始 python 编译器无论如何都会要求你有 C 语言来构建初始版本并拥有库环境。
软件正在老化,这意味着正在创建更新版本的库和工具,因此应该定期从源代码重建编译器,并由它们重建整个系统。
所以严格来说,所有语言都需要“安装”,这意味着用户应该从源代码(Linux)构建它们,或者从现有的二进制文件(微软)中提取特定 CPU 所需的代码。或者两者兼而有之,在某些情况下(Ubuntu 和其他基于二进制的 linux)。
上面所说的“源码安装”可能看起来很复杂,但是“二进制安装”其实对于编译器来说要复杂得多,因为你要检查环境,检查依赖,检查库,然后检查硬件,然后提取二进制部分,然后重新编译你的二进制部分。不能具有相同的(x86 与 x64)或只是为不同的架构和架构技巧(如 ELF/WINPE 二进制兼容性、“setjmp”跳转约定等)提供相同编译器的不同版本的数量。
PS。同样,不从源代码构建编译器也会阻碍硬件开发人员,就像 x86 -> x86_64 架构转换一样。硬件开发人员将他们宝贵的时间用于实际改进处理器的原始功率和新功能,而是用于支持旧指令集和指令集的向后兼容性,仅仅是因为软件开发人员更新编译器的速度太慢了。所有这些都在软件-硬件开发周期系统中造成了巨大的“滞后”。