• 「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」
  • 当然 不论新老朋友 我相信您都可以 从中获益。如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力!

一、织布机 | 一切的开端

如今代表智能现代的计算机与老式织布机的血缘关系超乎你的想象。无论是摆在写字台上的 台式机、塞在口袋里的 掌上电脑、挂在腰上的 移动电话、乃至你家中的很多 家用电器,其实都是 1804 年诞生的 一台织布机的后代——雅卡尔传空纸带提花机

织物与织布机

常见的织物

常见的织物有 「机织物」「针织物」 两种。

我们平时最为熟悉的 「针织物」 借助的工具是 “针”,利用织针按照一定方向弯曲成线圈形态,然后再将线圈相互串套而形成的织物,可以横向或者纵向地进行,横向编织称为纬编织物,而纵向编织称为经编织物。

「机织物」 由两条或两组以上的相互垂直的两个系统纱线或者丝线,在 织机 上按照一定规律相互交织而形成的织物叫机织物,纵向的纱线经纱横向的纱线纬纱,基本组织有平纹、斜纹和缎纹。

织机是如何工作和迭代的

在织机上,经纱在经轴上逐根排列,根据织物纹样的要求,部分经纱被抬起,另一部分经纱则保持不动 形成织口纬纱从织口中引入,经纱抬起的规律不同以及纱线颜色的排列变化,就会给织物带来不同的纹样:

可是,经纱有那么多,是如何挑选出引入没根纬纱时要提起哪些经纱的呢?

最原始的织机是手动完成的:

而到了战国时期的 多综式提花织机,则发明了 综框 来完成这项工作,棕框的上下梁间有垂直排列的综丝,经纱穿入综丝中,织物纹样的变化有一个规律,也就意味着经纱是随着纬纱的引入被 有规律的循环提起,将 提起规律相同的经纱 穿入 同一个综框的综丝 中,当综框被提升时,穿入的所有经纱都会被同时提起,每一个综框都有一个脚踏板,踩下脚踏板则可通过机械装置控制其抬升:

不过采用综框也有一个明显的限制,那就是 无法织出比较复杂的纹样,因为纹样复杂则代表着需要更多的经纬纱以及经纱提升的规律更复杂,意味着可能引入成百上千次纬纱才能完成一个循环。

如果仍然采用综框控制纱线提升,则可能需要成百上千个综框,这在机械上实现是非常困难的,因此便有了 束综提花织机

束综提花织机没有综框,而是被 设计成两层,每一根经纱会穿入综丝中实现 单独的控制上层 的人将需要提起的经纱提起,而 下层 的人则再经纱提起后通过梭子将纬纱送入织口,并用打纬装置将引入的纬纱打牢。

然而通常来说,这类织机上会有成千上万根纬纱,纹样复杂,于是聪明的老祖宗们发明了 花本

简单来说,花本存储了纹样信息。图中花本的竖线连接穿入了经纱的综丝,横线存储了每一次引入纬纱时提花信息,当竖线越过横线覆盖在横线前方时,表明对应的经纱要被提起。

如果还是没有理解到这个过程的话,这里有一个比较硬核的视频,教你如何手工来制作一个简易织布机:戳这里

"识字"的机器 | 雅卡尔织机的诞生

上面说到的束综提花织机虽然是一大进步,但可想而知的是,它仍然效率缓慢并且织布工人的劳动量非常大,也非常辛苦。虽然聪明的祖先们进行了很多机械化的尝试,但仍然没有取得跨越式的发展。

时间来到 18 世纪的欧洲。欧洲游历和学徒的传统,造就了许多城市独特的支柱产业,例如威尼斯的玻璃业和法国里昂的 丝织业1725 年,里昂的织匠 布乔 (B.Bouchon) 做出了开拓性的发明:他用 打孔纸带 控制经线的提起和放下,从而让织出花样成为了一种半自动的工作。

做为一个乐器工人的儿子,布乔把家学和自己的工作结合得很好。然而,柔软的打孔纸带不能织出太宽的织物,这是它的致命伤之一;而纸带依然需要有人照看,每穿过一次纬线,纸带就需要向下移动一格。布乔提花机的最大贡献,在于实现了花纹的二进制存储——以机器能够识别的方式。历史上第一次,机器能够读出存储介质中的内容,并且照其行事。

