高级语言是否支持与所有硬件相关的所有汇编语言?
Does a high-level language support all of the assembly languages related to all hardware?
我知道机器语言和汇编是特定于硬件的,不同的硬件涉及不同的机器和汇编代码,所以发明了高级语言来解决这些问题。
它可能非常基础,但我想知道,是否应该将一种高级语言翻译成每种汇编语言以支持它的相关硬件?
我相信 "All hardware" 的问题可以通过为每个硬件平台发布特定的二进制文件来解决。例如,Mac 和 PC 有单独的二进制文件。
编译器是语言和特定平台之间的桥梁,它是将高级语言翻译成特定平台机器代码的编译器。
通常编译器只为一个特定平台生成可执行文件,因此对于实际在不同平台上运行的语言(并非总是如此),每个平台都有一个编译器。
尽管有些语言具有适用于多种平台的编译器(最著名的是 C),但没有一种语言适用于所有 平台。
高级语言要么有一个解释器(通常用可移植的 C 编写),要么有一个编译器输出汇编或机器代码(本质上是等价的)。如今,各种高级语言的编译器通常是 gcc 或 LLVM 的前端,以利用这些工具的优化和代码生成功能。
因此,要在给定平台上制作软件 运行,您需要一个可以为该平台制作二进制文件的 C 编译器。这使您可以构建解释器,或直接为目标平台构建二进制文件。 C,由于历史的偶然,成为高度可移植软件开发的主要语言。
有些语言有自托管编译器。例如Free Pascal 编译器是在 Free Pascal 中实现的,因此需要单独移植。 Fortran 有一个 f2c
"compiler" 将 fortran 翻译成 C,由 C 编译器编译。 (不过,gfortran
是 Gnu Compiler Collection (gcc) 的一部分,因此 f2c 的用途并不广泛。)
请注意,同一硬件上的不同操作系统通常具有不同的 ABI(应用程序二进制接口)。 Windows 二进制文件 运行s 在与 x86-64 Linux 二进制文件相同的硬件上,但进行不同的系统调用。 x86-64 FreeBSD 二进制文件进行非常相似的系统调用,只需要一个非常轻量级的翻译层到 Linux 内核上的 运行。
一些解释器(Oracle / OpenJDK、python 和其他一些解释器)针对某些特定平台进行了优化。例如,当 运行ning 在 x86 或 x86-64 系统上时,一个好的 JVM 会即时将 java 字节码编译为本机机器代码,因为它是 运行ning。在没有 JIT 引擎的平台上,它会退回到正常的解释。在已经完成优化工作的平台上,这比传统解释器具有更高的性能,但仍然保持一切可移植性。
良好 移植到新平台需要将代码生成引擎移植到新目标。此外,一些 C 软件需要调整其 #ifdef
s 来为新目标选择正确的分支,或者如果它以前不支持字节序和类型大小的所有组合,甚至需要编写一些新代码。
让我们以像 Debian 这样的 Linux 发行版为例,以大量不同语言编写的软件为例。
首先,您将构建 gcc 作为交叉编译器(运行 在您的普通系统上,但为目标系统生成二进制文件)。然后,您将为新平台中的任何不同硬件编写 Linux 驱动程序,以及引导加载程序加载 Linux 内核所需的任何内容。
一旦您构建了足够的二进制文件以在新硬件和 运行 gcc 上启动 Linux,新端口是 self-hosting 和 bootstrapping一个包含所有高级语言的编译器和解释器的完整环境可以认真开始了。
我省略了 很多 的细节,因为答案有 30k 个字符的限制,我不想按它。在对 Guffa 的回答的评论中有一些讨论描绘了一幅远不如理想世界图景美好的图景,其中所有有问题的语言解释器都有一个独立于平台的可移植性后备。
我知道机器语言和汇编是特定于硬件的,不同的硬件涉及不同的机器和汇编代码,所以发明了高级语言来解决这些问题。 它可能非常基础,但我想知道,是否应该将一种高级语言翻译成每种汇编语言以支持它的相关硬件?
我相信 "All hardware" 的问题可以通过为每个硬件平台发布特定的二进制文件来解决。例如,Mac 和 PC 有单独的二进制文件。
编译器是语言和特定平台之间的桥梁,它是将高级语言翻译成特定平台机器代码的编译器。
通常编译器只为一个特定平台生成可执行文件,因此对于实际在不同平台上运行的语言(并非总是如此),每个平台都有一个编译器。
尽管有些语言具有适用于多种平台的编译器(最著名的是 C),但没有一种语言适用于所有 平台。
高级语言要么有一个解释器(通常用可移植的 C 编写),要么有一个编译器输出汇编或机器代码(本质上是等价的)。如今,各种高级语言的编译器通常是 gcc 或 LLVM 的前端,以利用这些工具的优化和代码生成功能。
因此,要在给定平台上制作软件 运行,您需要一个可以为该平台制作二进制文件的 C 编译器。这使您可以构建解释器,或直接为目标平台构建二进制文件。 C,由于历史的偶然,成为高度可移植软件开发的主要语言。
有些语言有自托管编译器。例如Free Pascal 编译器是在 Free Pascal 中实现的,因此需要单独移植。 Fortran 有一个 f2c
"compiler" 将 fortran 翻译成 C,由 C 编译器编译。 (不过,gfortran
是 Gnu Compiler Collection (gcc) 的一部分,因此 f2c 的用途并不广泛。)
请注意,同一硬件上的不同操作系统通常具有不同的 ABI(应用程序二进制接口)。 Windows 二进制文件 运行s 在与 x86-64 Linux 二进制文件相同的硬件上,但进行不同的系统调用。 x86-64 FreeBSD 二进制文件进行非常相似的系统调用,只需要一个非常轻量级的翻译层到 Linux 内核上的 运行。
一些解释器(Oracle / OpenJDK、python 和其他一些解释器)针对某些特定平台进行了优化。例如,当 运行ning 在 x86 或 x86-64 系统上时,一个好的 JVM 会即时将 java 字节码编译为本机机器代码,因为它是 运行ning。在没有 JIT 引擎的平台上,它会退回到正常的解释。在已经完成优化工作的平台上,这比传统解释器具有更高的性能,但仍然保持一切可移植性。
良好 移植到新平台需要将代码生成引擎移植到新目标。此外,一些 C 软件需要调整其 #ifdef
s 来为新目标选择正确的分支,或者如果它以前不支持字节序和类型大小的所有组合,甚至需要编写一些新代码。
让我们以像 Debian 这样的 Linux 发行版为例,以大量不同语言编写的软件为例。
首先,您将构建 gcc 作为交叉编译器(运行 在您的普通系统上,但为目标系统生成二进制文件)。然后,您将为新平台中的任何不同硬件编写 Linux 驱动程序,以及引导加载程序加载 Linux 内核所需的任何内容。
一旦您构建了足够的二进制文件以在新硬件和 运行 gcc 上启动 Linux,新端口是 self-hosting 和 bootstrapping一个包含所有高级语言的编译器和解释器的完整环境可以认真开始了。
我省略了 很多 的细节,因为答案有 30k 个字符的限制,我不想按它。在对 Guffa 的回答的评论中有一些讨论描绘了一幅远不如理想世界图景美好的图景,其中所有有问题的语言解释器都有一个独立于平台的可移植性后备。