高级语言是否支持与所有硬件相关的所有汇编语言



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

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

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

有些语言有一个自托管编译器。例如,Free Pascal编译器是在Free Pascal中实现的,因此需要单独移植。Fortran有一个f2c"编译器",它将Fortran翻译成C,由C编译器编译。(不过,gfortran是Gnu编译器集合(gcc)的一部分,因此f2c并没有广泛的用处。)

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

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

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


让我们以Debian这样的Linux发行版为例,以许多不同语言编写的大量软件为例。

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

一旦您构建了足够的二进制文件,可以在新硬件上启动Linux并运行gcc,新端口就是自托管,并且可以真正开始为所有高级语言启动一个包含编译器和解释器的完整环境。

我省略了很多细节,因为答案有3万个字符的限制,我不想触及它。在对古法答案的评论中,有一些讨论描绘了一幅远没有理想世界那么美好的画面,在理想世界中,所有有问题的语言解释器都有一个独立于平台的可移植性回退。

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

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

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

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

最新更新