在布乔提出构想 65 后的 1790 年,约瑟夫·玛丽·雅卡尔 根据前人的成果设计了新式织机,不过正在此时,轰轰烈烈的法国大革命爆发了,雅卡尔也停下了手中的工作,投入到了家乡里昂的里昂保卫战中,这一拖就拖到了 1805 年,雅卡尔终于组装完成了首台 自动提花织机

雅卡尔将 穿孔纸带 改进为 穿孔卡片,根据纹样图案在卡片上打孔,通过孔的有无 带动一系列机械运动装置来 控制经纱的提升,一张卡片对应循环内一次引纬时经纱提升的信息,引纬完成后,可通过脚踏板控制卡孔卡片转动,下一张卡片翻转至工作位置以控制新一次引纬的提花:

雅卡尔织机大幅度节省了时间和工作量 (全自动且效率是之前的二十五倍),而且只需一位工人,很快就被广泛使用在工厂生产中,雅卡尔也荣获了拿破仑授予的荣誉勋章。然而,迎接这位发明家的,却是失业的纺织工人迎面扔来的石头。最终导致雅卡尔客死异乡。

雅卡尔 = 贾卡。笔者在写文的时候,发现不同的资料文献中对于该织机作者的翻译会有偏差,有的叫 雅卡尔织机,有的叫 贾卡织机,但都是同一个人啦..

二、差分机 | 程序设计思想开始萌芽

穿孔卡片控制织物纹样的设计成为了程序设计思想的萌芽,为信息技术的发展开展了一条新的道路。

时间来到 19 世纪初,法国人 巴贝奇 (Chanles Badbbage) 在贾卡织机的启发下,设计并制造了 差分机

故事背景

以下内容大部分摘录自下方引用资料:现代计算机真正的鼻祖——超越时代的伟大思想

18 世纪末,法国政府在开创米制之后,决定在数学中统一采用十进制,竟奇葩地想把原本 90 度的直角划分成 100 度、把原本 60 秒的 1 分钟划分成 100 秒,尽管从现在看来这样的想法绝逼是一种倒退,但他们在当时真就实施了。这一改制带来的不光是人们在使用时直观上的别扭,原本制作好的数学用表 (如三角函数表) 都需要全部重制。

法国政府将这项丧心病狂的工程交给了 数学家普罗尼 (Gaspard de Prony),普罗尼正头疼着要如何才能完成这项艰巨的任务,突然想起著名经济学家 亚当·斯密 (Adam Smith) 的那本《富国论》,他决定采用书中提出的 劳动分工 的做法,将制表的工作人员分成三组:

  • 第一组 由五六名牛逼的数学家组成,他们负责制定运算中所需的公式;
  • 第二组 由九到十个擅长数学的人组成,他们负责计算出一些关键数据,并把第一组制定好的公式进行简化;
  • 第三组 由约一百名计算人员组成,他们利用第二组提供的关键数据和公式,做最简单的加减操作就能得出最终结果。

第三组的工作简单到什么程度,就是他们甚至都不知道自己正在算什么玩意儿,事实上他们的文化程度大部分都不高,里头好多都是理发师、失业人员什么的。可见即便文盲都能完成的计算,在那个时代还是得依靠人力去做。

而为了保证用表的正确性,普罗尼要求 每个数至少算两遍,并且 要在法国的不同地点用不同的方法计算。这项劳民伤财的工程整整进行了十年才完成,然而不幸的是,最终的表里仍然有错。说到这一点,可以说,那个时代基本没有一版数学用表是完全正确的,有些版本甚至错误百出,要知道数学用表出错有时后果会很严重,比如航海表一出错就可能直接导致船毁人亡。

巴贝奇 在了解到普罗尼的事迹后泪流满面,决心要做一套完全正确的数学用表,为达目的,他尝试了各种减少错误的手段,比如调整纸张和墨水的颜色以提高数字的识别度,直接拿现有的多个版本的表进行誊抄、比对、让不同人员反复校对,在 1827 年出版了一个版本,结果里头还是有错。只要是人为的就没有完美的,巴贝奇彻底跪了,他发誓要造一台机器,让机器去生产数学表。

这就是史上著名的 差分机 了。

重要的差分思想

其实早在巴贝奇出生前,有个叫 米勒 (Johann Helfrich von Müller) 的德国工程师就提出了差分机的思想,但仅仅是提了一下,并没有进行具体设计和制造,他最终还是把研制差分机的历史重任让给了巴贝奇。

