⚙️ 第一章 对程序员来说,CPU到底是什么
📄 一句话概括

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 秒实验

  1. 挑一段你写过的代码,大致数一数它要做多少次【搬、算、比、跳】。
  2. 用在线编译器把一段带循环的代码编译成汇编,看它到底出现了几种指令。

常见误区

  1. 把【CPU 很简单】理解成【编程很简单】。动作简单,排得好很难——这正是算法的价值。
  2. 觉得懂硬件没必要。同一个算法排成不同的动作顺序,速度能差几十倍。
自测三问(点开对答案) 1. CPU 能做的动作有哪几类? —— 搬运数据、运算、比较、跳转(再加输入输出)。 2. 为什么说程序的智能是【拼】出来的? —— CPU 只会简单动作,复杂行为全靠这些动作的组合与顺序。 3. 学这一章对写代码有什么实际用处? —— 看得懂反汇编、判断得出性能瓶颈、新东西能一路拆到底。

相关笔记