📄 一句话概括
同一台机器,程序员只看三样:寄存器、内存、I/O 端口——引脚与电压全部隐去,这就是抽象的力量。
📝 本节和前面几节的关系
第二章把机器从电工视角连了一遍,这一节换程序员视角重看同一台机器——后面三节都站在这个视角上。
一、两种视角,同一台机器
电工视角:芯片、引脚、电压、时序、总线负载——关心【机器怎么动】; 程序员视角:寄存器(CPU 里的小格子)、内存(按地址存取的仓库)、I/O 端口(按端口号进出的门)——关心【指令让它怎么动】。 两套视角都对,只是要解决的问题不同。写程序时不需要知道引脚几号——第二章那一层已经被封装掉了。
二、抽象:程序员最大的靠山
寄存器只有十几个、内存按地址编号、端口按号寻址——三样东西的组合就能写出所有程序。 这就是抽象:把底层的复杂藏起来,只暴露少量可操作的接口。第二章的 40 根引脚,到这一章只剩下【往寄存器/内存/端口存取数】几个动作。 【⚠️ 2026 现状】今天写高级语言连这三样都看不见了——但它们在底下原封不动地工作着(第四章会讲高级语言与机器语言的关系)。
三、本章接下来怎么走
3.2 看清机器语言与汇编语言的关系 -> 3.3 认全 Z80 的寄存器 -> 3.4 追一段程序的执行 -> 3.5 亲手把汇编翻成机器码 -> 3.6 算算程序要跑多久。 一条完整的【从人话到机器】路线,走完第三章,你就理解了程序的最底层形态。
四、动手 Demo:两个视角的对照表
把电工视角和程序员视角并排摆出来,看抽象到底藏起了什么。
# 两种视角看同一台机器
hw = ["引脚电压", "时序", "总线负载"] # 电工关心
sw = ["寄存器", "内存", "I/O 端口"] # 程序员关心
print("电工:", hw)
print("程序员:", sw)
print("程序员不再看见的:", len(hw), "类底层细节")
实跑输出:
--------------------------------------------------------------------
程序员眼里的硬件只有三样东西
--------------------------------------------------------------------
第二章从电工视角看计算机:芯片、引脚、连线。
第三章换程序员视角——同一台机器,缩成三样可操作的东西:
程序员看到的 对应硬件 程序员的用法
-----------------------------------------------------------
寄存器 CPU 内部的小格子 存正在算的数与地址
内存 存储器 IC 按地址读写程序与数据
I/O 端口 I/O 接口 IC 按端口号输入输出
对照一下电工视角的同一台机器:
电工关心 程序员关心
------------------------------------------------------------
引脚电压、时序、总线负载 这条指令把哪个寄存器改成什么值
两种视角都对,只是问题不同。本章讲程序,一律用程序员视角:
【寄存器 + 内存 + 端口】三样,加上【指令】的写法。
抽象不是简化事实,是【选择不看】:引脚还在,只是写程序时不看它。 第十六章讲面向对象时,这套【藏在背后、只暴露接口】的思想会升格成正式的编程方法(3.1 这里先埋个种子)。
30 秒实验
- 打开任务管理器看内存占用——那是程序员视角里【内存】这一格的真实数字。
- 想一想:你在键盘上敲的每个字,走完第二章的全部线之后,在程序员视角里变成了什么?(提示:一个端口号加一个字节)
常见误区
- 以为两个视角有高低之分——只是用途不同,写程序看程序员视角,修硬件看电工视角。
- 以为抽象等于【不知道也没关系】——改写底层程序时,电工视角随时得能捡回来。
自测三问(点开对答案)
1. 程序员视角的三样东西是什么? —— 寄存器、内存、I/O 端口——加上指令的写法。 2. 抽象的本质是什么? —— 选择不看:底层细节仍然存在,只是写程序时不需要关心。 3. 为什么说第二章和第三章是同一台机器的两个视角? —— 第二章连的是引脚与总线(电工视角),第三章写的是指令与寄存器(程序员视角)。- ☐ 下一节(3.2 机器语言和汇编语言)
相关笔记
- 输入测试程序并进行调试 — 上一章亲手装填的那 5 个字节
- ⌨️ 编程原理 · 索引 — 抽象与分层在那边有系统讲解
- 💻 计算机是怎样跑起来的 · 索引