之所以叫差分机这个名字,是因为它计算所使用的是帕斯卡在 1654 年提出的差分思想:n 次多项式的 n 次数值差分为同一常数。举个简单例子好了,对于函数 F(x) = 12x + 12,x 取自然数:

对于一次多项式,每个相邻的 x 所对应的 F(x) 之差都是一个常数,这个常数很明显就是 x 的系数。那么二次多项式呢?对于函数 F(x) = 15x2 + 12x + 12,x 取自然数:

对于二次多项式,每个相邻的 x 所对应的一次差分之差仍然都是一个常数,我们可以导出这一常数的通用公式:

在上述例子中,a = 15,故二次差分常数 2a 即为 30

差分规律是一项伟大的发现,有了差分,在计算多项式时就可以 用加法替代乘法,我们只需要算出几个初始值,后面对于任意 x 所对应的 F(x) 均可以通过加法得出:

学过高数的朋友应该知道,一个函数在满足一定条件的情况下可以用多项式逼近 (幂级数展开),于是常用的三角函数、对数函数都可以通过多项式来计算的,而机械时期的计算设备最擅长的就是做加法,有了差分思想,巴贝奇看到差分机的前途一片光明。

完成一半的差分机(Difference Engine)

1812 年到 1822 年,巴贝奇克服重重困难完成了一台可以计算六位数二次多项式的模型机,他给皇家学会的主席写信,希望政府可以出资,赞助他建造真正可用的大型差分机。政府也觉得这事儿很有意义,尤其对海军很有价值,于是在 1823 年拨款 1500 英镑,巴贝奇如鱼得水,号称只要两三年时间就能完工。

谁知实行起来要比想象中困难得多,那个时代的机械制造水平实在落后,差分机是十分精密的仪器,巴贝奇跑遍了欧洲都没找到多少能用的零件,于是在制造差分机之前,他还要先想着怎么制造各类零件。

在英国当时一个牛逼的机械师 克莱门特 (Joseph Clement) 的帮助下,他们真的在提高机械制造方面下足了功夫,不但做出了差分机能用的零件,还培养出大批优秀的技师。本来这两人强强联合势必能把差分机做好,但是巴贝奇是个精益求精的人,经常改动设计方案,导致工程时常要返工,工作量大大增加,外加亲人的相继去世,后来又和克莱门特闹掰,到了 1833 年,十年都过去了,巴贝奇只做出了机器的一小部分,却已经花费了 3 万英镑 (远超最初预算)。政府对巴贝奇大失所望,终于在 1842 年正式宣布不再出资,到头来巴贝奇给后世留下的就只有一个半成品,以及在 1839 年修订好的一大堆设计图纸,现存于伦敦科学博物馆。

值得一提的是,巴贝奇做不出差分机实在不是客观原因所致,与他同时代的瑞典人 乔治·舒茨 (Per Georg Scheutz) 就根据他的设计在 1843 年做出了切实能用的差分机,巴贝奇倒是提供了不少指导和帮助,也算是了却了自己一桩心愿吧。

150 年后,为了纪念巴贝奇 200 年诞辰,从 19891991 年人们根据巴贝奇的设计图纸建造了第一台真正的巴贝奇差分机,机器完美运行,工程师们惊奇地发现,巴贝奇的图纸里只有极少的错误,而且这些错误八成是当时为防止图纸被盗用而刻意为之的。这台差分机被保护在伦敦科学博物馆的玻璃柜里,后来又造了一台,放在美国硅谷的计算机历史博物馆,每天由导游给参观者讲解和演示,人们得以近距离膜拜。

差分机的工作原理简析

在巴贝奇 1839 年的设计中,差分机可以支持七次多项式的计算。由于每次参与计算的都是函数值和 1~7 次差分值的最新值,于是仅需响应的 8 个计数器。巴贝奇设计的计算器由 31 个计数轮垂直叠加而成,即支持 31 位十进制数:

加上传动装置和进位装置,就成了这样一幅丧心病狂的样子:

巴贝奇使用梯形的传动轮实现两个计数轮之间的相加,由于有梯形齿,传动轮可以同时带动两个计数轮,也可以只带动一个。于是在进行两数相加时,传动轮先顺时针旋转,将右侧计数轮上的数字加到左侧轮上,而后上升一段距离,逆时针旋转相同度数,将右侧计数轮的示数还原到原来的位置。

