【计算机基础】下载软件时看到的 x64 和 ARM64 到底是什么?一文搞懂 CPU 指令集

【计算机基础】下载软件时看到的 x64 和 ARM64 到底是什么?一文搞懂 CPU 指令集 文章目录一、为什么软件安装包需要区分版本1.1 从一个常见现象说起1.2 CPU 的“语言”指令集架构二、x86-64 和 ARM64两种主流指令集架构2.1 x86-64兼容性优先的复杂指令集2.2 ARM64规则简单的精简指令集2.3 x86-64 和 ARM64 的核心区别三、x86-64 和 ARM64 能否互相运行3.1 重新编译最直接的解决方案3.2 二进制翻译让不同架构程序“临时转换”3.3 模拟器完整模拟另一种 CPU写在文后 个人主页铁皮哥欢迎关注 作者简介28届校招生后端开发/Agent 方向在学 学习内容Java、Python、计算机视觉、大语言模型、Agent开发 专栏内容从零开始的Claude Code零代码生活✨不只背八股更想搞懂为什么这样设计一、为什么软件安装包需要区分版本1.1 从一个常见现象说起在下载软件时相信很多人都遇到过这样的选择Windows x64 Windows ARM64 macOS Intel macOS Apple Silicon Linux x86_64 Linux ARM64对于大多数用户来说选择操作系统并不困难因为 Windows、macOS、Linux 这些名称大家都比较熟悉。但当后面出现x64、ARM64、Intel、Apple Silicon等选项时很多人可能就不知道应该如何选择了。同一个软件为什么需要提供多个版本如果软件功能完全一样为什么不能只发布一个安装包让所有电脑都可以运行呢要理解这个问题首先需要知道软件运行的本质。我们平时编写的程序例如 C、C、Rust 等语言代码本质上只是方便人类阅读和编写的文本CPU 并不能直接理解这些代码。程序在运行之前需要经过编译器转换将高级语言代码转换成 CPU 能够执行的机器指令。整个过程大致如下高级语言代码 ↓ 编译器 ↓ 机器指令 ↓ CPU执行其中最关键的一步就是生成适合目标 CPU 的机器指令。不同 CPU 的设计方式不同它们能够识别的机器指令也不同。例如一台使用 Intel 或 AMD CPU 的电脑通常执行的是 x86-64 指令而搭载 Apple Silicon 芯片的 Mac则执行 ARM64 指令。因此同一个软件的源代码经过不同方式编译后会得到面向不同 CPU 架构的程序。例如软件源码 ↓ 编译为 x86-64版本 ↓ 运行在 Intel/AMD CPU电脑上 软件源码 ↓ 编译为 ARM64版本 ↓ 运行在 Apple Silicon电脑上这就是为什么软件开发者通常需要提供多个版本的安装包。1.2 CPU 的“语言”指令集架构CPU 只能执行由 0 和 1 组成的机器指令。例如程序中的aa1;经过编译后可能会变成类似这样的机器指令读取数据 执行加法 保存结果但不同 CPU 对这些操作的表达方式并不相同。比如 x86-64 CPU 和 ARM64 CPU就拥有不同的指令格式、寄存器设计以及执行规则。为了规范 CPU 应该支持哪些指令以及这些指令如何工作人们定义了一套标准这就是指令集架构Instruction Set ArchitectureISA。简单来说指令集就是 CPU 和软件之间交流的“语言”。使用 x86-64 架构的 CPU只能直接理解 x86-64 指令使用 ARM64 架构的 CPU则需要执行 ARM64 指令。二、x86-64 和 ARM64两种主流指令集架构目前无论是个人电脑、服务器还是移动设备我们接触到的大多数 CPU基本都属于两大指令集阵营x86-64和ARM64。它们虽然都可以完成程序执行但在指令设计理念上存在明显区别。其中最核心的区别之一就是x86-64 使用变长指令而 ARM64 使用固定长度指令。这个差异也影响了两种 CPU 在性能、功耗以及设计复杂度上的不同。2.1 x86-64兼容性优先的复杂指令集x86-64 是目前 PC 和传统服务器领域最主流的指令集架构。它的发展历史可以追溯到 1978 年 Intel 发布的 8086 处理器之后经过多次扩展从 16 位 x86 发展到 32 位再到今天的 64 位 x86-64。如今的 Intel Core、Intel Xeon、AMD Ryzen、AMD EPYC 等处理器都采用 x86-64 架构。x86-64 最大的优势是极强的软件兼容能力。由于 x86 架构发展时间非常长大量 PC 软件、企业应用以及游戏都是围绕 x86 架构建立的。例如一个十年前开发的 Windows 软件只要系统兼容通常仍然可以运行在今天的新款 Intel 或 AMD 处理器上。x86 是典型的复杂指令集架构CISCComplex Instruction Set Computer。所谓复杂指令集就是 CPU 支持大量功能不同的指令并且一条指令可以完成比较复杂的操作。更重要的是x86 指令长度是可变的它的指令长度可以是 1 字节、2 字节、3 字节…最长可达到 15 字节。这意味着CPU 在读取指令时并不知道下一条指令具体从哪里开始。例如连续的机器码10101010 11001100 00110011 ...CPU 需要先解析当前指令的长度然后才能确定下一条指令的位置。因此x86 CPU 的执行流程中需要非常复杂的指令译码逻辑。这种设计的优势是可以保持历史兼容指令表达能力强。但缺点是CPU 前端设计复杂指令解析成本较高功耗控制更加困难。2.2 ARM64规则简单的精简指令集ARM64 是 ARM 架构的 64 位版本也叫 AArch64。ARM 最初主要应用于移动设备因此设计目标和 x86 不同x86 更关注如何兼容过去几十年的软件。ARM 更关注如何用更低功耗获得足够高的性能。目前Apple Silicon、手机芯片以及部分云服务器 CPU 都采用 ARM64 架构。ARM64 最大的特点是指令长度固定。ARM64 中绝大多数指令都是4 字节32 bitCPU 在读取指令时不需要额外判断长度。执行流程更加简单读取4字节 ↓ 解析指令 ↓ 执行这种设计带来的好处是指令边界明确译码更加简单更容易进行流水线优化。这也是 ARM64 采用精简指令集RISCReduced Instruction Set Computer的体现。RISC 的核心思想是使用数量较少、格式统一的简单指令通过组合完成复杂任务。相比之下CISC 少量复杂指令完成复杂操作 RISC 多个简单指令组合完成复杂操作ARM64 虽然可能需要更多指令完成同样的任务但由于每条指令结构更加规则CPU 可以更加容易地提升执行效率。这也是 ARM 在手机和低功耗设备中占据优势的重要原因。2.3 x86-64 和 ARM64 的核心区别综合来看两种架构最大的区别如下对比项x86-64ARM64指令集类型CISCRISC指令长度可变长度1~15字节固定长度4字节指令数量多历史包袱重少设计更规则指令解析复杂简单兼容性强相对较弱功耗通常较高通常较低主要场景PC、服务器手机、嵌入式、部分服务器不过需要注意的是现代 CPU 的实现已经不像早期架构那么简单。例如现代 x86 CPU 内部通常会把复杂的 x86 指令转换成更简单的微操作Micro-Operation再交给执行单元处理。因此软件看到 x86复杂指令 CPU内部 转换成类似RISC的微操作执行这也是为什么现代 x86 处理器依然能够拥有非常高的性能。最终两种架构形成了不同的发展路线x86-64 依靠几十年的生态积累占据 PC 和传统服务器市场ARM64 依靠低功耗和高能效在移动设备以及新兴服务器领域快速发展。三、x86-64 和 ARM64 能否互相运行在前面的内容中我们了解到x86-64 和 ARM64 使用的是两套完全不同的指令集。那么问题来了如果一台 ARM64 电脑想运行 x86-64 软件或者 x86-64 电脑想运行 ARM64 软件有没有办法实现呢答案是可以但不能直接运行需要借助额外的转换机制。目前主要有三种方式重新编译二进制翻译指令模拟3.1 重新编译最直接的解决方案如果软件拥有完整的源代码那么解决不同 CPU 架构兼容问题最简单的方法就是针对目标架构重新编译。例如一个 C 项目的源码main.cpp可以分别编译成x86-64版本 main.cpp ↓ x86编译器 ↓ xxx-x64.exe ARM64版本 main.cpp ↓ ARM编译器 ↓ xxx-arm64.exe最终得到两个不同版本的程序。这种方式性能最好因为程序运行时不需要额外转换。但是它必须拥有源代码如果一个软件只有已经编译好的二进制文件xxx.exe开发者没有提供源码那么就无法简单重新生成 ARM64 版本。这也是历史软件迁移时最大的困难。3.2 二进制翻译让不同架构程序“临时转换”如果没有源码还有一种方式动态二进制翻译Dynamic Binary Translation。它的核心思想是在程序运行过程中把一种 CPU 指令转换成另一种 CPU 指令。例如ARM64 软件运行在 x86-64 CPU 上ARM64机器指令 ↓ 二进制翻译层 ↓ x86-64机器指令 ↓ CPU执行这样 CPU 实际执行的仍然是自己能够理解的指令。最著名的例子就是 Apple 的Rosetta 2。在 Apple 从 Intel Mac 转向 Apple SiliconM 系列芯片之后大量原本为 Intel x86-64 编译的软件无法直接运行。于是 Apple 提供了 Rosetta 2Intel Mac软件 (x86-64) ↓ Rosetta 2转换 ↓ Apple Silicon执行 (ARM64)用户几乎感觉不到底层变化很多 Intel 软件可以直接运行在 M 系列 Mac 上。但是二进制翻译也存在代价需要额外的转换过程部分场景性能会下降某些底层程序可能无法兼容。3.3 模拟器完整模拟另一种 CPU除了二进制翻译还有另一种方法是模拟整个 CPU 环境。模拟器会虚拟出一个完整的目标 CPUARM64程序 ↓ ARM模拟器 ↓ 模拟一个x86 CPU ↓ 运行x86系统和软件例如在 ARM64 设备上模拟一个完整的 x86 电脑环境。这种方式兼容性更强因为它不仅转换指令还可以模拟CPU内存外设操作系统环境但是代价也非常明显性能损失较大。因为真实 CPU 执行程序只需要一次指令执行而模拟器需要执行模拟程序 ↓ 模拟CPU行为 ↓ 执行目标指令中间增加了大量额外工作。因此模拟器通常用于软件测试老系统运行教学研究而不是日常运行大型软件。写在文后期待您的一键三连如果有什么问题或建议欢迎在评论区交流