💻 第一章 计算机的三大原则
📄 一句话概括

程序不是神秘咒语,就是两张表:指令表写清一步步做什么,数据表备好原料,软件=程序+文档,本质没变。

📝 本节和前面几节的关系

上一节把硬件分成三件套,这一节立原则二:软件那边同样可以摊开成两张表,硬件软件从此对称起来。

一、指令和数据各是什么

指令是控制计算机的命令,比如【把 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 秒实验

  1. 把自己的一天写成指令表(起床、刷牙、…),体会【指令是有顺序的命令】。
  2. 改一改上面 Demo 的数据表,把英语改成 100,看输出怎么变——数据换了,指令没动。

常见误区

  1. 以为程序是【一段有魔法的话】——它就是清单,一条条执行,没有任何魔法。
  2. 把指令和数据混着想——搞混了就看不懂报错信息:语法错是指令表写坏,值不对是数据表出错。
自测三问(点开对答案) 1. 指令和数据的分工是什么? —— 指令是【做什么】的命令,数据是被加工的原料,程序就是两者的集合。 2. 软件和程序的区别? —— 程序=指令+数据本身;软件=程序+文档+服务等一整套交付物。 3. Debug 的两个基本问题是什么? —— 指令表哪条写错了?数据表哪个值不对?

相关笔记