仔细观察可以发现,这两个轮子上的数字排列顺序是相反的。在两轮相加的过程中,左侧轮作为累加轮朝数值增大的方向旋转,而右侧轮作为加数轮则朝数值减少方向旋转。在巴贝奇改进的并行差分算法中,两个步骤交替进行,同一个计数轮需要交替充当累加轮和加数轮的角色,于是当机器运行起来,这些齿轮需要正反方向交替旋转。

差分机的进位机构比较复杂,简单地说,每个计数轮都有一个针对高位的 “进位提示器”,当计数轮从 9 转到 0,其对应的 “进位提示器” 就被拨到 “需要进位” 的状态,每次计算,计数轮都要转动两次,第一次是每位数相加,第二次是按照“进位提示器”进行进位。我们直观地感受一下连续进位是什么样子:

最后我们来欣赏一下差分机整个运行起来的样子:

还有另外一个适用乐高还原的硬核版本:

如果对这一部分感兴趣的童鞋请进一步阅读原版文章:现代计算机真正的鼻祖——超越时代的伟大思想

三、分析机 | 第一台真正意义上的 Computer

尽管没能亲手实现差分机,但巴贝奇并不会气馁,或者说他本来就是根本停不下来的那种人。明知实现不了,巴贝奇仍在一刻不停地改进着自己的设计,直到有一天,他构思出了一种空前的机器——分析机,正式成为现代计算机史上的第一位伟大先驱。 (Father of computing)

1834 年,分析机概念诞生之际,巴贝奇自己都为之感到无比震惊。在此之前,任何一台计算机器都只能完成其被预定赋予的计算任务,要么是简单的加减乘除,要么像差分机那样只能做差分运算,它们都属于 calculator,而分析机才是真正的 computer,它不局限于特定功能,而竟然是可编程的,可以用来 计算任意函数——现代人无论如何也无法想象在一坨齿轮上写程序是怎样一种体验吧!

巴贝奇设计的分析机主要包括三大部分:

  1. 用于存储数据的计数装置,巴贝奇称之为 “仓库”(store),相当于现在 CPU 中的存储器,这部分是从差分机上的计数装置改进而来的,我们很容易想象它的模样;
  2. 专门负责四则运算的装置,巴贝奇称之为 “工厂”(mill),相当于现在 CPU 中的运算器,这部分的结构相对复杂,巴贝奇针对乘除法还做了一些优化;
  3. 控制操作顺序、选择所需处理的数据和输出结果的装置,巴贝奇没有起名字,由于其呈桶状,我们可以叫它 “控制桶”,控制桶显然相当于现在 CPU 中的控制器

以上三部分,加上巴贝奇并没有疏漏的输入输出设备,我们惊讶地发现,分析机的组成部分和现在冯·诺依曼架构所要求的五大部件一模一样!

巴贝奇另一大了不起的创举就是将 穿孔卡片(punched card) 引入了计算机器领域,用于控制数据输入和计算,从那时起,到第一台电子计算机诞生为止,期间几乎所有的数字计算机都使用了穿孔卡片。

巴贝奇在一次巴黎展览会上看到了贾卡的提花机,对其印象十分深刻,由于一直在研究计算机器,自然想到可以把穿孔卡片也应用到分析机上。于是分析机中的输入数据、存储地址、运算类型都使用穿孔卡片来表示。在机器运行时,卡片上有孔和无孔的地方会导致对应的金属杆执行不同操作,可编程性由此体现。下图可以直观地展现这一原理:

整个分析机就是在类似这样的齿轮和拉杆作用下实现可编程运算的:先从数据卡片读入数据到存储器,再将存储器中的数据传输到运算器,运算器算完后又将数据传回存储器。

可惜的是,巴贝奇穷其一生也没能真正把分析机做出来,留给后世的又是一台模型机和两千多张图纸,以及这样一段遗言:

如果一个人不因我一生的借鉴而却步,仍然一往直前制成一台本身具有全部数学分析能力的机器……那么我愿将我的声誉毫不吝啬地让给他,因为只有他能够完全理解我的种种努力以及这些努力所得成果的真正价值。

