本篇要回答的问题:从一堆没人看得懂的 0101,到能反复修改迭代的程序,中间发生了什么?"程序员"这个职业是怎么诞生的?
上一讲解剖了地基冯·诺依曼体系。本讲沿大厦往上爬第一步——聊编程语言的起点。程序是计算机的灵魂;指令序列的可能性无穷,程序的可能性就无穷。那么软件工程师最初是怎么写程序的?
编程的史前时代
第一门面向程序员的语言出现前,人们只能理解 CPU 指令的二进制表示,把程序以二进制数据刻录到存储(ROM 或硬盘)上。
| 史前时代的特征 | 后果 |
|---|---|
| 想法要先翻译成比特、再刻录 | 表达极其困难,修改迭代更难 |
| 软硬件边界模糊 | 写程序还涉及硬件电气操作 |
| 还不存在"程序员"这个职业 | 写程序不是纯软件行为 |
为解决编程效率,汇编语言(+ 编译器)诞生:编译器把汇编程序翻译成 CPU 指令序列,保存到外置存储。一条汇编指令基本与一条 CPU 指令一一对应。
与机器对话
汇编的出现是分水岭——它让编程成为纯软件行为,"程序员"这个分工的标志由此诞生。汇编做的核心优化,全是用**文本符号(symbol)**替代物理细节:
| 用符号表达 | 替代了什么 | 解放了什么 |
|---|---|---|
指令助记符(如 add) |
CPU 指令的二进制 | 不用背 0101 |
| 变量名(variable) | 内存物理地址 | 不用关注数据放在哪 |
| 函数名(function) | 函数地址(CPU 里函数只有地址没有名字) | 复用机器指令的扩展 |
| 标签(label) | 跳转目标地址(jmp/je/jne) |
专注逻辑而非跳转地址 |
本质:汇编在指令能力上和机器指令并无二致,它只是把人从物理硬件地址中解脱出来,专注于程序逻辑的表达。但这一步解放的生产力是惊人的——毕竟没人愿意用 0101 表达思想。
可自我迭代的计算机
本专栏目的不是还原真实历史,而是从架构设计角度想:若信息科技一切尚不存在,怎样从工程上高效完成从 0 到 1 的构建?
最早的输入输出不是键盘+显示器,而是打孔卡 + 打印机:
设想第一台键盘+显示器的现代计算机出现后,一个最小功能集的 ROM 启动程序该刻上什么?本质是要实现一个最小化的、计算能力可自我迭代的计算机:
| 没有操作系统时 BIOS 应包含 | 作用 |
|---|---|
| 键盘、显示器驱动 | 基础交互 |
| 外置存储设备驱动 | 读写程序 |
| 汇编编辑器 | 读取/修改/保存汇编代码 |
| 汇编编译器 | 把汇编编译成机器代码 |
| 执行外置存储中机器代码的能力 | 运行程序 |
汇编语言的出现早于操作系统——操作系统的核心目标是软件治理,只有在需要管理很多任务时才需要它。
关键洞见:有了这个 BIOS,计算机就发展起存储能力——程序源代码可以迭代演进了。
计算机存储能力的重要性,如同人类发明了纸:纸让知识被存储、一代代传递并不断发扬光大;有了存储能力的计算机,软件程序也得以不断传承、演进。
总结
本讲回到编程的史前时代,回溯了编程语言诞生的历史。为了不再用 0101 表达思想,人们创造了汇编——这一步让编程成为纯软件行为,“程序员"由此诞生;再设计出 MVP 版"可自我迭代的计算机”,软件得以不断演进。
先把"是什么"回答清楚
| 概念 | 一句话说明 |
|---|---|
| 汇编语言 | 用文本符号替代物理地址,与机器指令一一对应 |
| symbol | 指令助记符 / 变量名 / 函数名 / 标签 |
| BIOS | 没有操作系统时的最小启动程序 |
| 可自我迭代的计算机 | 具备存储与编辑编译能力,源代码可迭代演进 |
一句话速记
汇编的能力等同机器码,价值在于把人从物理地址解放出来;而"可迭代的存储"之于软件,如同纸之于人类知识。
架构上的思考题
假设要实现一个最小化、计算能力可自我迭代的计算机,它的变化点和稳定点分别是什么?为此你会设计出哪些子系统,每个子系统的规格是什么?扩展性上有哪些考虑?

