高级 #hardware#architecture#risc#cisc

RISC vs CISC

RISC(精简指令集)和 CISC(复杂指令集)是两种不同的 CPU 指令集设计哲学——一个追求"小而快",一个追求"大而全",它们的竞争塑造了现代处理器格局

两种设计哲学

如果你要设计一个指令集(ISA),有两种思路:

CISC(Complex Instruction Set Computer,复杂指令集计算机)

  • 指令功能强大,一条指令能做复杂操作
  • 指令长度不固定(1-15 字节)
  • 硬件复杂,但编译器简单

RISC(Reduced Instruction Set Computer,精简指令集计算机)

  • 指令简单基础,复杂操作由多条指令组合
  • 指令长度固定(通常 32 位)
  • 硬件简单,但编译器需要做更多工作

类比:工具包

  • CISC = 瑞士军刀——一把刀上有几十种功能,每个功能都不算特别好用,但胜在方便
  • RISC = 专业工具套装——每把工具只做一件事,但做得特别好;你需要更多把工具来完成复杂任务

历史背景

CISC 的起源(1970s)

早期计算机的内存非常昂贵(1 KB 就要几百美元)。为了节约内存,设计者希望代码越短越好——于是有了 CISC 的思路:一条指令完成尽可能多的工作。

; CISC 风格:一条指令完成内存到内存的字符串复制
REP MOVSB    ; 重复复制字节直到 CX=0

这条 REP MOVSB 等价于几十条 RISC 指令——但占用更少的字节。

RISC 的兴起(1980s)

1980 年代,两位研究者 Patterson 和 Hennessy(后来写了《Computer Organization and Design》)分析了大量 CISC 代码后发现:

  1. 80% 的指令用了 20% 的指令类型——复杂指令很少被用到
  2. 编译器倾向于使用简单指令——复杂指令没有被充分利用
  3. 复杂指令导致流水线设计困难——指令长度不统一、执行时间不固定

于是他们提出了 RISC 理念:去掉不常用的复杂指令,让剩下的简单指令执行得更快。

RISC 与 CISC 的核心区别

特征RISCCISC
指令数量少(50-100 条)多(300-1000+ 条)
指令长度固定(32 位)可变(1-15 字节)
寻址方式少(1-3 种)多(10-30 种)
操作对象寄存器到寄存器寄存器/内存混合
内存访问只有 LOAD/STORE算术指令可直接操作内存
CPI(每指令周期数)通常 11 ~ 20+
控制单元实现硬布线(简单)微程序(复杂)
编译器复杂度较高较低

具体示例对比

用 RISC(ARM)和 CISC(x86)实现同样的功能:

// C 代码
*a = *b + 10;

x86(CISC)风格:

MOV EAX, [EBX]    ; 从内存读值到 EAX
ADD EAX, 10       ; 加 10
MOV [ECX], EAX    ; 写回内存

ARM(RISC)风格:

LDR R0, [R1]      ; LOAD:从内存读到 R0
ADD R0, R0, #10   ; 加 10
STR R0, [R2]      ; STORE:写回内存

看起来差不多,但区别在于数据可以走的路径不同——在 CISC 中,ADD 可以直接用内存操作数,而 RISC 必须先用 LDR 加载到寄存器。

再看一个更复杂的例子:

// 把 *a 复制到 *b,然后两者都加 1
*a = *b++;

x86(CISC)——一条指令搞定:

MOVSB   ; 复制 [ESI] → [EDI],同时 ESI++、EDI++
        ; 一条指令完成了:读内存、写内存、两个寄存器自增

ARM(RISC)——需要拆成多条:

LDRB R0, [R1]    ; 读一个字节到 R0
STRB R0, [R2]    ; 写入目标地址
ADD  R1, #1      ; 源指针 +1
ADD  R2, #1      ; 目标指针 +1

CISC 更紧凑(代码量小),但每条复杂指令在 CPU 内部需要被拆解成多个微操作。

性能对比

代码密度(Code Density)

CISC 的指令编码更紧凑——同一程序 CISC 版本的二进制通常比 RISC 小 30-50%:

程序x86(CISC)ARM(RISC)比例
简单循环15 字节24 字节1.6×
中等程序~50 KB~75 KB1.5×
大型应用~2 MB~3 MB1.5×

💡 这是为什么早期计算机采用 CISC——内存太贵了!但在今天内存已经非常便宜,代码密度不再是主要考量。

执行速度