可以说,巴贝奇一生的奋斗都是孤独的,在那个年代,人们看不到分析机的巨大价值和意义,有了先前差分机的失败,政府也不再愿理会分析机的想法。巴贝奇的思想超前了整整一个世纪,但庆幸的是在有生之年,依然有着三位难能可贵的支持者:

  1. 首先是他的儿子 亨利·巴贝奇 (Henry Prevost Babbage),直到巴贝奇过世后,亨利也继续着分析机的建造工作,但终究也力不从心未能完成;

  2. 而后是后来成为了意大利总理的数学家 闵那布利 (Luigi Federico Menabrea),他在巴贝奇 1840 年演讲时详细记录下了分析机的思想;

  3. 最后就是著名诗人拜伦的女儿,史上大名鼎鼎的 女程序员艾达 (Ada Lovelace),她将闵那布利记录分析机的文章翻译成英文,巴贝奇建议她在翻译时增添一些自己的理解,结果艾达注解的长度是原文的两倍,其中针对计算伯努利数的算法被视为史上第一个计算机程序,这篇名为《关于巴贝奇先生发明的分析机简讯》的译文被视为程序设计方面的第一篇著作,而 艾达本人则成了世界上第一位程序员

艾达几乎是那个时候唯一一个真正理解分析机的人,她不仅编写了许多可以在分析机上运行的程序,甚至还看到了巴贝奇自己都没有看到的事情——她说:分析机不光能用来计算,它应该还能用来表示其他东西,比如音乐。这是多么远大的目光啊!后来美国国防部将一种编程语言命名为 Ada,就是为了纪念这位与巴贝奇同样具有超前思想的伟大女性。

四、制表机 | 穿孔时代的到来

1790 年开始,美国每 10 进行一次人口普查。百年间,随着人口繁衍和移民的增多,从 1790 年的 400 万不到,到 1880 年的 5000 多万,人口总数呈爆炸式地增长。

不像现在这个的互联网时代,人一出生,各种信息就已经电子化、登记好了,甚至还能数据挖掘,你无法想象,在那个计算设备简陋得基本只能靠手摇进行四则运算的 19 世纪,千万级的人口统计就已经成了当时政府的 “不能承受之重”1880 年开始的第 10 次人口普查,历时 8 年才最终完成,也就是说,他们在休息两年之后就要开始第 11 次普查了,而这一次普查,需要的时间恐怕要超过 10 年,那第 12 次、13 次呢?本来就是 10 年一次的统计,如果每次耗时都在 10 年以上,这件事情就变得没有意义了。

这可愁煞了当时的人口调查办公室,他们决定面向全社会招标,寻求能减轻手工劳动、提高统计效率的发明。正所谓机会都是给有准备的人的,一位毕业于哥伦比亚大学的年轻人 赫尔曼·霍尔瑞斯 (Herman Hollerith) 带着他在 1884 年申请的专利从众多方案中脱颖而出。

制表机

他发明的机器叫 制表机 (tabulator/tabulating machine),顾名思义,就是专门用来制作数据统计表的机器。制表机主要由示数装置、穿孔机、读卡装置和分类箱组成。

示数装置包含 4 行、10 列共 40 个示数表盘,每个盘面被均匀地分成 100 格,并装有两根指针,和钟表十分相像,“分针” 转一圈可计 100,“时针” 转一圈则计 10000。可见,整个示数装置可以表达很庞大的数据。

制表机的工作是围绕穿孔卡片展开的:操作员先使用穿孔机制作穿孔卡片,再使用读卡装置识别卡片上的信息,机器自动完成统计并在示数表盘上实时显示结果,最后,将卡片投入分类箱的某一格中,进行分类存放,以供下次统计使用。

穿孔卡片的应用

此前的某一天,霍尔瑞斯正在火车站排队检票,目光不经意落到检票员手中咔咔直响的打孔机上。他发现,检票员会特意根据乘客的性别和年龄段,在车票的不同地方打孔。越来越多的人过检,他进一步确认了这个规律。一个灵感朝他袭来:如果有一张更大的卡,上面有更多的位置可以打孔,就可以用来表示更多的身份信息,包括国籍、人种、性别、生日等等。

这就是用在 1890 年人口普查中的穿孔卡片,一张卡片记录一个居民的信息。卡片设计长约 18.73cm,宽约 8.26cm,正好是当时一张美元纸币的尺寸,因为霍尔瑞斯直接用财政部装钱的盒子来装卡片。

