头图

本系列文章可以算是一个计算机科学入门的课程以及编程学习入门的课程,面向的目标群体主要是计算机专业的大学生想要对自身专业课之外的补充,以及那些想要了解计算机科学与编程知识的非计算机专业的大学生或已经步入社会的人士。

你可能好奇计算机领域广为人知的 0 和 1 是什么?如何操作它们?别着急,我们这个系列会从最原始的计算设备算盘开始讲起,然后谈到巴贝奇的差分机、莱布尼茨的步进计算机与分析机、赫尔曼·何乐礼的打孔卡片制表机,第二篇文章可能会到更现代一点的哈佛马克一号、真空管计算机,以及现代正在使用的晶体管计算机、集成电路式计算机等。

而组成计算机的必要元素,如内存、寄存器、CPU、指令与程序、编译器、算法与数据结构、操作系统相关的内容,以及建筑在计算机之上的计算机网络、软件工程、互联网,再到现在热度达到顶峰的人工智能,我们也会在这个系列中逐步提到,并深入理解每个部分在计算机中发挥的作用。

你还可能好奇计算之父是谁?计算机之父是谁?计算机科学之父是谁?第一位程序员是谁?贯穿整个计算机发展生涯的是各种驱动因素、人、数学与机器的结合,通过这个系列,你将会看到人类是如何运用想象,结合知识来进行伟大创作的。

繁荣的现在

在谈早期历史之前,我们可以先聊一聊现在。手机的发展已然到达顶峰,移动互联网也进入了尾声,与此同时,人工智能、机器人、虚拟现实、增强现实、物联网等技术正欣欣向荣,曾经科幻电影里的一些场景开始变为现实,我们正在全面进入一个计算机增强人类能力、活动场景、环境能力的时代。而更远的未来,可能会迎来真正的 “奇点”,以计算机为大脑的机器人具备人类般的智慧和思考能力,终将替代人去探索无垠的宇宙,最终移居其他星球?

实际上目前能够看到、听到、感觉到的各种高科技技术,其实都是通过层层抽象而来,就像人体可能是由很多个器官组成,器官可能又是由很多细胞组成。你能想象在目前简单好用的手机里,你每时每刻正在执行的操作,如点击发表朋友圈等,其实都是一串 01 在不停的执行各种操作吗?

而实际上过渡到计算机底层执行的 0 1 操作也花了相当长的一段时间,接下来我们就来探究一下这段过渡的历史。

一切因需求而生

在社会早期,人类的生活贫瘠,吃的、穿的一只手都数得过来,那个时候没有什么关于 “复杂计算” 的需求。而随着时间的推进,人类渐渐掌握了造工具的能力,生活也开始稳定下来,不再过渡频繁的进行迁徙,而是固定在某一处长时间的生活,而固定在一处,周围肯定缺少可持续捕猎的食物,所以自然有了圈养动物的想法,而随着圈养动物数量的增多,各类开始频繁被各种问题所困扰,比如我一年需要养多少头牛才能维持生活了?等诸如此类的问题。

贫穷的人家当然就只有几头牛,一只手都能数得过来,而只要有人类的聚集,就会形成小小社会,而社会必然面临着不均等、差异化,其中尤为显著的就是贫富差异化,富人人家可能有上百头、上千头牛,随着数量的增长,人类的心算与记忆能力逐渐跟不上了。

这个时候,因第一次计算与存储能力的欠缺,催生了第一代计算设备 -- 算盘,维基百科记载,算盘可能起源于公元前2400年的巴比伦。

算盘的文字理解

最简单的键盘大致形式如下:

  • 有很多格,每格有很多珠子,如果每个珠子代表计数 1,那么一格我们设定有 10 个珠子,那一格就可以计数 1-10
  • 每往上一格,数字翻 10 倍,也就是第二格的珠子每移动一个,计数就加 10,第三个的珠子每移动一个,计数就加 100

