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 代码后发现:
- 80% 的指令用了 20% 的指令类型——复杂指令很少被用到
- 编译器倾向于使用简单指令——复杂指令没有被充分利用
- 复杂指令导致流水线设计困难——指令长度不统一、执行时间不固定
于是他们提出了 RISC 理念:去掉不常用的复杂指令,让剩下的简单指令执行得更快。
RISC 与 CISC 的核心区别
| 特征 | RISC | CISC |
|---|---|---|
| 指令数量 | 少(50-100 条) | 多(300-1000+ 条) |
| 指令长度 | 固定(32 位) | 可变(1-15 字节) |
| 寻址方式 | 少(1-3 种) | 多(10-30 种) |
| 操作对象 | 寄存器到寄存器 | 寄存器/内存混合 |
| 内存访问 | 只有 LOAD/STORE | 算术指令可直接操作内存 |
| CPI(每指令周期数) | 通常 1 | 1 ~ 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 KB | 1.5× |
| 大型应用 | ~2 MB | ~3 MB | 1.5× |
💡 这是为什么早期计算机采用 CISC——内存太贵了!但在今天内存已经非常便宜,代码密度不再是主要考量。
执行速度
| 年代 | RISC 相比 CISC 的优势 | 原因 |
|---|---|---|
| 1990s | RISC 快 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 架构代表
| 架构 | 设计者 | 典型应用 | 特点 |
|---|---|---|---|
| ARM | ARM Holdings | 手机、嵌入式(90%+ 移动设备) | 低功耗、高能效 |
| RISC-V | UC Berkeley(开源) | 新兴,IoT,AI | 完全开源、可扩展 |
| MIPS | MIPS Technologies | 路由器、嵌入式 | 经典教学架构 |
| PowerPC | IBM | 服务器、游戏主机(PS3) | 高频率 |
| SPARC | Sun/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 如何应对外部事件——中断与异常:中断与异常。