卡片设有 300 多个孔位,与雅卡尔和巴贝奇的做法一样,靠每个孔位打孔与否来表示信息。尽管这种形式颇有几分二进制的意味,但当时的设计还远不够成熟,并没有用到二进制真正的价值。举个例子,我们现在一般用 1 位数据就可以表示性别,比如 1 表示男性,0 表示女性,而霍尔瑞斯在卡片上用了两个孔位,表示男性就其中一处打孔,表示女性就在另一处打孔。其实性别还凑合,表示日期时浪费得就多了,12 个月需要 12 个孔位,而常规的二进制编码只需要 4 位。当然,这样的局限也与制表机中简单的电路实现有关。

细心的读者可能发现卡片的右下角被切掉了,那不是残缺,而是为了避免放反而专门设计的,和现在的二维码只有 3 个角是一个道理。

这类实用的细节设计在穿孔机上表现得更为出色。下图为一位操作员正在使用穿孔机给卡片打孔的情景,她并不需要在卡片上吃力地搜寻孔位,而是直接对着孔距更大的操作面板打孔,一根杠杆将两者的孔位一一对应。操作面板还做成了弧形,颇有一分如今人体工程学键盘的风姿。

在制表机前,穿孔卡片(或纸带)多用于存储指令而不是数据。比较有代表性的,一是雅卡尔提花机,用穿孔卡片控制经线提沉;二是自动钢琴,用穿孔纸带控制琴键压放。美剧《西部世界》中,每次故事循环的开始,都会给一个自动钢琴的特写,弹奏起看似宁静安逸、实则诡异违和的背景乐。

是霍尔瑞斯将穿孔卡片作为 数据存储介质 开来,并开启了一个崭新的 数据处理纪元。后来人们也把这类卡片称为霍尔瑞斯卡片,穿孔卡片和穿孔纸带作为输入输出载体,统治了计算领域整整一个世纪。

统计原理

打好了孔,下一步就是将卡片上的信息统计起来。读卡装置的组成如下图所示,其外形和使用方式有点类似现在的重型订书机,将卡片置于压板和底座之间,按压手柄,就完成了对这张卡片的信息读取。

原理上,通过电路通断识别卡上信息。底座中内嵌着诸多管状容器,位置与卡片孔位一一对应,容器里盛有水银,水银与导线相连。底座上方的压板中嵌着诸多金属针,同样与孔位一一对应,针的上部抵着弹簧,可以伸缩,压板的上下面由导电材料制成。这样,当把卡片放在底座上,按下压板时,卡片有孔的地方,针可以通过,与水银接触,电路接通,没孔的地方,针就被挡住

这一基本原理与雅卡尔提花机类似,不难理解。重头戏是,如何将电路通断对应到所需要的统计信息呢?霍尔瑞斯在专利中给出了一个简单的例子,如下图所示。这是涉及性别、国籍和人种 3 项信息的统计电路图,虚线为控制电路,实线为工作电路。

图顶有7根金属针,从左至右标的分别是:G(类似于总开关)、Female(女)、Male(男)、Foreign(外国籍)、Native(本国籍)、Colored(有色人种)、White(白种人)。

工作电路中分散着标识为 m1~m10 的电磁继电器。

图底从右至左为标识为 M1~M66 组电磁铁,所对应的统计信息为(为贴合穿孔的形象,我特意选择使用圆圈进行标记):

M1 为例,如果表示 Native、White 和 Male 的针同时与水银接触,接通的控制电路:

这一示例首先展示了针 G 的作用,它把控着所有控制电路的通断,目的有二:

  1. 在卡片上留出一个专供 G 通过的孔,以防止卡片没有放正(照样可以有部分针穿过错误的孔)而统计到错误的信息。

  2. 令 G 比其他针短,或者 G 下的水银比其他容器里少,从而确保其他针都已经接触到水银之后,G 才最终将整个电路接通。众所周知,电路通断的瞬间容易产生火花,这样的设计可以将此类元器件的损耗集中在 G 身上,便于后期维护。

不得不感慨,这些发明家做设计真的特别实用、细致。

控制电路的接通引起图中标有橘黄色箭头的 3 个电磁继电器 m1m3m5 闭合,进而接通 M1 所在的工作电路:

最终,通电的 M1 将产生磁场,牵引相关杠杆,拨动齿轮完成计数,最终体现到示数表盘上指针的旋转。虽然霍尔瑞斯的专利中没有给出这一计数装置的具体结构,可以想象,从 17 世纪开始,机械计算器中的齿轮传动技术已经发展到足够成熟的水平,霍尔瑞斯无需重新设计,完全可以使用现成的装置,正如他在专利中所说的“any suitable mechanical counter”(任何合适的机械计数器都可以)。

