9

为什么每个架构都必须重新编译 C?无论如何,它不都以位和字节的形式结束并加载和跳转吗?每个架构本质上不是以相同的方式通过最基本的命令吗?

4

5 回答 5

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

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

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

于 2013-08-11T11:13:24.227 回答
2

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

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

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

于 2013-08-11T11:13:50.803 回答
1

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

于 2013-08-11T11:13:13.583 回答
0

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

于 2013-08-11T11:34:34.247 回答