年代RISC 相比 CISC 的优势原因
1990sRISC 快 2-4 倍流水线设计简单,时钟频率更高
2000s基本持平CISC 加入了 RISC 内核(微码翻译)
2010s+界限模糊都采用相似的底层技术

现代 CPU:CISC 的表面,RISC 的内核

现代 x86 CPU(Intel Core、AMD Ryzen)实际上是:

x86 程序(CISC 指令)

  x86 解码器(复杂)
    ↓  将 CISC 指令转换为 RISC 风格的微操作(μops)
 微操作序列(RISC-like)

  RISC 风格流水线执行核心

 结果提交(重排序恢复 CISC 语义)
一条 x86 复杂指令:
ADD [mem], EAX    ; 从内存读、加 EAX、写回内存

被解码器拆成 3 个 μops:
① LOAD  temp, [mem]    ← RISC 风格的加载
② ADD   temp, EAX      ← 简单运算
③ STORE [mem], temp    ← RISC 风格的存储

🔑 关键洞察:现代”CISC”CPU 内部实际上是 RISC 架构。x86 指令集只是”表面皮肤”,底层的执行核心和 RISC 没有本质区别。这就是为什么现代 x86 CPU 能达到和 RISC CPU 相近的性能。

现代 RISC 架构代表

架构设计者典型应用特点
ARMARM Holdings手机、嵌入式(90%+ 移动设备)低功耗、高能效
RISC-VUC Berkeley(开源)新兴,IoT,AI完全开源、可扩展
MIPSMIPS Technologies路由器、嵌入式经典教学架构
PowerPCIBM服务器、游戏主机(PS3)高频率
SPARCSun/Oracle服务器高可靠性

ARM:RISC 的成功典范

ARM 处理器统治了移动设备——从 iPhone 到 Android,从智能手表到智能电视:

ARM 的成功公式:
低功耗 × 足够性能 × 授权模式 = 无处不在

典型的 ARM CPU 功耗:
- Cortex-A (手机): 1-5W
- Cortex-M (嵌入式): 1-100 mW
- Cortex-X (旗舰): 5-10W

对比 x86 CPU:
- Intel Core: 15-125W

RISC-V:开源的 RISC

RISC-V 是近年兴起的开源指令集架构——不同于 ARM(商业授权)和 x86(封闭),任何人都可以免费使用 RISC-V:

RISC-V 的设计理念:
- 基础指令集不到 50 条指令
- 模块化扩展(M 乘法、F 浮点、V 向量...)
- 学术界和工业界都能自由使用
- 从嵌入式到超级计算机都可覆盖

指令集的设计取舍

CISC 的优势场景

; 字符串处理——CISC 有专用指令
REPNE SCASB    ; 扫描字符串直到找到指定字符
               ; 一条指令完成循环 + 比较 + 递增

; RISC 需要展开成循环
loop:
    LDRB R0, [R1]
    CMP  R0, #char
    BEQ  found
    ADD  R1, #1
    B    loop
found:

RISC 的优势场景

; 高频简单的运算——RISC 有优势
; 循环体只有 3-4 条指令
; RISC 可以轻松流水线化

loop:
    LDR  R0, [R1], #4   ; 加载并自增
    ADD  R0, R0, R2      ; 加上常数
    STR  R0, [R3], #4    ; 存储并自增
    CMP  R1, R4
    Bne  loop

实际的抉择:应该选哪个?

今天的新 CPU 设计几乎都选择 RISC 风格的指令集:

考虑因素结论
全新设计✅ 选 RISC(ARM、RISC-V)
向后兼容❌ 必须沿用 x86(CISC)
超低功耗✅ ARM Cortex-M 系列
最高性能都可以(现代 x86 内部也 RISC)
开源/自由✅ RISC-V
软件生态取决于已有软件

小结

RISC vs CISC 的争论持续了 40 年,但今天的结论是:两者正在趋同

哲学核心思想代表
CISC指令强大、代码紧凑x86(Intel/AMD)
RISC指令简洁、便于流水线ARM、RISC-V

现代 CPU 的共性:

  • 都使用流水线
  • 都使用分支预测
  • CISC 内部解码为 RISC 风格的微操作
  • 能效比主要取决于微架构,而非指令集

为什么这很重要? RISC vs CISC 不仅仅是一道学术争论——它深刻影响了计算机产业的发展方向。从手机里的 ARM 芯片到服务器里的 x86 芯片,从开源的 RISC-V 到苹果自研的 M 系列处理器,指令集的选择决定了生态系统的走向。

接下来,你将学习 CPU 如何应对外部事件——中断与异常:中断与异常