电磁铁不单控制着计数装置,还控制着分类箱盖子的开合。将分类箱上的电磁铁接入工作电路,每次完成计数的同时,对应格子的盖子会在电磁铁的作用下自动打开,熟练的操作员甚至不用转头去看,就可以顺手将卡片投到正确的格子里,由此完成卡片的快速分类。

每天工作的最后一步,就是将示数表盘上的结果誊抄下来,置零,第二天继续。

单元记录时代

在制表机的高效运转下,1890 年的人口普查只花了 6 年时间。1896 年,霍尔瑞斯成立制表机公司(The Tabulating Machine Company)并不断改进自己的产品,先后与英国、意大利、德国、俄罗斯、澳大利亚、加拿大、法国、挪威、美国波多黎各、古巴、菲律宾等多个国家和地区合作开展了人口普查。

1914 年,制表机公司每天生产的穿孔卡片多达 200 万张。不多久,一些竞争对手逐渐起家,历史迎来了繁荣的数据处理时代。它们的产品也不再局限于人口普查,逐渐扩展到会计、库存管理等一些同样需要跟大数据打交道的领域,这些机器作为制表机的后裔被统称为单元记录设备(unit record equipment)。

围绕穿孔卡片的制卡、读卡、数据处理和卡片分类是它们的标准功能,穿孔机、读卡器、分类器是它们的标准配置。这些部件的自动化程度越来越高,比如手动的读卡装置很快被自动读卡机所取代,读卡速度从每分钟 100 张逐步提高至每分钟 2000 张。随着识别精度的提高,卡片的孔距也越来越小,具有 80~90 列孔位的卡片成为主流,有些卡片的孔位甚至多达 130 列。

机器的功能也逐渐强大,不再只是简单地统计穿孔数目,减法、乘法等运算能力陆续登场。1928 年,哥伦比亚大学的科学家们甚至用单元记录设备计算月球的运行轨迹,他们在 50 万张卡片上打了 2000 万个孔,彰显着单元记录设备的无限潜力。

机器的电路实现越来越复杂,但同时也越来越通用。1890 年所用的那台制表机的 线路是固定的,遇到新的统计任务,改造起来十分麻烦。

1906 年,霍尔瑞斯便引入了接插线板(plugboard)——一块布满导电孔的板卡,可通过改变导线插脚在板上的位置改变线路逻辑。试想一下,接插线板的内部已经布好了具有各种功能的线路,但它们都处在断开状态,各自连接着接插线板上的某两个孔位,像一窝嗷嗷待哺的小鸟长大着嘴巴,外部的导线就像美味的虫子,当虫子的头尾分别与小鸟的上喙和下喙接触,线路就被导通,这只小鸟就开始工作了。如此,每次使用就可以激活不同的 “小鸟”,从而完成不同的任务。这已经是一种可编程性的体现。

1911 年,制表机公司与另外 3 家公司合并成立 CTR 公司 (Computing-Tabulating-Recording Company),制表机公司作为其子公司继续运营到 1933 年。

1924 年,CTR 更名为 国际商业机器公司International Business Machines Corporation),就是现在大名鼎鼎的 IBM 公司。可见,在如今众多年轻的 IT 公司中,拥有百年历史的 IBM 是位当之无愧的前辈,它完整地参与和见证了整个现代计算机的发展史。IBM 保持了制表机公司在单元记录市场的龙头地位,到 1955 年,其每天生产的穿孔卡片多达 7250 万张。

1937 年开始,单元记录设备逐步电子化,与电子计算机的界线渐渐模糊,并最终为后者让路。随着 1976 年 IBM 一型最核心的单元记录产品的停产,短暂的单元记录时代也宣告谢幕,它仿佛是电子计算时代来临前的预演和铺垫,许多设计被沿用下来,比如穿孔卡片和接插线板。

有趣的是,即使电子计算机逐渐普及,许多机构由于用惯了单元记录设备,迟迟不愿更换,少数机构甚至一直用到了 21 世纪。

在翻阅资料的时候发现了一个特别有趣的谈计算机发展是的简书专栏,感兴趣的童鞋可以进一步去阅读:传送门

