2

我知道机器语言和汇编是特定于硬件的,不同的硬件涉及不同的机器和汇编代码,因此发明了高级语言来解决这些问题。这可能是非常基本的,但我想知道,是否应该将高级语言翻译成每种汇编语言以支持它的相关硬件?

4

3 回答 3

2

编译器是语言和特定平台之间的桥梁,它是将高级语言转换为特定平台的机器代码的编译器。

通常,编译器只为一个特定平台生成可执行文件,因此对于实际在不同平台上工作的语言(并非总是如此),每个平台都有一个编译器。

尽管有些语言具有适用于许多平台的编译器(尤其是 C),但没有一种语言适用于所有平台。

于 2015-10-27T08:41:06.337 回答
2

高级语言要么有一个解释器(通常用可移植的 C 语言编写),要么有一个输出汇编或机器代码的编译器(基本上等价)。如今,各种高级语言的编译器通常是 gcc 或 LLVM 的前端,以利用这些工具的优化和代码生成功能。

因此,要使软件在给定平台上运行,您需要一个可以为该平台生成二进制文件的 C 编译器。这使您可以构建解释器,或直接为目标平台构建二进制文件。C,偶然的历史,是高度可移植的软件开发的主要语言。

某些语言具有自托管编译器。例如,Free Pascal 编译器是在 Free Pascal 中实现的,因此需要单独移植。Fortran 有一个f2c“编译器”,可以将 fortran 转换为 C,由 C 编译器编译。(gfortran不过,它是 Gnu Compiler Collection (gcc) 的一部分,因此 f2c 并没有广泛使用。)

请注意,同一硬件上的不同操作系统通常具有不同的 ABI(应用程序二进制接口)。Windows 二进制文件与 x86-64 Linux 二进制文件在相同的硬件上运行,但进行不同的系统调用。x86-64 FreeBSD 二进制文件进行非常相似的系统调用,并且只需要一个非常轻量级的翻译层即可在 Linux 内核上运行。

一些解释器(Oracle / OpenJDK、python 和其他一些)针对某些特定平台进行了优化。例如,当在 x86 或 x86-64 系统上运行时,好的 JVM 会在运行时将 Java 字节码即时编译为本机机器码。在没有 JIT 引擎的平台上,它会退回到正常的解释。在已经完成优化工作的平台上,这比传统解释器具有更高的性能,但仍然保持一切可移植性。

对新平台的良好移植需要将代码生成引擎移植到新目标。此外,一些 C 软件需要对其#ifdefs 进行调整,以便为新目标选择正确的分支,或者如果它以前不支持所有字节序和类型大小的组合,甚至需要编写一些新代码。


让我们以 Debian 之类的 Linux 发行版为例,其中包含以多种不同语言编写的大量软件作为示例。

首先,您将 gcc 构建为交叉编译器(在您的正常系统上运行,但为目标系统生成二进制文件)。然后,您将为新平台中的任何不同硬件编写 Linux 驱动程序,以及引导加载程序加载 Linux 内核所需的任何内容。

一旦您构建了足够的二进制文件以在新硬件上启动 Linux 并运行 gcc,新端口将自托管并引导一个完整的环境,其中包含适用于所有高级语言的编译器和解释器。

我省略了很多细节,因为答案有 30k 个字符的限制,而且我不想点击它。对 Guffa 的回答的评论中有一些讨论,它描绘了一幅比理想世界的图景更不乐观的图景,在理想世界图景中,所有有问题的语言解释器都有一个独立于平台的可移植性后备。

于 2015-10-27T08:43:26.103 回答
0

我相信“所有硬件”的问题可以通过为每个硬件平台发布特定的二进制文件来解决。例如,您有一个用于 Mac 和 PC 的单独二进制文件。

于 2015-10-27T08:23:26.750 回答