为什么大多数应用程序都是预编译的?

为什么大多数应用程序都是预编译的?

自从我开始组装电脑以来,这个问题就一直困扰着我。游戏和应用程序都是二进制可执行文件,但我如何才能充分利用 CPU 的高级指令集。英特尔和 AMD CPU 之间肯定有区别,但在下载页面上,他们只关心您的操作系统。操作系统是否为所有规格提供抽象层?

答案1

Intel 和 AMD CPU 之间肯定有区别

差别非常小。所有 64 位 Intel CPU 本质上都使用“AMD64”指令集,AMD64 和 Intel 的 EM64T 之间只有细微的差别。

(当然,实际的底层架构完全不同,但微代码将所有这些都隐藏在外部视图中。操作系统唯一看到的就是 x86 或 AMD64 指令。

虽然较新的 CPU 通常比较旧的 CPU 支持更多指令,即使在相同的基础架构中也是如此,但通常这种差异只在特定情况下才真正重要,因此可以构建软件以自动使用最佳变体。(例如,TL​​S 库将自动检测系统是否支持 AES 指令)

AMD64 本身实际上是基于英特尔自己的 32 位“x86”指令集构建的,并且仍然属于“英特尔架构”这一通用术语。(AMD 早在 Am486 时就开始构建与英特尔兼容的 CPU。)

英特尔确实尝试过创建一个全新的 64 位架构 Itanium (IA64),但是失败了。

其他不兼容的架构确实存在,其中最突出的是 Arm64,而且缺少这些架构的二进制可执行文件通常是一个问题。

操作系统是否为所有规范提供了抽象层?

一般来说,他们不会。

但在特定情况下– 例如,Apple 的 macOS 在 Intel CPU 上运行时会自动翻译旧的 PowerPC 二进制文件,现在在 Apple Silicon(即 Arm64)上运行时会自动翻译 Intel 二进制文件。

同样,Windows 过去在 Alpha 上提供 x86 仿真,现在它提供x86 和 Arm32 仿真在 Arm64 上。

Linux 默认不会模拟任何东西,特别是因为大多数软件都可以重新编译(发行版通常会为相当多的架构构建软件包),但它确实有适用于各种架构的“qemu-user”。

最后,在 .NET 或 Java 等“字节码”平台上构建的程序默认或多或少都是跨架构的。

相关内容