gli*_*orm 5 installation programming-languages interpreted-language compilation compiled-language
我想知道“安装”编程语言意味着什么。
到目前为止,我的搜索产生了两个相互矛盾的答案:
您没有安装编程语言。您安装编译器/解释器,然后只需向其提供包含源代码的文本文件。因此,该语言只是您学习的标准化语法,并且编译器/解释器被编程为“理解”。换句话说,该语言的“源”并不在您机器上安装的某个文件/程序中,而是在语言规范、您编写的文本文件以及编译器/的能力中。解释器“处理”所述文件。(例如,要使用 C++,您必须安装编译器,但您不安装 C++。或者您这样做吗?)
但是,似乎需要安装某些语言。例如,PHP 文档以标题为“安装和配置”的部分开头。同样,要安装 Python,您必须首先下载它。一旦完成,它就会作为可执行文件显示在您的文件系统中。
那么安装语言到底意味着什么呢?安装包含什么?为什么有些语言似乎需要安装(PHP、Python),而另一些语言则不需要安装(C++)?
谢谢。
为什么有些语言似乎需要安装(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)构建它们,或者从现有的二进制文件(Microsoft)中提取其特定 CPU 所需的代码。或者在某些情况下两者兼而有之(Ubuntu 和其他基于二进制的 linux)。
上面描述的“源安装”可能看起来很复杂,但“二进制安装”实际上对编译器来说要复杂得多,因为你要检查环境,检查依赖关系,检查库,然后检查硬件,然后提取二进制部分,然后重新编译二进制部分不能具有相同的(x86 与 x64)或只是为不同的体系结构和体系结构技巧(如 ELF/WINPE 二进制兼容性、“setjmp”跳转约定等)提供相同编译器的不同版本。
附言。另外,不从源代码构建编译器也会阻碍硬件开发人员,就像 x86 -> x86_64 架构过渡一样。硬件开发人员利用他们宝贵的时间不是为了实际改进处理器的原始能力和新功能,而是为了支持旧指令集和指令集的向后兼容性,这仅仅是因为软件开发人员更新编译器的速度太慢。所有这些都在软件-硬件开发周期系统中造成了巨大的“滞后”。
| 归档时间: |
|
| 查看次数: |
2204 次 |
| 最近记录: |