📄 一句话概括
CPU 会的动作只有几类——搬数据、运算、比较、跳转;程序看着聪明,只是因为这些动作排得好。
📝 本节和前面几节的关系
本章最后一块拼图。前面六节把 CPU 的零件和动作讲完了,这一节把它们收成一句话。
一、CPU 的全部本领
先给结论:CPU 能做的事少得惊人。 数据上,它只认二进制(第二章展开)。 动作上,只有四类:搬运数据、做运算、比较大小、跳转。 你在语言里写的循环、函数、对象、框架,最后全都被翻译成这四类的排列组合。
二、拆一个【聪明】的程序
求 5 个数的最大值,看起来有判断、有循环,是段【有脑子】的代码。 拆开数一数:29 个动作,只有 4 种类型——搬 16 次、比 4 次、跳 5 次、条件跳 4 次。 排序、搜索、推荐算法也一样,只是动作排得更长、更巧。 所以有句话说:算法不是让 CPU 变聪明,是让动作排得更划算。
三、承认它简单,能带来三件事
看得懂反汇编:不再被语法吓住——无非是那几种指令在来回搬。 想得清性能:慢在哪?动作太多、跳得太频、还是在等数据。 学得动新东西:任何新框架拆到底还是这四类动作——这不是自我安慰,是硬件事实。
四、这一章到此为止
回头看第一章走过的路:CPU 的四块部件 → 寄存器是台面 → PC 决定流程 → 分支与循环只是改 PC → 函数调用靠栈 → 数组靠基址变址。 把这几条串起来,就是【一台机器怎么跑一段程序】的完整答案。 但这一章一直在说【二进制】,却一次也没展开。 下一章就回答那个更基础的问题:CPU 为什么只认二进制,二进制到底是什么。
五、动手 Demo:再复杂的程序,也只是这几种动作
CPU 只会几件事:搬数据、做运算、比大小、跳转。 把一段看起来挺聪明的代码拆开,数一数它到底用了哪些动作。
acts = {"mov 搬数据": 16, "cmp 比大小": 4,
"jmp 跳转": 5, "jcc 条件跳转": 4}
for k, v in acts.items():
print("%-12s 用了 %2d 次" % (k, v))
print("合计 %d 个动作,只有 %d 种类型" % (sum(acts.values()), len(acts)))
实跑输出:
--------------------------------------------------------------------
再复杂的程序,也只是这几种动作
--------------------------------------------------------------------
**CPU 只会几件事:搬数据、做运算、比大小、跳转。**
把一段【看起来挺聪明】的代码拆开,数一数它到底用了哪些动作。
待拆的代码:求 5 个数里的最大值
m = a[0]
for i in 1..4:
if a[i] > m:
m = a[i]
动作类型 在这段代码里出现的地方 次数
----------------------------------------------------------------
搬数据 mov 读 a[i]、把 a[i] 写进 m、i 加一后写回 16
比大小 cmp 每轮比较 a[i] 与 m 4
跳转 jmp 循环回边跳 4 次、退出跳 1 次 5
条件跳转 jcc a[i] > m 成立时才赋值,共 4 次 4
一共 29 个动作,只有四种类型。
连【找最大值】这种带判断的活,拆到底也是**搬、比、跳**三件事的组合。
这就是教材那句总结的意思:
**CPU 的处理其实很简单——复杂的是【用简单动作拼出来的顺序】。**
程序员的功夫,多半就下在这个【拼】字上。
连【找最大值】这种带判断的活,拆到底也是搬、比、跳三件事的组合。 CPU 的处理其实很简单——复杂的是【用简单动作拼出来的顺序】。
30 秒实验
- 挑一段你写过的代码,大致数一数它要做多少次【搬、算、比、跳】。
- 用在线编译器把一段带循环的代码编译成汇编,看它到底出现了几种指令。
常见误区
- 把【CPU 很简单】理解成【编程很简单】。动作简单,排得好很难——这正是算法的价值。
- 觉得懂硬件没必要。同一个算法排成不同的动作顺序,速度能差几十倍。
自测三问(点开对答案)
1. CPU 能做的动作有哪几类? —— 搬运数据、运算、比较、跳转(再加输入输出)。 2. 为什么说程序的智能是【拼】出来的? —— CPU 只会简单动作,复杂行为全靠这些动作的组合与顺序。 3. 学这一章对写代码有什么实际用处? —— 看得懂反汇编、判断得出性能瓶颈、新东西能一路拆到底。- ☐ 下一章(第二章 用二进制来理解数据)
相关笔记
- 看一看CPU的内部构造 — 四块部件
- 条件分支和循环的原理 — 跳转那件事的展开
- 软件是指令和数据的集合 — 姊妹篇:程序摊开就是两张表
- ⌨️ 编程原理 · 索引 — 编程全貌课,讲这些动作怎么被组织起来
- ⚙️ 程序是怎样跑起来的 · 索引