i.e. Early Programming
前几集我们把重点放在计算机的原理,怎么从内存读写数据,执行操作,比如把两个数字加在一起,还简单讲了下指令的执行,也就是计算机程序。
但我们还没讲的是:程序如何"进入"计算机。你应该记得在第 7, 8 集,我们一步步讲了例子程序,当时为了简单,我们假设程序已经魔法般在内存里了,但事实是,程序需要加载进内存,这不是魔法,是计算机科学!
给机器编程这个需求,早在计算机出现之前就有了。
最著名的例子来自纺织业,如果你只想织一块红色大桌布,可以直接放红线进织布机,但如果想要图案怎么办?比如条纹或者方格。工人要每隔一会儿调整一次织布机,因为非常消耗劳动力,所以图案纺织品很贵。特定位置有没有穿孔,决定了线是高是低,横线是从上/从下穿过,为了让每行图案不同,纸卡连成长条,形成连续指令,听起来很熟?
![[assets/Pasted image 20230526124243.png|400]]
> 雅卡尔织布机
很多人认为雅卡尔织布机是最早的编程。
事实证明,穿孔纸卡便宜、可靠、也易懂。近一个世纪后,穿孔纸卡用于 1890 年美国人口普查,我们在第一集提过,一张卡存一个人的信息,比如种族、婚姻状况、子女数量、出生国家等等。针对每个问题,人口普查工作者会在对应位置打孔,当卡片插入汇总机,孔会让对应总和值+1 ,可以插入整个国家人口的卡片,在结束后得到各个总值。值得注意的是,早期汇总机不算计算机,因为它们只做一件事 - 汇总数据,操作是固定的,不能编程,穿孔纸卡存的是数据,不是程序。
![[assets/Pasted image 20230526124252.png|400]]
> 穿孔纸卡 & 汇总机
之后 60 年,这些机器被加强,可以做减、乘、除,甚至可以做一些小决定,决定何时执行某指令。为了正确执行不同计算,程序员需要某种控制面板,面板有很多小插孔,程序员可以插电线,让机器的不同部分互相传数据和信号,因此也叫 “插线板”。
![[assets/Pasted image 20230526124301.png|400]]
> 插线板
不幸的是,这意味着运行不同程序要重新接线,所以到 1920 年代,控制面板变成了可拔插,让编程更方便,可以给机器插入不同程序。比如,一个插线板算销售税,另一个算工资单,但给插线板编程很复杂,图中乱成一团的线负责算盈亏总额,用于 IBM 402 核算机。在 1940 年代这样做很流行,用插线板编程不只在机电计算机流行。世上第一台通用电子计算机,ENIAC,完成于 1946 年,用了一大堆插线板,程序在纸上设计好之后,给 ENIAC 连线,最多可能花三个星期。因为早期计算机非常昂贵,停机几个星期只为换程序完全无法接受。人们急需更快、更灵活的新方式来编程。
幸运的是,到 1940 年代晚期 1950 年代初,内存变得可行,价格下降,容量上升。与其把程序存在插线板,存在内存变得可行,这样程序易于修改、方便 CPU 快速读取,这类机器叫 “存储程序计算机”。如果内存足够,不仅可以存要运行的程序,还可以存程序需要的数据,包括程序运行时产生的新数据。
程序和数据都存在一个地方,叫 “冯诺依曼结构” ,命名自 约翰·冯·诺依曼 - 杰出的数学家和物理学家 ,参与了曼哈顿计划和早期电子计算机项目。他曾说:我在思考比炸弹重要得多的东西 - 计算机 。
冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元) + 数据寄存器 + 指令寄存器 + 指令地址寄存器 + 内存(负责存数据和指令) 。
希望这听起来很耳熟,因为第 7 集我们造了一个冯诺依曼计算机。
第一台冯诺依曼架构的"储存程序计算机",由曼彻斯特大学于 1948 年建造完成,绰号"宝宝",甚至你现在看视频的计算机,也在用一样的架构。虽然有内存很棒,但程序和数据依然需要某种方式输入计算机,所以用穿孔纸卡。
让我们进入思维泡泡
到 1980 年代,几乎所有的计算机都有穿孔纸卡读取器,可以吸入一张卡片,把卡片内容写进内存。如果放了一叠卡片,读取器会一个个写进内存,一旦程序和数据写入完毕,电脑会开始执行,即便简单程序也有几百条指令,要用一叠纸卡来存。如果不小心摔倒弄撒了,要花上几小时、几天、甚至几周来整理。
有个小技巧是在卡片侧面画对角线,如果弄散了,整理起来会方便很多。
用纸卡的最大型程序是美国空军的 SAGE 防空系统,于 1955 年完成。据称顶峰时期雇佣了世上 20% 程序员,主控制程序用了 62500 张穿孔纸卡,等同于大约 5MB 的数据,以如今的标准,不值一提。穿孔纸卡不仅可以往计算机放数据,还可以取出数据,程序运行到最后,结果可以输到纸卡上,方式嘛,当然是打孔,然后人可以分析结果,或者再次放进计算机,做进一步计算。
谢了 思维泡泡
穿孔纸卡的亲戚是纸带。基本是一回事,只不过更连续,不是一张张卡。当然我们还没提硬盘,只读光盘,DVD, U 盘等等,以后我们会讲这些更先进的存储方法。
![[assets/Pasted image 20230526124312.png|400]]
> 纸带
最后,除了插线板和穿孔纸卡,在 1980 年代前,还有一种常见编程方式,面板编程。与其插一堆线到插线板,可以用一大堆开关和按钮,做到一样的效果,面板上有指示灯,代表各种函数的状态和内存中的值。50 和 60 年代的计算机,一般都有这样巨大的控制台,很少有人只用开关来输入一整个程序,但技术上是可行的。早期针对计算机爱好者的家用计算机,大量使用了开关,因为大多数家庭用户负担不起昂贵的外围设备,比如穿孔纸卡读取器。
![[assets/Pasted image 20230526124323.png|400]]
> 面板编程
第一款取得商业成功的家用计算机是 Altair 8800 ,有两种版本可以买:1. 预先装好的整机 ;2. 需要组装的组件。计算机爱好者 喜欢买组件版,售价极低,在 1975 年卖 400 美元左右,相当于 2017 年的 2000 美元。为了给 8800 编程,你要拨动面板上的开关,输入二进制操作码,然后按 “存储键” 把值存入内存,然后会到下一个内存位置,你可以再次拨开关,写下一个指令,重复这样做,把整个程序都写入内存之后,可以推动开关,回到内存地址 0 ,然后按运行按钮,灯会闪烁,这就是 1975 年的家用计算机,哇。
![[assets/Pasted image 20230526124336.png|400]]
> Altair 8800
不管是插线板、开关或穿孔纸卡,早期编程都是专家活。不管是全职还是技术控,都要非常了解底层硬件,比如 操作码,寄存器等,才能写程序,所以编程很难,很烦。哪怕工程师和科学家都无法 完全发挥计算机的能力,我们需要一种更简单方式告诉计算机要做什么。
一种更简单的编程方式!
这带领我们到下一个话题 - 编程语言,我们下集会讲。
下周见。