从CISC到RISC:CPU指令集架构的演进与融合

发布时间:2026/9/26 8:26:37
从CISC到RISC:CPU指令集架构的演进与融合 CPU 也不是一开始就长成现在这个样子。今天手机里那颗芯片和 40 年前服务器里的芯片在设计哲学上曾经走向过完全相反的方向一个拼命把指令做复杂一个拼命把指令做精简。这场关于指令集架构的路线之争影响了整个计算机工业的格局。本文想从“指令集架构”这个底层视角把 CPU 的发明脉络和 CISC 与 RISC 这两大阵营的碰撞完整梳理一遍。无论你是刚接触计算机组成原理的学生还是已经写了多年代码但没仔细研究过 CPU 底层设计的开发者这篇文章都能帮你建立一张清晰的地图CPU 为什么叫 CPU指令集是什么CISC 和 RISC 到底在争什么又是如何走向融合的。1. CPU 到底是怎么“发明”的1.1 从“计算”到“中央处理单元”现代人打开任务管理器就能看到 CPU 占用率却很少意识到“CPU”这个概念本身是逐步收敛出来的。早期计算机并没有一个独立封装的处理芯片。第一台电子计算机 ENIAC 里负责运算和控制的电路分散在大量的真空管和继电器里程序员靠插拔电缆来改变机器的行为后来才有了存储程序计算机把指令和数据一起放到内存里处理器依次读取并执行。这是冯·诺依曼体系结构的关键思想也是 CPU 概念得以成立的前提。所谓中央处理单元就是把取指令、译码、执行、写回这一套流程固化到一块专用电路里并让它能和内存、输入输出设备协同工作。1940 到 1960 年代这个“单元”是由许多独立元器件搭出来的。真正改变格局的是集成电路技术把成千上万个晶体管做进一小块硅片处理器才有机会从柜子变成芯片。1.2 从多个芯片到一个微处理器1971 年Intel 发布了 4004对外宣城是“一个可编程的通用处理器”。严格来说它只有 2300 个晶体管主频 740kHz只能处理 4 位数据和今天动辄几百亿晶体管的 CPU 相比简陋得像玩具。但 4004 的意义在于它证明了处理器可以做成单芯片。如果继续追溯还有更早的军事项目但真正让微处理器进入商业应用并普及的仍然是 4004 以及随后的 8008、8080 这一系列产品。这个过程可以简单理解为先有分离的逻辑电路再有把逻辑电路封装进芯片的尝试最后出现通用可编程的微处理器。微处理器是 CPU 的实物形态而 CPU 则是微处理器内部的逻辑核心。今天我们混用“CPU”和“微处理器”本质上是在讨论同一类东西。1.3 指令集CPU 的“语言”和“行事准则”要让一块硅片完成不同任务不能每次重新设计电路而要让程序员写出“机器能懂的命令”。这种命令的集合就是指令集也就是 Instruction Set Architecture简称 ISA。指令集定义了 CPU 支持多少条指令、每条指令接收什么参数、寄存器有多少个、内存怎么寻址。程序员写的高级语言最终要被编译成汇编再由汇编器转成机器码机器码就是指令集的二进制形态。CPU 在执行一条指令时其实是在执行一条流水线取指(Fetch) → 译码(Decode) → 执行(Execute) → 访存(Memory) → 写回(Writeback)这一步在几乎所有的现代 CPU 中都类似区别在于指令本身是粗还是细。有的指令一条就能完成一次内存读取、一次乘法、一次加法有的指令得拆成好几条才能完成同样的事情。于是就有了 CISC 和 RISC 的路线分化。2. CISC追求“让机器指令贴近人的写法”2.1 CISC 的设计哲学CISC 是 Complex Instruction Set Computer 的缩写即复杂指令集计算机。它的核心思路是让每条指令尽量“能干大事”把频繁出现的高级操作直接做成硬件指令程序员和编译器都不需要拆步骤。这种设计在上世纪六七十年代非常自然。当时内存很小、编译器技术不成熟程序员经常直接写汇编。如果一条指令能完成一个相对完整的功能比如“把内存某个地址的值取出来加上某个寄存器再存回去”代码写起来会短很多。典型 CISC 机器还支持变长指令一条指令可能占 1 个字节也可能占 15 个字节寻址方式非常多有的指令甚至可以直接操作内存。2.2 复杂指令带来的硬件负担CISC 听起来方便但对硬件来说并不友好。指令复杂意味着译码电路复杂每条指令的执行步骤完全不同控制逻辑几乎不可能全部用硬连线实现于是引入了微程序控制把每条机器指令翻译成一段更底层的微指令序列由微指令直接控制硬件。微程序存储在 ROM 中相当于把“复杂”转嫁给了微代码。这就带来几个问题译码时间是变长的难以让固定深度的流水线保持高效。微代码占据芯片面积且难以像硬连线逻辑那样快速优化。指令虽然少但每条指令执行所需的时钟周期差异极大。编译器优化受到干扰因为指令语义复杂很难精确估计执行代价。2.3 CISC 的典型代表与应用场景最典型的 CISC 架构就是 x86。Intel 从 8086 开始定义的指令集一直向后兼容到今天的酷睿处理器。如果你打开汇编课本看到“MOV AX, [1234H]”这种操作它通常来自 x86 汇编。CISC 处理器还有早期的大型机和小型机传统比如 IBM System/360 系列也有很多复杂指令它可能是最早大规模采用微码控制的系统之一。CISC 在个人电脑时代获得了绝对统治地位因为 x86 兼容性太强。软件和操作系统都建立在 x86 指令集的基础之上即使后来许多人诟病 x86 内部过于复杂也无法轻易替换。这正是“生态”的力量。3. RISC把指令砍到“只剩骨头”3.1 RISC 的思想来源RISC 是 Reduced Instruction Set Computer 的缩写即精简指令集计算机。虽然名字里带有“减少”但它的意义并不只是减少指令数量而是建立一套更规整、更容易高效执行的指令格式。这个思想在 1980 年前后开始成形主要推手包括加州大学伯克利分校的 David Patterson、斯坦福大学的 John Hennessy以及 IBM 的 801 项目。他们通过对大量程序运行数据的统计发现程序里 80% 的操作只用到 20% 的指令。既然如此为什么不让 CPU 只保留最简单最常用的指令把复杂操作交给编译器去组合RISC 设计一般遵循几个原则指令长度固定比如 32 位就是 32 位便于快速取指和译码。指令数量少格式规整不搞大量特殊寻址。只有 load/store 指令可以访问内存其他指令只在寄存器之间运算。寄存器数量多减少内存访问频率。控制逻辑尽量使用硬连线不使用或少用微码。3.2 流水线与指令长度固定的指令长度对流水线是巨大的优势。流水线本来像工厂流水作业如果每道工序耗时不同整条流水线的节奏就被最慢的工序拖累。CISC 的变长指令让取指阶段无法确定下一条指令从哪里开始于是需要复杂的预取和解码机制RISC 却可以简单地将 32 位定长指令填入流水线每个阶段耗时就比较均匀。来看一个 RISC 风格的汇编对比。假设要计算a b c 1RISC 风格的指令大概是# RISC 风格伪汇编 LW R1, b_addr # 从内存加载 b 到寄存器 R1 LW R2, c_addr # 从内存加载 c 到寄存器 R2 ADD R3, R1, R2 # R3 R1 R2 ADDI R3, R3, 1 # R3 R3 1 SW R3, a_addr # 把 R3 写回内存如果用 CISC 风格可能一条指令就能完成类似效果# CISC 风格伪汇编 ADD a, b, c, 1 # 假设机器支持四操作数复合指令RISC 风格代码看起来更长但每条指令都可以高频率低延迟地执行整体吞吐反而更高编译器也更容易调度。3.3 RISC 的典型代表RISC 的知名代表非常多ARM、MIPS、PowerPC、SPARC、RISC-V。其中 ARM 是当代最成功的 RISC 架构它的授权模式让苹果、高通、华为、三星等公司可以设计各自的处理器核心但指令集统一生态兼容。MIPS 曾是大学计算机体系结构课程的标准教材架构虽然在消费市场逐渐边缘化但它对教育的影响非常深远。RISC-V 则是新一代开源指令集不掌握在任何一家商业公司手里近年来在嵌入式、AI 和学术领域迅速升温。所以“RISC 和 CISC 是 50 年战争”这个说法并不夸张。1970 年代 CISC 因为内存和编译器限制而占上风1980 年代 RISC 凭借流水线理论冲击了 CISC 的统治1990 年代 x86 用解码器融合的方式保住了桌面市场2000 年代 ARM 在手机端全面胜利。今天你已经很难找到一台“纯粹 CISC”或“纯粹 RISC”的处理器了现代 CPU 普遍采用混合设计。4. 50 年战争关键节点与路线演变4.1 1970 年代CISC 的主场1970 年代主流的处理器普遍走复杂指令路线。原因很现实一方面内存昂贵程序当然越短越好另一方面编译器不发达很多性能关键代码靠手写汇编复杂指令能减轻程序员的负担。Intel 8086 在 1978 年发布奠定了 x86 的基础。它的指令集确实很杂指令长度从 1 字节到 6 字节不等寻址方式很多还保留了对 BCD 运算等冷门的支持。IBM PC 采用 8088(8086 的 8 位外部总线版本)之后x86 迅速变成事实标准。Motorola 68000 系列也是典型的 CISC 风格被用于早期的 Macintosh 和 Amiga指令寻址模式非常丰富。这一时期的处理器没有太强的流水线概念一条复杂指令按微码逐条执行CPU 主频即使提上去单条指令的平均周期数也很高。4.2 1980 年代RISC 的正面进攻真正给 CISC 敲响警钟的是 1980 年代的 RISC 研究。伯克利分校设计了 RISC-I 和 RISC-II斯坦福设计了 MIPS。IBM 也在 1980 年完成 801 原型机证明了精简指令的可行性。1986 年ARM 从英国 Acorn 公司独立出来第一代 ARM 处理器功耗低、结构简单为后来移动端霸主埋下伏笔。RISC 处理器的效率数据很惊艳。同等工艺下RISC 处理器往往用更少的晶体管实现更高的指令吞吐主频也能拉得更高。工作站市场迅速涌现出一批 RISC 处理器Sun 的 SPARC、MIPS 公司的 R 系列、HP 的 PA-RISC、IBM 的 POWER。很多人当时断定RISC 会像取代复杂指令一样彻底取代 CISC。但现实并没有完全按这个剧本走。原因之一是 x86 已经积累了大量软件资产。Windows、DOS 应用、办公软件都基于 x86二进制兼容性是硬约束。另一个原因是 Intel 没有坐以待毙而是开始做“类 RISC 改造”。4.3 1990 年代x86 的逆袭与融合1993 年Intel 发布 Pentium随后又引入 P6 微架构。这一代 x86 CPU 从外观上仍然执行 x86 指令内部却完全变了样前端把复杂的 x86 指令翻译成更简单的微操作也就是 micro-ops然后交给后端的 RISC 风格执行单元处理。这就是“CISC 外壳RISC 内核”的混合模式。这种设计让 x86 保住了兼容性又获得了类似 RISC 的执行效率。AMD 很快也跟进类似思路通过“解码后执行”的微架构x86 阵营重新回到舞台中央。从 1990 年代末到 2010 年代x86 处理器在服务器和桌面端不仅没有衰落反而越来越强。同一时期IBM 和 Motorola 合作开发 PowerPC苹果从 Motorola 68000 转向 PowerPC一度成绩不错但后来因为功耗和散热问题苹果在 2005 年又转向 Intel x86。ARM 则安静地在嵌入式市场布局从手机传感器控制器一路发展到应用处理器等待属于它的爆发时刻。4.4 2000 年代以后手机改变了游戏规则PC 时代是 x86 的天下但手机时代重新拉高了 RISC 的声量。智能手机需要高性能同时极低功耗x86 的复杂解码和功耗策略在这个场景中显得笨重。ARM 的简洁指令集配合高能效设计成为移动设备的首选。苹果在 2007 年发布 iPhone之后自研芯片基于 ARM 指令集ARM 公司自己不制造芯片只提供指令集授权和核心设计客户定制程度很高。今天的主流手机 SoC无论是高通骁龙、联发科天玑、苹果 A 系列还是华为麒麟核心都是 ARM 架构。与此同时Intel 尝试进入移动市场x86 手机处理器也曾出现在市场上但性能和功耗终究没有形成优势。2020 年苹果发布 Apple M1随后推出 M 系列芯片把 ARM 架构带到 Mac 桌面端。这一步直接打破了 x86 在桌面端的垄断预期。从软件角度看开发者关心的问题变成了我的程序在 ARM 指令集下能否高效运行。4.5 当下RISC-V 与开放指令集战争的新章节正当 ARM 与 x86 在移动和桌面边界博弈时RISC-V 以开源指令集的身份出现。RISC-V 来自伯克利2010 年前后启动它不是某家公司的产品而是一套开放标准任何组织都可以在此基础上设计 CPU 而不需要支付授权费。RISC-V 的优势在于指令集极简且模块化可以按需组合扩展。不受单一公司控制供应链风险更低。学术界可自由修改和实验学生可以直接在 Rocket、BOOM 等开源核心上做研究。在物联网、边缘计算、AI 加速器等领域快速渗透。当然RISC-V 在生态成熟度上还远不如 x86 和 ARM。软件库、调试工具、操作系统支持、开发板种类都在增长但和三十年积累的 ARM 生态相比仍有差距。可以预见未来十年会是 x86、ARM、RISC-V 三方共存并相互借鉴的时代。5. 现代 CPU 已经不再“非此即彼”5.1 CISC 与 RISC 的边界正在模糊我们习惯把架构分成两类但真实工业产品并不遵守这种僵化分类。现代 x86 CPU 内部有一个解码器它把变长的 x86 指令翻译成若干定长微操作这些微操作很像 RISC 指令。后端执行单元由多个专门管线组成每个管线处理一种类型的微操作比如算术逻辑单元、加载存储单元、浮点单元。反过来现代 ARM CPU 也不再是教科书里那种简单五级流水线。为了提升性能它引入了乱序执行、分支预测、寄存器重命名、超标量发射等复杂机制这些技术的复杂度一点也不比 x86 低。ARM 为了保持向后兼容也在不断扩充指令集比如 NEON 向量指令、SVE 可伸缩向量指令等指令数量已经远远超过第一代 RISC 的“精简”状态。所以更准确的说法是CISC 和 RISC 在表面的设计哲学上对立在实际产品中已经走向融合。指令集设计者都在追求同一个目标在给定晶体管预算和功耗预算下让程序执行得更快。5.2 指令解码的“翻译层”与微码前文提到的微码是一个非常容易混淆的概念。早期 CISC 机器里微码是控制 CPU 内部信号的终极解释器每条机器指令对应一段微程序。现代 x86 CPU 已经减少了对微码的依赖简单常用指令直接用硬连线解码复杂指令和罕见指令才回退到微码。这种设计兼顾了性能和兼容性。如果你对“CPU 是如何思考的”这个问题感兴趣可以想象 CPU 内部其实有一个翻译官团队。指令夺取进来划分边界识别操作码生成控制信号再交给执行单元。这个过程对程序员是透明的但对性能的影响非常明显解码器设计的优劣会直接决定指令吞吐。5.3 对普通开发者的实际影响说这么多底层内容普通人写代码时到底要注意什么任一组装计算机、买 CPU 时面对的是 x86 或 ARM 两种 ISA 的选择。你在 Windows 上安装软件标记 x64 或 ARM64就是这个选择。你在服务器上部署容器镜像平台字段写 amd64 还是 arm64也是这个选择。在 Java、Python、Go 这类语言中ISA 的影响比较隐蔽因为编译器或解释器已经帮你翻译好了。但如果你做底层开发、编写驱动、做性能调优就有必要知道自己的目标平台属于哪种风格。RISC-V 相关的开发板虽然小众但非常适合学习因为你可以在上面用开源工具链做完整的 CPU 设计实验。6. 常见误解与高频疑问6.1 高频误解澄清误解说法实际解释CISC 一定比 RISC 慢不能简单对比。现代 x86 内部已经 RISC 化两者的性能差距更多来自工艺、缓存、乱序执行能力而非指令集本身RISC 就是指令更少不只少还要求格式规整、寻址简单、load/store 分离。RISC-V 也在不断扩展指令数量并不少精简指令集一定省电低功耗是多因素结果指令集只是其中一环。ARM 功耗低还因为设计目标更早聚焦能效CPU 主频越高越快主频只是性能指标的一部分IPC(每周期执行指令数)同样重要。现代 CPU 更讲究能效比RISC-V 是国产芯片RISC-V 是开源指令集不是某一个国家的项目。很多国产芯片基于 RISC-V但 RISC-V 本身与国籍无关6.2 面试和笔试中常见的指令集问题问为什么 x86 被称为 CISC但现在的 Intel CPU 性能依然很强答因为现代 x86 处理器在内部使用微操作流水线本质上用 RISC 风格的后端执行复杂指令流既保证兼容性又获得了高效执行能力。这种混合架构称作熔融微架构更准确。问RISC-V 的“V”代表什么答RISC-V 的 V 可以理解为第五代该项目源自伯克利名称是对之前 RISC-I、RISC-II、RISC-III、RISC-IV 的延续。从技术上它是一套基础整数指令集加多个可选扩展模块。问汇编语言中的复杂寻址对编译器有什么挑战答复杂寻址让指令调度困难编译器难以精确建模每条指令的周期数也难以为变量分配最佳寄存器布局所以现代编译器往往倾向于使用简单寻址加显式 load/store这也变相印证了 RISC 思想的正确性。7. 如果想深入学习 CPU 设计应该从哪里入手7.1 入门学习路线如果你想系统理解 CPU 和指令集建议按以下顺序走学习一门体系结构课程教材可以参考《计算机组成与设计硬件/软件接口》这本书由 Patterson 与 Hennessy 合著恰好是两位 RISC 先驱的教材。读《计算机体系结构量化研究方法》更偏进阶包含大量真实性能数据和设计权衡。尝试用 Logisim 类工具设计一个简易 CPU理解取指、译码、执行和数据通路的基本原理。这也是很多学校“多周期 MIPS CPU 设计”课程的标准玩法。尝试用 Verilog 或 Chisel 写一个小型 RISC-V 核心结合开源仿真器跑通汇编程序。下载 QEMU 等模拟器把 x86、ARM、RISC-V 三种平台的程序跑一遍观察不同 ISA 的 ABI 和指令编码差异。工具链方面RISC-V 生态已经相当完整。你可以安装 riscv64-unknown-elf-gcc 交叉编译工具链把一个 hello.c 编译成 RISC-V 汇编再用模拟器运行# 安装交叉编译器示例具体包名以发行版为准 sudo apt install gcc-riscv64-unknown-elf qemu-user然后写一个最简单的 C 文件#include stdio.h int main() { printf(RISC-V Hello\n); return 0; }编译并运行riscv64-unknown-elf-gcc -o hello hello.c qemu-riscv64 ./hello输出会显示RISC-V Hello。这段过程可以帮助你直观感受到 ISA 只是软件接口的一部分实际运行效果还依赖模拟器、系统调用和链接库。如果你不想用命令行也可以在浏览器里打开 RISC-V 模拟器在线运行汇编代码从最简单的addi a0, zero, 42开始尝试。7.2 理论联系实际观察你身边的 CPU观察自己电脑和手机的架构可以在命令行中快速查看# 查看 Linux 系统 CPU 架构 uname -mx86_64 表示该 CPU 是 64 位 x86 兼容架构aarch64 则代表 64 位 ARM 架构。在 macOS 上可以用uname -m查看 Apple Silicon 芯片的架构输出为 arm64。Windows 可以在“系统信息”中查看“系统类型”比如“基于 x64 的电脑”。这种小检查能帮你把抽象概念和日常设备连起来。买手机时看到“Armv8”“A76 核心”就不会再觉得这些词只是营销术语编译程序看到“不支持当前指令集”的报错时也能第一时间联想到硬件和应用软件之间的指令集匹配问题。8. 从历史中能学到的工程思维CISC 与 RISC 的竞争表面是技术的胜负实际上是一场围绕约束的博弈。CISC 诞生在内存稀缺、编译器弱势的年代所以它通过硬件复杂化换取程序体积RISC 诞生在晶体管工艺进步、编译器成熟的年代所以它通过软件复杂化换取硬件加速。没有永远正确的架构只有适合当前约束的设计。Intel x86 用四十多年证明了向后兼容的力量。哪怕内部已经改得面目全非对外仍要保证旧软件能运行这种兼容包袱既是成本也是壁垒。ARM 用二十年证明了能效的重要。它一开始没有盲目冲击桌面而是在嵌入式领域积累等到功耗成为核心指标的移动时代就自然起势。RISC-V 则证明了一件更符合开发者心理的事如果指令集本身也是一种“软件生态”那么开放标准就可能改变由少数公司主导的芯片格局。回到最初的问题CPU 是怎么发明的答案不是一个孤立的灵感而是无数工程约束的叠加。从 ENIAC 的插拔电缆到 4004 的单芯片化再到 RISC 和 CISC 的路线分流芯片产业始终在用更聪明的结构去换取更快的执行和更低的成本。理解了这条主线再看今天各种 CPU 天梯图、参数对比和架构分析就不会再被表面数字迷惑而能真正读懂每一代芯片设计背后的权衡。如果你对底层计算感兴趣下一步可以亲自写一个简单的模拟 CPU或者找一块 RISC-V/ARM 开发板做实验。CPU 不是黑盒它只是一套你尚未阅读的指令手册。而指令集之争说到底就是在问同一个问题人与机器之间到底该由谁来复杂。