参考资料

  1. 机织布、针织布和无纺布的概念介绍
  2. 从织布机到计算机
  3. 记忆传承,信息永生(四)
  4. 织布机与计算机
  5. 计算机发展的引路者——贾卡织机的前世今生
  6. 布爾與電腦——《科學月刊》
  7. Who is the father of the computer?
  8. 现代计算机真正的鼻祖——超越时代的伟大思想
  9. 制表机:穿孔时代的到来
  • 本文已收录至我的 Github 程序员成长系列 【More Than Java】,学习,不止 Code,欢迎 star:https://github.com/wmyskxz/MoreThanJava
  • 个人公众号 :wmyskxz,个人独立域名博客:wmyskxz.com,坚持原创输出,下方扫码关注,2020,与您共同成长!

非常感谢各位人才能 看到这里,如果觉得本篇文章写得不错,觉得 「我没有三颗心脏」有点东西 的话,求点赞,求关注,求分享,求留言!

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

「MoreThanJava」计算机发展史—从织布机到IBM的更多相关文章

  1. 「MoreThanJava」Java发展史及起航新世界

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  2. 「MoreThanJava」计算机系统概述

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  3. 「MoreThanJava」一文了解二进制和CPU工作原理

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. 「MoreThanJava」机器指令到汇编再到高级编程语言

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  5. 「MoreThanJava」当大学选择了计算机之后应该知道的

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  6. 「MoreThanJava」Day 1:环境搭建和程序基本结构元素

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  7. 「MoreThanJava」Day2:变量、数据类型和运算符

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. 「MoreThanJava」Day 3:构建程序逻辑的方法

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  9. 「MoreThanJava」Day 4:面向对象基础

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

随机推荐

  1. Spring配置cache(concurrentHashMap,guava cache、redis实现)附源码

    在应用程序中,数据一般是存在数据库中(磁盘介质),对于某些被频繁访问的数据,如果每次都访问数据库,不仅涉及到网络io,还受到数据库查询的影响:而目前通常会将频繁使用,并且不经常改变的数据放入缓存中,从 ...

  2. 06 EntityManager和EntityTransaction

    EntityManager 在 JPA 规范中, EntityManager是完成持久化操作的核心对象.实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对 ...

  3. plist 图集 php 批量提取 PS 一个个切

    最近,迷上了用 cocos2d 做游戏开发.由于是新入门,很多东西从头开始学. 在使用 sprite 的 Rect 裁剪显示的时候,显示总是多一块.所以,要从图集中提取一张张图,这样就省了裁剪. 原图 ...

  4. 树莓派3b+ 交叉编译 及升级 kernel

    安装 gcc pkg 等工具sudo apt-get install build-essential git 官方介绍 https://www.raspberrypi.org/documentatio ...

  5. 【07】openlayers 矢量图层

    创建地图: //创建地图 var map = new ol.Map({ //设置显示地图的视图 view: new ol.View({ center: [0, 0],//义地图显示中心于经度0度,纬度 ...

  6. python opencv Sobel、Laplace、canny算子的边缘提取 以及参数解析

    前提:各种算子不完全区分好坏,但根据我实际操作分析得到,有的算子之间效果大相径庭,但有的也很相似,也就是各有各的用法,这里按 Sobel.Laplace.canny三种算子作比较,看其结果: 一.  ...

  7. 一文搞懂 Elasticsearch 之 Mapping

    这篇文章主要介绍 Mapping.Dynamic Mapping 以及 ElasticSearch 是如何自动判断字段的类型,同时介绍 Mapping 的相关参数设置. 首先来看下什么是 Mappin ...

  8. Redis 服务端程序实现原理

    上篇我们简单介绍了 redis 客户端的一些基本概念,包括其 client 数据结构中对应的相关字段的含义,本篇我们结合这些,来分析分析 redis 服务端程序是如何运行的.一条命令请求的完成,客户端 ...

  9. linux下查看系统版本

    工作中我们会遇到安装软件需要知道linux是什么发行版本,话不多话上干货(按照我认为常用排序) 1. lsb_release -a 名词解释:LSB (Linux Standard Base) # 如 ...

  10. 不要再认为Stream可读性不高了!

    距离Java 8发布已经过去了7.8年的时间,Java 14也刚刚发布.Java 8中关于函数式编程和新增的Stream流API至今饱受"争议". 如果你不曾使用Stream流,那 ...