算盘的图示理解

用图示的方式来理解如下。

当第 1 格有 2 个珠子移动时:

当第 1 格有 2 个珠子移动时:

当第 2 格有一个珠子移动时:

当第 1、2 格都有珠子移动时:

当第 1、2、7 格都有珠子移动时:

可以看到算盘提供了一组运算法则,每增加一格,里面的珠子可以容纳之前一格左右的技术容量(我们图示中因限制一格只画了 5 个),而每格里面珠子的移动状态在计算时会被存储下来,方便人直观的了解目前算到了哪里。

算盘的出现增强了人的计算能力和存储能力,也被称之为 “手动” 计算机,上述简单的键盘可以计算 5555555 这样大的数字,在当时社会几乎可以统计任何物体的数量,也因此作为计算工具沿用了很多年。算盘可以算是现代计算机的雏形,计算的过程与进位的过程是计算机中算数与逻辑单元负责的事情,而存储计算的状态又和内存、存储器、硬盘等有一定的渊源。

自算盘之后,人类为了解决各行各业的问题,又逐渐发明了许多其他的计算设备,这些设备大多数为了解决特定领域的问题而出现,如星盘,用于在航海中指引方向;计算尺则用来更快的进行乘除法;时钟则专注于计算与校准时间等。这些设备让原先很费力的事情变得更快、更简单、门槛更低,增强了人类在各行各业的能力

历史需要不断的铺垫

在历史的早期,无论是算盘,还是星盘、计算尺,亦或是时钟,这些设备都没有被称为 “计算机”。

其实最早使用 “计算机” 一词的文献是来自 1613 年的一本书,作者为理查德·布雷思韦特 。在书中描述说:“我听过的计算者里最厉害的,能把好几天的工作量大大缩短”,在当时计算机并不是指机器,而是指一种职业,“Computer” 则是指负责计算的人,虽然 “Computer” 有时会用机器帮忙,但大多数时间都是靠自己手算,这个职业一直到 1880 年代还存在。

随着工业革命的发展,机器开始取代人力,大规模的工厂化生产开始取代个体工厂手工生产,“机械” 也开始在人们的心中生根发芽,而 “Computer” 这个词也逐渐开始与 “机械” 产生联系。

通才莱布尼茨

传统的算盘计算速度慢、能够计算的内容较为简单,且在当时社会所需要计算的内容超过了算盘可以承载的地步,所以社会急需一个计算能力更加强大,可以计算范围更为广大的数字,社会的需求加之天才的思考,机械计算机应运而生。一个标志性的例子是 1694 年,德国著名数学家、博学家:戈特弗里德 · 莱布尼茨建造的 “步进计算机”,一下子为 “Computer” 、“计算机” 这些词打上了浓厚的机械色彩。

上图为保存在德意志博物馆的步进计算器复制品。 -- 出自维基百科

莱布尼茨,这一 17 世纪的伟大通才,认为 “让一些杰出人才像奴隶般地把时间浪费在计算工作上,是不值得的”,于是一台能够自动执行四则运算的机器 -- 步进计算机就被发明出来了。

上图参考 CSDN https://blog.csdn.net/ssdlear... 博主的标记。如有侵权,可联系删除。

如图可见,步进计算机上半部分是示数,下半部分是置数。上半部分有 16 个位置,表示步进计算机可以表示 16 位数的大小,下半部分里面 8 个置数按钮,每个置数按钮为 0-9,代表数字 0-9,8 位置数按钮每次可以最多设置一个 8 位数与另外一个 8 位数进行四则运算操作;而移位手柄则是用于进行更大范围的加法操作,以及再计算乘法时,将其分解为加法时进行操作;计算手柄则是用来进行实际的运算;控制/显示圈数的大圆盘则是设置一个基准,可以设置 0-9,如我这次需要计算的运算只需要转动计算手柄 8 圈,则可以在 8 哪里插入一个钉子,避免计算时摇了过多的圈数。

