📄 一句话概括
程序不是神秘咒语,就是两张表:指令表写清一步步做什么,数据表备好原料,软件=程序+文档,本质没变。
📝 本节和前面几节的关系
上一节把硬件分成三件套,这一节立原则二:软件那边同样可以摊开成两张表,硬件软件从此对称起来。
一、指令和数据各是什么
指令是控制计算机的命令,比如【把 A 和 B 相加】【把 A 的值显示出来】;数据是被指令加工的对象,比如成绩 90、单价 3.5。 两者角色完全不同:指令是动作,数据是原料。写程序就是开两张清单——先想清楚做什么(指令),再想清楚用什么(数据)。
二、一个最小程序的解剖
拿【求三科平均分】开刀:指令共 8 条——三次 IN 读入成绩、两次 ADD 累加、一次 DIV 除以科目数、一次 OUT 输出、一条 END 收工;数据 4 处——累加结果和几处成绩、一个常数 3。 别嫌它小:几千万行的大型软件,本质还是这两张表的加长版,只是多了条件跳转和循环(第四章讲)。
三、软件与程序的区别
教材顺手分清两个词:程序是指令和数据的集合本身;软件更像一个商品概念——程序加上文档、说明、维护服务一起交付,才叫软件。 日常说话两者混用没毛病,但知道区别,后面第十二章谈 SE 工作时就不乱了。
四、动手 Demo:给「求平均分」开两张清单
把上面那个 8 条指令的小程序原样摊开打印,亲眼看看【程序=指令+数据】这个说法有多实在。
# 程序 = 指令表 + 数据表
instrs = ["IN 数学", "IN 语文", "IN 英语", "ADD 累加",
"DIV 除以 3", "OUT 显示", "END 结束"]
data = {"数学": 90, "语文": 85, "英语": 77, "科目数": 3}
print("指令表:")
for i, ins in enumerate(instrs, 1):
print(" %d. %s" % (i, ins))
print("数据表:", data)
avg = (data["数学"] + data["语文"] + data["英语"]) / data["科目数"]
print("照着指令表执行 -> 平均分 =", avg)
实跑输出:
--------------------------------------------------------------------
把程序摊开看——指令表和数据表
--------------------------------------------------------------------
原则 2:程序是指令和数据的集合。
把「求平均分」程序摊开,其实就是两张表:
[指令表] 告诉计算机「做什么」,按顺序一条条执行:
# 指令 操作数(指向数据)
---------------------------------
---------------------------------
1 IN 取得数学成绩 -> A
2 IN 取得语文成绩 -> B
3 IN 取得英语成绩 -> C
4 ADD A + B -> A
5 ADD A + C -> A
6 DIV A / 3 -> A
7 OUT 把 A 显示出来
8 END 程序结束
[数据表] 指令要加工的「原料」:
地址 内容 含义
---------------------------------------
---------------------------------------
A 待写入 累计结果(初值 0)
B 待写入 语文成绩
C 待写入 英语成绩
常数 3 3 科目数(除数)
对照结论:指令 8 条 + 数据 4 处 = 一个完整的小程序。
写程序=把这两张表填对;程序出 Bug=其中一张表填错了。
同一个 data(数据表),配上不同 instrs(指令表)就能算总分、最高分——这就是【改程序】的真实含义。 Debug 时问自己的两个问题:指令表哪条写错了?数据表哪个值不对?九成的错都跑不出这两句。
30 秒实验
- 把自己的一天写成指令表(起床、刷牙、…),体会【指令是有顺序的命令】。
- 改一改上面 Demo 的数据表,把英语改成 100,看输出怎么变——数据换了,指令没动。
常见误区
- 以为程序是【一段有魔法的话】——它就是清单,一条条执行,没有任何魔法。
- 把指令和数据混着想——搞混了就看不懂报错信息:语法错是指令表写坏,值不对是数据表出错。
自测三问(点开对答案)
1. 指令和数据的分工是什么? —— 指令是【做什么】的命令,数据是被加工的原料,程序就是两者的集合。 2. 软件和程序的区别? —— 程序=指令+数据本身;软件=程序+文档+服务等一整套交付物。 3. Debug 的两个基本问题是什么? —— 指令表哪条写错了?数据表哪个值不对?- ☐ 下一节(1.4 对计算机来说什么都是数字)
相关笔记
- ⌨️ 编程原理 · 索引 — 程序怎么从源码到运行,那一课有全流程
- ☕ Java基础 · 索引 — 写程序就是把两张表填对的第一手实践
- 💻 计算机是怎样跑起来的 · 索引