为什么C平台依赖?

为什么必须为每个架构重新编译C? 它是不是最终都是位和字节,加载和跳转? 每个架构是否基本上都以相同的方式通过最基本的命令?

  1. 不同的CPU具有不同的指令体系结构(例如,x86与ARM)。
    • 早期的Mac使用摩托罗拉68k架构; 后来使用PowerPC; 后来还使用了x86。 在每次转换期间,开发人员必须将其可执行文件作为胖二进制文件发送 ,这两个二进制文件将包含两种体系结构的对象代码。
  2. 当前的x86 CPU具有32位和64位模式。
    • 这就是为什么你有32位和64位版本的Windows,Ubuntu等。
  3. 不同的操作系统提供不同的系统调用,库等。
    • 不同的OS 版本也可以提供不同的系统调用,库等(尽管OS供应商确实旨在尽可能向后兼容)。
  4. 即使在相同的操作系统上,不同编译器之间的调用约定也不保证是相同的。
    • 即使在相同的OS上,也可能使用不同的可执行文件格式。 例如,在许多Unix系统上,a.out曾经是使用的格式,但大多数最终切换到ELF。 在过渡期间,必须以两种格式提供图书馆。

每个架构是否基本上都以相同的方式通过最基本的命令?

在大多数情况下。 但是这些基本命令的表示或实现方式不同。 C编译器负责确保使用正确的表示和实现。

是的,但所有这些负载和跳跃等在不同平台上看起来都不同。 每个CPU系列都有自己的命令集。

在更高的层次上,如果我们拥有相同的硬件但不同的操作系统(例如Linux / Windows),我们有不同的库,不同的可执行文件格式等等。

所有这些都是编译器和链接器必须遵守的。

但每台机器都有自己的指令集

每个尝试抽象一些function,如每种语言一样,需要调整到具体的架构,或者创建一个可以运行它的虚拟机(对于每个架构)。