实际上步进计算机类似于汽车的里程表,会不断的自动累加里程数,在达到一个位数的临界值就会自动进位,我们来看一下具体使用步进计算机进行加法和乘法的例子,而减法和除法则反之。

基于文字阐述四则运算

首先来看一下加法,我们要算 8 + 8,那么对应到步进计算机则会分解为如下步骤:

  1. 首先设置被加数,在置数按钮里面将最末尾的按钮旋转到 8
  2. 顺时针旋转一圈计算手柄,这个时候步进计算机上半部分的示数列表就会显示当前数字为 8
  3. 接着再设置置数按钮,旋转到 8,设置加数
  4. 然后再顺时针旋转一圈计算手柄,这个时候示数列表就会显示计算结果 16

如果我们要计算乘法,首先先来个简单的,如 8 * 8,那么对应到步进计算机则会分解为如下步骤:

  1. 首先设置被乘数,旋转置数按钮为 8
  2. 顺时针旋转一圈计算手柄,示数列表显示 8
  3. 这个时候,针对乘数是个位数时,只需要继续旋转计算手柄即可,如果是 8 * 2,那么再旋转 1 圈,也就是一共旋转 2 圈,示数列表就会显示 16
  4. 对应到我们这里,也就是在旋转了 1 圈的基础上,再继续旋转 7 圈,就达到了 8 * 8
  5. 示数列表显示 64,在最右侧的两个示数柱分别显示 6 和 4

如果更加复杂一点,计算 80 * 8 时,对应到步进计算机则会分解为如下步骤:

  1. 首先设置被乘数,旋转置数按钮为 8
  2. 顺时针旋转一圈计算手柄,示数列表显示 8
  3. 接下来要设置乘数,因为 80 不是个位数,不可能旋转计算手柄 80 次,所以这里就轮到移位手柄登场了;我们需要移位手柄旋转一次,将机器的输入部分左移一个数位的位置,输入位置的个数位对着计数部分的十位的位置,然后旋转 8 圈,即 8 先前近一位:80
  4. 示数列表显示 640,在最右侧的三个示数柱分别显示 6、4、0

基于图形阐述四则运算

很多人可能看文字就绕晕了,接下来我们依然尝试用画图的方式表达上述的算数机制。

下面是我们的步进计算机,我们通过一组类似汽车里程表的滑动表格来表格各个置数、示数部分的内容。

image.png

加法

首先我们计算 8 + 8 的加法。

第一步:置数旋钮置为 8,设置被加数:

image.png

第二步:旋动计算手柄,设置被加数到示数器:

image.png

第三步:旋动置数旋钮,设置加数为 8:

image.png

第四步:旋动计算手柄,将两数相加:

image.png

简单乘法

接下来我们来计算 8 * 8。

第一步:置数旋钮置为 8,设置被乘数:

image.png

第二步:旋动计算手柄,将被乘数设置到示数器:

image.png

第三步:再次旋动计算手柄,表示 8 * 2:

image.png

第四步:一共旋动计算手柄 8 次,表示 8 * 8:

image.png

复杂乘法

接下来我们来计算 80 * 8。

第一步:置数旋钮置为 8,设置被乘数:

实际上任何复杂的乘法如 80 80 也可以写成 800 8 这种形式,第一个数字可以尽可能简单。

image.png

第二步:旋动计算手柄,将被乘数设置到示数器:

image.png

第三步:旋动移位手柄,向左移动一位:

image.png

第四步:再次旋动计算手柄,相当于 2,进位一位 20,然后与 8 相乘:20 * 8

image.png

第五步:继续旋动计算手柄直至 8 次,完成 80 * 8

image.png

