下载各类开源软件时如何选择正确版本?X86、X86-64、X64、ARM64、AMD64、DMG 等是什么意思?

通常情况下,当你使用电脑时,操作系统已经预装好,并且已经正确选择了适合你 CPU 的版本。同样的,商店里提供的软件通常也是预先配置好以支持你的 CPU 平台的。

然而当我们自己去 GitHub 上找一些软件的时候,就会发现琳琅满目的版本,例如:

在这里插入图片描述

提前做一个明确,以下名称存在等价关系
X86-64 = X64 = AMD64,因此,往后统称为 X64,但是,在不同的网站、安装包上仍可能看到不同的叫法,只要记住他们是同一个东西就行,对于大部分 WIN 端个人电脑,无脑选以上三个版本就可以。

举例来说,Ubuntu OS 提供的版本选择中,第一个就是 amd64()= X86-64 = X64),也即英特尔、AMD 芯片的指令集架构,因此选择第一个第二个都可以,区别是有无 GUI。
在这里插入图片描述

指令集

指令集(Instruction Set)就像是计算机硬件和软件之间的桥梁,它定义了处理器可以执行的基本操作。操作系统和应用软件必须根据指令集来编写,才能在特定的处理器上运行。
而 CPU 的架构本质上就是由其对应的指令集决定的,这意味着我们熟悉的操作系统和软件都与 CPU 的架构密不可分。

X86、X64(也即X86-64、AMD64)、ARM64 都属于指令集架构(ISA, Instruction Set Architecture)。

由于指令集架构不同,因此同一款软件,需要针对不同指令集架构重新编写,就会出现区分版本的情况。


以编写苹果生态软件为例子,当开发者编写好 Swift 代码后,可以使用 Xcode 将源代码通过编译器(如 LLVM、GCC)生成 ​​特定架构的机器码,由于苹果目前存在两个体系的芯片,Xcode 会将 Swift 代码分别编译为 ARM64(苹果 A/M 系列) 和 x86-64(旧款 Intel Mac) 的可执行文件,以供这两个类型的芯片选择合适的软件版本。

由于,即使是二者共有的操作(如加法),在不同指令集架构下的机器码不同。例如:

  • x86-64 的加法指令编码为 01 D8(ADD EAX, EBX);
  • ARM64 的加法指令编码为 8B 00 00 0B(ADD W0, W1, W2)。

因此,编译为 ARM64 架构的程序,是不能直接在基于 x86-64 架构的芯片上运行的。

假设现在分别存在一台 M4 芯片的 Mac、一台 旧款 intel 芯片的 Mac、一台新款 IPhone,现在三者同时搜索应用商店下载微信,尽管搜索出来的 App 看起来是完全的一样的,但是,在实际点击下载以后,本地发送给系统的下载中,请求的标签会不同,例如:

旧款 intel Mac :x86_64-macos
M4 Mac: ARM64_macos
IPhone: ARM64_ios

通过这样,让用户无感下载软件,而无需考虑软件版本–尽管用户最终下载到本地的,确实是不同版本的微信。

  • 对于最常见的 AMD 处理器、英特尔酷睿(Core)处理器,就是 X64 指令集架构,且由于 64 位架构兼容 32 位架构,因此 X64 指令集架构的 CPU 也能运行 X86 指令集架构的软件。
  • 对于 iPhone\Mac 系列,采用了英特尔芯片的机器,是 X64 指令集架构;采用了 A\M 系列芯片的机器,是 ARM64 指令集架构。

故事时间

1978 年 6 月 8 日,Intel 发布了 8086 处理器,开启了 x86 架构的时代。8086 是一款 16 位微处理器,它不仅是 Intel 最成功的处理器系列的开端,也标志着 x86 指令集的诞生。x86 指令集是一套用于 Intel 兼容微处理器的计算机语言指令集,它定义了处理器的基本功能和编程模型。随着 8086 的推出,x86 架构开始了其长达数十年的发展历程,并最终成为个人计算机和服务器领域的主流架构之一。随后,Intel 不断发展 x86 指令集,推出了 8086、80186、80286、80386(进入32位时代)、80486、80586 等处理器。

我们可以发现之前 cpu 命名就是 80-x-86 的格式,所以也叫 80x86,后来叫着叫着就变成了x86。当然后续尽管 Pentium 改了名字,但是仍然是基于 x86 的这套指令集下发展的。

在这个过程中,AMD 作为 Intel 的竞争对手,也开始生产兼容 x86 指令集的处理器。特别是在 386 和 486 时代,AMD 作为 Intel 的第二源供应商,为 x86 架构的发展做出了贡献。

进入 90 年代后,随着计算需求的增长,Intel 和 AMD 都意识到 32 位架构的局限性,开始着手开发 64 位扩展。1999年,AMD 率先发布了x86_64 指令集,作为 x86 架构的 64 位扩展。x86_64 保持了与现有 32 位 x86 代码的兼容性,同时提供了更大的寻址空间和更多的寄存器,使得应用程序可以利用更多的内存。

与此同时,Intel 也推出了自己的 64 位架构 IA-64,即安腾(Itanium)。但与 x86_64 不同,IA-64 走了另一条路线,当时他们规划的是未来是高性能计算才需要 64 位的计算,在那个家用电脑的内存通常在 64MB 到 128MB 的年代,64 位理论支持 2^64 字节等于 17179869184 GiB内存是超乎想象的。因此 IA-64 设计之初,就是一种全新的架构,与 x86 不兼容。它采用了EPIC(Explicitly Parallel Instruction Computing)设计,更侧重于服务器和高性能计算领域。

不过计算机的发展,往往是生态大于技术先进性的,就像 OSI 的 7 层网络模型虽好,但是市场上的 TCP/IP 模型已经成为事实上的主流标准了。由于 AMD 的 x86_64 的向下兼容性和更平滑的迁移路径,它很快在市场上占据了主导地位。微软、Linux等主要操作系统都提供了x86_64 版本。相比之下,IA-64 由于其独特的架构和有限的软件生态,一直处于小众地位。

随着 x86_64 的成功,AMD 将其重命名为 AMD64,以强调自己的贡献和品牌。虽然 Intel 后来也采用了 x86_64 标准(称为 Intel 64),但AMD64 这个名字已经深入人心。时至今日,x86_64/AMD64已经成为了服务器、桌面电脑和笔记本电脑的主流架构,而 IA-64 则主要局限于某些特定的服务器领域。

AMD64 不仅提供了 64 位计算能力,而且具有出色的向下兼容性。这意味着在 AMD64 平台上,64位应用程序可以与 16 位和 32 位应用程序共存。这一特性在现实世界中非常有利,因为它允许逐步过渡到 64 位环境,而不会带来兼容性问题。AMD64 还以其能够同时支持 32 位和 64 位计算而闻名,而且不会影响性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值