写在前面
:我已经把这篇文章转成了视频,习惯看视频的朋友欢迎关注视频号"
码农翻身Pro
":
这是世界上第一台商业上成功的个人计算机:ALTAIR 8800。
它没有显示器,没有键盘,怎么写程序?
很简单,拨动开关来写程序!
如果仔细观察一下上面的图,就能发现面板上写着:Data,Adress,Stop,Run,Deposit,CLR,D0 ~ D7, A0~A15等字样。
如果想计算“1+1”,在这个机器上可以这么干。
1.设计汇编代码
;把该地址的数字装入累加器
LDA 000020
;将数字1和累加器的数相加
ADI 001
;将累加器的数保存到特定地址
STA 000022
2. 把汇编转化成机器指令(用8进制,方便输入)
072 020 000 306 001 062 022 000
3.拨动开关,输入指令
例如072,对应的开关是这样的:
就这么一点点地拨动开关进行输入,可不能出错,一旦出错就前功尽弃。
4.查看结果
输入完成,扳动“运行”开关,然后看看控制面板上的小灯,就知道运行接过是否正确了。
看过《编码》这本书的同学可能更有感觉,这种办法和书中说的是类似的。
过程看起来非常繁琐,但是却体现了计算机最最本质的:
存储程序
。
程序也是数据,通过拨动开关的方式被输入到计算机内存中,然后逐条开始执行。
拨动开关的编程方式
直接操作机器码,容不得一丝一毫的错误,拨动开关的每一次操作必须精确无误
。
任何一次把0拨成了1,或者把1拨成了0,就前功尽弃。
所以极少有程序员这么干,有个更好的替代办法:纸带。
程序怎么才能进入纸带呢?有专门的设备。
例如著名的
ASR-33电传打字机(Teletype)
,当时售价高达1000美元(相当于现在的10000美元)。
它有一个键盘,左边长长的就是纸带。
现在,程序员就可以先在纸上汇编程序写好:
3E 64
C6 C8
76
先在脑子中“调试”一下,没问题的话再通过ASR-33的键盘输入。
ASR-33就可以转化成二进制,然后输出到纸带上。
同理,ASR-33还可以反向把纸带中的内容读出来,输入计算机执行。
过程很繁琐,但是已经比拨动开关好太多了。
1975年,比尔·盖兹和保罗·艾伦为了抢到ALTAIR 8800的生意,通过这种方式,没日没夜地干了八周时间,为ALTAIR 8800写出了第一个Basic解释器,从此开始了微软的称霸之路。
下图就是存储Basic解释器的纸带
肯·汤普逊和丹尼斯·里奇也是用ASR-33 Teletype来开发Unix的,所以Unix的Terminal 就叫做tty。
纸带便宜,紧凑,但是非常脆弱,容易损坏。
如果纸带散落到地上,代码立刻就变成了一大堆意大利面条,真正的意大利面条,不管它是卷起来的还是折起来的,非常容易被撕破。
更烦人的是
纸带难以编辑
,如果程序错了,需要定位到错误位置——这不是一件轻松的事情,毕竟纸带上一行行全是孔——然后剪断现有纸带,拼接新的部分。
换句话说,
纸带像是一个脆弱的“顺序存取”的媒介
。
很快,大家就更喜欢IBM发明的打孔卡了。
“写”在打孔卡上的程序,即使是出了错,也可以轻松地替换掉出错的那一张或者几张。
将有错误的卡片和一张空白卡片放在打卡机中,DUP 到错误处,打出正确的部分,DUP 剩余的,放回去就行了。
所以
打孔卡具备一些容易修改的“随机存取”的性质
。
下面这幅图一共有62500张打孔卡(大小为 5 MB),保存着美国SAGE 军事计算机网络的控制程序。
如果打孔卡掉到地上乱了怎么办?
打孔卡上有序号,只需要把它们捡起来,放在同一个方向(将切掉的一角对齐),放进一个专门的机器(Punched card sorter)排序就行了。
在打孔卡以后,大家又用了磁鼓存储器,磁带,最后才发展到硬盘,现在主要是固态存储了。
编程语言也从机器语言,汇编语言,发展到Fortran、C、 C++、Python、Java、JavaScript等高级语言。
一路走来,程序员现在终于可以坐在电脑前,打开自己喜欢的IDE/编辑器,舒服地编程了。
现在的程序员是幸福的,可以站在一个很高的抽象层次上进行编程创作。
现在的程序员也是不幸的,很多人丧失了了解计算机最底层原理的兴趣。