可以看到随着计算的发展,如果我们需要计算越复杂的数,那么用于计数的设备也就越复杂,就越显得人类发明的伟大与奇妙,步进计算机是最为著名的第一个可以自动计算四则运算的机械计算机,可以计算 16 位数字,可以完成当时几乎任何形式的计数,且只要给定式子,就可以自动计算结果,这台机器非常成功,以至于沿用了三个世纪,影响了几代数学家和未来的 “计算机科学家”。

是人成就了时代

社会在持续进步,在步进计算机满足了基础的计算之后,随之而来的是很多新的问题。首先是步进计算机是纯手工制作,仪器复杂,导致制作成本居高不下,这阻碍了步进计算机进入民间,走进千家万户;其次是在运输、工业领域,需要对机器进行比较精确的校准,这通常需要大量的计算与快速的计算,而步进计算机虽然能够处理四则运算,但是针对复杂运算,特别是多项式等,则通常需要拆解为很多步,甚至要算上好几个小时甚至几天,这种依靠机械运作的计算机已经很难满足当时社会的生产与经济需求。

计算表

上图为坦克世界火炮射程表,参考自 http://wot.17173.com/content/...,侵权删。

比如在战场上,军队要根据多重因素:风速、湿度、温度、大气压等来综合计算炮弹如何射出,而军队对计算速度和准确性尤其注重,这个时候步进计算机就很难派上用场了,在当时社会,一种新型的计算使用方式走到台前:“计算表”,这不是一种新型的计算机,而是由人手工算出来的大量数据,类似我们的 9*9 乘法表,如某 A 型号的炮弹在各种因素取各种值的情况下,炮弹的射出参数表,这样军队在某个特定地点,统计到对应的依赖因素之后,带入炮弹计算表,花个一分钟左右就可以查出参数,并实际投入使用。

但是这种计算表大量依赖特定的设备,换一种设备需要再次计算一张表,及其耗费人力且不可扩展,人们在寻找通用、且自动、快速进行计算的道路上越发渴望。

计算之父 - 巴贝奇

上图为 1860 年的巴贝奇。

这个时候,一些注定与众不同的人开始崭露头角。1828年到1839年,在剑桥大学担任卢卡斯教授的巴贝奇颇有一番想法,巴贝奇在数学、经济与政治领域都有一定的成就,而让他名垂青史,被我们后世所不断歌颂的确实他在计算机领域的贡献。

对于每次换一种设备就需要重新计算一张表这种重复劳动,虽然繁琐耗时耗力,但是当时的社会与政府也没有什么好的办法,只能日复一日的这样去处理。而巴贝奇认识到这一点存在严重的问题,在 1822 年,巴贝奇在他的论文:“机械在天文与计算表中的应用”,向英国皇家学会指出了这个问题。

巴贝奇认为:“随着知识的增长和新工具的诞生,人工劳力会越来越少,而让高技能的人去处理一些易出错且重体力的活是一种资源的浪费”。基于这样的观点,巴贝奇构想出了一种计算机 -- 差分机,主要的利用 N 次多项式求值会有共通的 N 次阶差的特性,以齿轮运转,带动十进制的数值相加减、进位。差分机可以近似多项式,而多项式又能近似对数和三角函数,这些函数用手算相当麻烦,用普通的机器如步进计算机又几乎不可能做到 。

注意:这里我们不会去探究更加数学化的解释,如 N 次多项式求值会有共同的 N 次阶差是什么?如果感兴趣的同学可以自行查阅相关资料或者点击这个链接了解。

差分机是第一代机械计算机,目的是想利用 “机器” 将计算到印刷的过程全部自动化,全面去除人为疏失。差分机因设想宏大,预计完工需要 25000 个零件,重达 4 吨,最高可存 16 位数(类似于现在千MB量级),即使是在英国政府的资助下,巴贝奇也只完成了 1/7 的内容。因耗费巨大,且短时间内看不到任何收益,英国政府最终放弃了对巴贝奇的资助,但是差分机运转的精密程度令当时的人们叹为观止,至今是人类踏进科技的一个重大起步。

