3

我想知道“安装”一种编程语言意味着什么。

到目前为止,我的搜索已经产生了两个相互矛盾的答案:

  1. 您无需安装编程语言。您安装一个编译器/解释器,然后只提供包含您的源代码的文本文件。因此,该语言只是您学习的标准化语法,并且编译器/解释器被编程为“理解”。换句话说,语言的“源”不在您机器上安装的某个文件/程序中,而是它的“源”在语言规范、您编写的文本文件以及编译器/解释器“工作”所述文件。(例如,要使用 C++,您必须安装编译器,但您不安装 C++。或者是吗?)

  2. 但是,似乎需要安装某些语言。例如,PHP 文档以标题为“安装和配置”的部分开头。同样,要安装 Python,您必须先下载它。一旦你这样做了,它就会在你的文件系统中显示为一个可执行文件。

那么安装语言究竟意味着什么?安装包含什么?为什么有些语言似乎需要安装(PHP、Python),而有些则不需要(C++)?

谢谢你。

4

1 回答 1

1

为什么有些语言似乎需要安装(PHP、Python),而有些则不需要(C++)?

严格的视图看起来是这样的。

编译器只是二进制文件+src的序列,与任何其他软件包相同。以ClangGCCRust为例。在您的操作系统中,您下载源代码并构建它。机器代码是为您的特定处理单元架构生成的,无论是 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 架构转换一样。硬件开发人员将他们宝贵的时间用于实际改进处理器的原始功率和新功能,而是用于支持旧指令集和指令集的向后兼容性,仅仅是因为软件开发人员更新编译器的速度太慢了。所有这些都在软件-硬件开发周期系统中造成了巨大的“滞后”。

于 2020-04-15T17:20:31.430 回答