下图为差分机一号的 1/7 完成品。

值得一提的是,1991 年,历史学家根据巴贝奇的草稿做了一个差分机,竟然还能运行起来,不得不说巴贝奇在当时社会条件下竟能有这样天才般的构想。

虽然政府停在资助巴贝奇继续建造差分机,但是巴贝奇却没有停止自己的脚步,继续进行制作,并且在思考的过程中又提出了一种新的、且更为复杂的机器形式 -- 分析机,这是第一台构想出来的通用计算机,包含内存和打印机,能够在给定数据、运算的条件下,按顺序执行一系列操作。

上图为实验性的部分分析机。

分析机不止能进行特定的运算,而是能够执行通用的计算机程序,如 “条件”、“循环” 等语句,是一台真正的自动、通用计算机,这种计算机能够自动完成一系列操作的构想,是一个跨时代的概念,预示着计算机程序的诞生。

虽然巴贝奇一生成就不断,但在差分机、分析机的实现上却未能如愿,1871 年,巴贝奇在怨恨与失望中去世,甚至《泰晤士报》在讣告中还嘲笑了他的失败。但我们应该铭记他的贡献,巴贝奇的思考成功开启了属于计算机的时代,激励了一代又一代的科学家在这个领域钻研与探究,所以巴贝奇也被称之为计算之父,实至名归。

第一位程序员 - 埃达·洛夫莱斯

巴贝奇的分析机基本奠定了现代计算机的雏形,在给定程序的前提下,机器能够自动计算和完成各种操作。而巴贝奇的好友兼学生埃达·洛夫莱斯也在研究分析机的同时,详细说明了使用分析机来计算伯努利数的方法,这是被公认的第一段假想的计算机程序,因此埃达也被称为第一位程序员。

埃达博学多识,视野开阔,在巴贝奇同时代的学者还在着眼于计算机的数学算力时,埃达已经预见了计算机广泛应用的未来,在埃达的笔记中,她通过 “诗意科学“ 来研究分析机,探索个人、社会如何通过科技来进行协同工作。

为了纪念埃达对计算机领域的卓越贡献,美国国防部于1980年12月10日制作的新计算机编程语言 - Ada,就是以埃达名字命名。

政府开始介入

1890 年,美国政府开始面临严重的人口普查问题,宪法要求每 10 年对人口进行一次普查,目的是为了分配联邦资金和国会代表等。

相传在 1790 年第一次全美人口调查中,17 位美国联邦司法区执行官任命了 200 名助手,他们骑马遍历整个美国以统计居民人数,并用鹅毛笔在他们能找到的所有纸片上记录统计结果,此次人口普查项目总耗资 45000 美元!

到了 1890 年,美国人口迅速增长,大量移民涌入,人口普查不仅耗费巨大,而且需要长达 7 年的时间来进行手工编制,等到做完数据已经过时了。

这个时候政府认识到必须要采用科学技术来改善效率,减少消耗,于是一种能够实际投入使用,并能够切实提高人口普查效率的工具就成为了必然的趋势。

打孔卡片制表机

上图为 赫尔曼·何乐礼,参考自维基百科

赫尔曼·何乐礼,在麻省理工教学时,完成了其第一次打孔卡实验,随后因美国人口普查局的邀约,参与改善人口普查效率,何乐礼将其研究的打孔卡片制表机用于实际的人口普查中,帮助美国政府在 1 年之内就完成了人口普查,而这个数据在 1880 年人口普查时是 8 年!打孔卡片制表机的引入,从此开启了极大的改善了人类社会大型计算任务的效率。

上图参考自简书:https://www.jianshu.com/p/49f... 侵权删。

那这样一个极大改善效率的打孔卡制表机又是如何运作的呢?

打孔卡制表机包含示数装置、穿孔机、读卡装置和分类箱。

示数装置包含 4 行、10 列,一共 40 个表盘,每个表盘均匀的氛围 100 格,每个表盘里面有两根计数指针,一根类似分针,一根类似时针,分针转一圈可计 100,时针转一圈可计 10000,相当于一个表盘可以统计 10000 * 100 = 10万个数据,而每一个表盘又在前一个的基础上翻倍,由此可见打孔卡制表机可以统计多么庞大的数据。

而穿孔机则类似现代的键盘,穿孔机负责给打孔卡片穿孔,打孔卡片在当时被设计得和美国纸币一样大小,所以可以收纳在放纸币的收纳盒里,因为打孔卡片非常小,所以如果在卡片上寻找需要打孔的位置会非常麻烦,而穿孔机是模拟了卡片的一个大型的操作板。

上图是一张打孔卡片,它实际上只有美国当时纸币的大小,见下图的标注 “正在打孔的卡片”,卡控卡片的右下角缺失处是为了标志正反,类似二维码总有一个角是缺失的。

上图参考自简书:https://www.jianshu.com/p/49f... 侵权删。

而上图中的操作面板类似现代的键盘,将打孔卡片里面所有可操作的位置进行复刻,然后操作人员在操作面板上操作要打的孔,对应的卡片上的操作杆就会在对应的卡片上打下对应的孔,类似我们现在在键盘输入 “字母”,屏幕上就会显现出对应的字母一样。

同时打孔卡制表机还有一个读卡装置,读卡装置的主要原理是将打孔卡片放入,根据卡片上的孔进行操作,如统计性别的卡片,如果标志位男性有孔,那么读卡装置的上下的电路就会连通,给男性这个计数位加自动加 1。

上图参考自简书:https://www.jianshu.com/p/49f... 侵权删。

读卡装置就是上述的图示,金属针和水银之间放入打孔卡片,如果卡片有孔,那么金属针就会和水银接触,激活电路。

而分类箱则是用于给不同类别的卡片分类,方便后续进行再次操作。

由于打孔卡制表机的打孔和计数非常之快,且计数是自动进行的,极大的改善了以往需要手算、心算、加上大量的纸进行统计带来的低效率普查方式。

私营企业开始繁荣

自那以后,何乐礼认识到打孔卡制表机的巨大价值,于是成立了制表机器公司,向全世界的人口统计局推销自己的产品,因此之后英格兰、意大利、德国、俄罗斯、澳大利亚、加拿大、法国、挪威、波多黎各、古巴和菲律宾都使用了其发明的制表机。

得益于政府和社会的需求,企业还是如雨后春笋般生长起来,并意识到计算机所带来的的巨大价值:用来处理计算密集型任务,减少劳动力,从而提升利润,在会计、保险评估和库存管理等行业尤其刚需。

之后,制表机器公司于 1911 年该公司并入了计算制表记录公司,随后在 1924 年更名为国际商业机器公司(International Business Machine Corporation)IBM 公司,该公司在未来的几十年里,崭露头角,开启了电子计算机角逐的时代,为后续的大型机、小型机,直至现在千家万户都在使用的微机(个人计算机)的出现奠定了基础。

注意:本系列大量参考了 Crash Course:Computer Science 课程,并结合自己的理解以及查阅大量的资源将其总结成一系列有条理、分支结构清晰的系列科普文章。

参考资料

❤️/ 感谢支持 /

以上便是本次分享的全部内容,希望对你有所帮助^_^

喜欢的话别忘了 分享、点赞、收藏 三连哦~

欢迎关注公众号 程序员巴士,来自字节、虾皮、招银的三端兄弟,分享编程经验、技术干货与职业规划,助你少走弯路进大厂。


程序员巴士
52 声望8 粉丝

一辆有趣、有范儿、有温度的程序员巴士,涉猎大厂面经、程序员生活、实战教程、技术前沿等内容,关注我,交个朋友。