1. 程式人生 > >「MoreThanJava」計算機發展史—從織布機到IBM

「MoreThanJava」計算機發展史—從織布機到IBM

![](https://imgkr.cn-bj.ufileos.com/0d9f4db6-82ea-4282-ba28-e0b81593095d.png) - **「MoreThanJava」** 宣揚的是 **「學習,不止 CODE」**,本系列 Java 基礎教程是自己在結合各方面的知識之後,對 Java 基礎的一個總回顧,旨在 **「幫助新朋友快速高質量的學習」**。 - 當然 **不論新老朋友** 我相信您都可以 **從中獲益**。如果覺得 **「不錯」** 的朋友,歡迎 **「關注 + 留言 + 分享」**,文末有完整的獲取連結,您的支援是我前進的最大的動力! # 一、織布機 | 一切的開端 如今代表智慧現代的計算機與老式織布機的血緣關係超乎你的想象。無論是擺在寫字檯上的 **桌上型電腦**、塞在口袋裡的 **掌上電腦**、掛在腰上的 **行動電話**、乃至你家中的很多 **家用電器**,其實都是 `1804` 年誕生的 **一臺織布機的後代——雅卡爾傳空紙帶提花機**。 ![雅卡爾的穿孔紙帶提花機](https://imgkr.cn-bj.ufileos.com/9b1fa554-de4b-48fb-8f95-d47732d6b6a0.png) - 圖片源自:http://blog.sciencenet.cn/blog-528739-903746.html ## 織物與織布機 #### 常見的織物 常見的織物有 **「機織物」** 和 **「針織物」** 兩種。 我們平時最為熟悉的 **「針織物」** 藉助的工具是 **“針”**,利用織針按照一定方向彎曲成線圈形態,然後再將線圈相互串套而形成的織物,可以橫向或者縱向地進行,橫向編織稱為緯編織物,而縱向編織稱為經編織物。 ![針織物](https://imgkr.cn-bj.ufileos.com/b399fd2a-4c5a-48ae-a4fa-e099a6dba900.png) 而 **「機織物」** 由兩條或兩組以上的相互垂直的兩個系統紗線或者絲線,在 **織機** 上按照一定規律相互交織而形成的織物叫機織物,**縱向的紗線** 叫 **經紗**,**橫向的紗線** 叫 **緯紗**,基本組織有平紋、斜紋和緞紋。 ![機織物](https://imgkr.cn-bj.ufileos.com/5767622c-66d8-49db-967a-ba6ac38ef3fc.png) #### 織機是如何工作和迭代的 ![](https://imgkr.cn-bj.ufileos.com/95799f74-b03f-4282-ac2e-bde945f5741c.png) 在織機上,經紗在經軸上逐根排列,根據織物紋樣的要求,**部分經紗被抬起**,另一部分經紗則保持不動 **形成織口**,**緯紗從織口中引入**,經紗抬起的規律不同以及紗線顏色的排列變化,就會給織物帶來不同的紋樣: ![](https://imgkr.cn-bj.ufileos.com/de0f5b8c-0f9c-4dba-ad64-3cd8b936c667.gif) **可是,經紗有那麼多,是如何挑選出引入沒根緯紗時要提起哪些經紗的呢?** 最原始的織機是手動完成的: ![海南省黎族老太太編織傳統的毯織品。](https://imgkr.cn-bj.ufileos.com/2ca57071-c81d-4e84-91cf-ee4f85a20cb6.png) - 圖片引用自:https://www.sohu.com/a/301616592_99894978 而到了戰國時期的 **多綜式提花織機**,則發明了 **綜框** 來完成這項工作,棕框的上下樑間有垂直排列的綜絲,經紗穿入綜絲中,織物紋樣的變化有一個規律,也就意味著經紗是隨著緯紗的引入被 **有規律的迴圈提起**,將 **提起規律相同的經紗** 穿入 **同一個綜框的綜絲** 中,當綜框被提升時,穿入的所有經紗都會被同時提起,每一個綜框都有一個腳踏板,踩下腳踏板則可通過機械裝置控制其抬升: ![](https://imgkr.cn-bj.ufileos.com/70a22ba2-1b8b-4d72-b857-fbd314fd5b6f.gif) 不過採用綜框也有一個明顯的限制,那就是 **無法織出比較複雜的紋樣**,因為紋樣複雜則代表著需要更多的經緯紗以及經紗提升的規律更復雜,意味著可能引入成百上千次緯紗才能完成一個迴圈。 如果仍然採用綜框控制紗線提升,則可能需要成百上千個綜框,這在機械上實現是非常困難的,因此便有了 **束綜提花織機**。 ![](https://imgkr.cn-bj.ufileos.com/787f6a8f-5848-4b85-aec8-30b0ebdfd403.png) 束綜提花織機沒有綜框,而是被 **設計成兩層**,每一根經紗會穿入綜絲中實現 **單獨的控制**,**上層** 的人將需要提起的經紗提起,而 **下層** 的人則再經紗提起後通過梭子將緯紗送入織口,並用打緯裝置將引入的緯紗打牢。 然而通常來說,這類織機上會有成千上萬根緯紗,紋樣複雜,於是聰明的老祖宗們發明了 **花本**: ![](https://imgkr.cn-bj.ufileos.com/d1571e68-f977-42c9-a26e-a91838322a4a.png) 簡單來說,花本儲存了紋樣資訊。圖中花本的豎線連線穿入了經紗的綜絲,橫線儲存了每一次引入緯紗時提花資訊,當豎線越過橫線覆蓋在橫線前方時,表明對應的經紗要被提起。 > 如果還是沒有理解到這個過程的話,這裡有一個比較硬核的視訊,教你如何手工來製作一個簡易織布機:[戳這裡](https://www.bilibili.com/video/BV1Hi4y1b7im) ## "識字"的機器 | 雅卡爾織機的誕生 上面說到的束綜提花織機雖然是一大進步,但可想而知的是,它仍然效率緩慢並且織布工人的勞動量非常大,也非常辛苦。雖然聰明的祖先們進行了很多機械化的嘗試,但仍然沒有取得跨越式的發展。 時間來到 `18` 世紀的歐洲。歐洲遊歷和學徒的傳統,造就了許多城市獨特的支柱產業,例如威尼斯的玻璃業和法國里昂的 **絲織業**。`1725` 年,里昂的織匠 **布喬** *(B.Bouchon)* 做出了開拓性的發明:他用 **打孔紙帶** 控制經線的提起和放下,從而讓織出花樣成為了一種半自動的工作。 ![](https://imgkr.cn-bj.ufileos.com/bf09a9e9-b374-4abd-adba-2d20b4a347b7.png) 做為一個樂器工人的兒子,布喬把家學和自己的工作結合得很好。然而,柔軟的打孔紙帶不能織出太寬的織物,這是它的致命傷之一;而紙帶依然需要有人照看,每穿過一次緯線,紙帶就需要向下移動一格。布喬提花機的最大貢獻,在於實現了花紋的二進位制儲存——以機器能夠識別的方式。**歷史上第一次,機器能夠讀出儲存介質中的內容,並且照其行事。** 在布喬提出構想 `65` 後的 `1790` 年,**約瑟夫·瑪麗·雅卡爾** 根據前人的成果設計了新式織機,不過正在此時,轟轟烈烈的法國大革命爆發了,雅卡爾也停下了手中的工作,投入到了家鄉里昂的里昂保衛戰中,這一拖就拖到了 `1805` 年,雅卡爾終於組裝完成了首臺 **自動提花織機**: ![雅卡爾織機](https://imgkr.cn-bj.ufileos.com/5530f5ed-169d-438e-978f-867a375c8b2a.png) 雅卡爾將 **穿孔紙帶** 改進為 **穿孔卡片**,根據紋樣圖案在卡片上打孔,**通過孔的有無** 帶動一系列機械運動裝置來 **控制經紗的提升**,一張卡片對應迴圈內一次引緯時經紗提升的資訊,引緯完成後,可通過腳踏板控制卡孔卡片轉動,下一張卡片翻轉至工作位置以控制新一次引緯的提花: ![](https://imgkr.cn-bj.ufileos.com/3f3389be-68f3-4f1b-8835-b1d3d79f81de.gif) 雅卡爾織機大幅度節省了時間和工作量 *(全自動且效率是之前的二十五倍)*,而且只需一位工人,很快就被廣泛使用在工廠生產中,雅卡爾也榮獲了拿破崙授予的榮譽勳章。然而,迎接這位發明家的,卻是失業的紡織工人迎面扔來的石頭。最終導致雅卡爾客死異鄉。 > **雅卡爾 = 賈卡**。筆者在寫文的時候,發現不同的資料文獻中對於該織機作者的翻譯會有偏差,有的叫 **雅卡爾織機**,有的叫 **賈卡織機**,但都是同一個人啦.. # 二、差分機 | 程式設計思想開始萌芽 **穿孔卡片控制織物紋樣的設計成為了程式設計思想的萌芽**,為資訊科技的發展開展了一條新的道路。 ![](https://imgkr.cn-bj.ufileos.com/0e7d085f-700e-46c8-ac92-35aaecfbbad9.png) 時間來到 `19` 世紀初,法國人 **巴貝奇** *(Chanles Badbbage)* 在賈卡織機的啟發下,設計並製造了 **差分機**。 ## 故事背景 > 以下內容大部分摘錄自下方引用資料:[現代計算機真正的鼻祖——超越時代的偉大思想](https://www.jianshu.com/p/5d739419b93d) `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 取自然數: ![一次差分定義為∆F(x) = F(x+1) - F(x)](https://imgkr.cn-bj.ufileos.com/f34acc3b-ef27-4c16-948d-bbe7e81627d7.png) **對於一次多項式,每個相鄰的 x 所對應的 F(x) 之差都是一個常數**,這個常數很明顯就是 x 的係數。那麼二次多項式呢?對於函式 **F(x) = 15x2
+ 12x + 12**,x 取自然數: ![二次差分定義為∆F2(x) = F1(x+1) - F1(x)](https://imgkr.cn-bj.ufileos.com/114db6be-2ce9-44e8-acd7-d8882d252d00.png) **對於二次多項式,每個相鄰的 x 所對應的一次差分之差仍然都是一個常數**,我們可以匯出這一常數的通用公式: ![](https://imgkr.cn-bj.ufileos.com/092b4e0d-8497-4ced-befc-871447044e7f.png) 在上述例子中,`a = 15`,故二次差分常數 `2a` 即為 `30`。 差分規律是一項偉大的發現,有了差分,在計算多項式時就可以 **用加法替代乘法**,我們只需要算出幾個初始值,後面對於任意 x 所對應的 F(x) 均可以通過加法得出: ![](https://imgkr.cn-bj.ufileos.com/aab5a6c7-4e9e-495a-bc74-f5104974796b.png) 學過高數的朋友應該知道,**一個函式在滿足一定條件的情況下可以用多項式逼近** *(冪級數展開)*,於是常用的三角函式、對數函式都可以通過多項式來計算的,而機械時期的計算裝置最擅長的就是做加法,有了差分思想,巴貝奇看到差分機的前途一片光明。 ![冪級數展開 - 即使現在計算機也是沿用這樣的方式進行計算](https://imgkr.cn-bj.ufileos.com/3e02f15a-21b4-48c6-a243-feddd4d2c56e.png) ## 完成一半的差分機(Difference Engine) 從 `1812` 年到 `1822` 年,巴貝奇克服重重困難完成了一臺可以計算六位數二次多項式的模型機,他給皇家學會的主席寫信,希望政府可以出資,贊助他建造真正可用的大型差分機。政府也覺得這事兒很有意義,尤其對海軍很有價值,於是在 `1823` 年撥款 `1500` 英鎊,巴貝奇如魚得水,號稱只要兩三年時間就能完工。 誰知實行起來要比想象中困難得多,那個時代的機械製造水平實在落後,差分機是十分精密的儀器,巴貝奇跑遍了歐洲都沒找到多少能用的零件,於是在製造差分機之前,他還要先想著怎麼製造各類零件。 在英國當時一個牛逼的機械師 **克萊門特** *(Joseph Clement)* 的幫助下,他們真的在提高機械製造方面下足了功夫,不但做出了差分機能用的零件,還培養出大批優秀的技師。本來這兩人強強聯合勢必能把差分機做好,但是巴貝奇是個精益求精的人,經常改動設計方案,導致工程時常要返工,工作量大大增加,外加親人的相繼去世,後來又和克萊門特鬧掰,到了 `1833` 年,十年都過去了,巴貝奇只做出了機器的一小部分,卻已經花費了 `3` 萬英鎊 *(遠超最初預算)*。政府對巴貝奇大失所望,終於在 `1842` 年正式宣佈不再出資,到頭來巴貝奇給後世留下的就只有一個半成品,以及在 `1839` 年修訂好的一大堆設計圖紙,現存於倫敦科學博物館。 ![倫敦科學博物館·差分機設計圖紙&半成品](https://imgkr.cn-bj.ufileos.com/88aee7f7-453a-4ecd-ae7a-7f37e0eba90b.png) 值得一提的是,巴貝奇做不出差分機實在不是客觀原因所致,與他同時代的瑞典人 **喬治·舒茨** *(Per Georg Scheutz)* 就根據他的設計在 `1843` 年做出了切實能用的差分機,巴貝奇倒是提供了不少指導和幫助,也算是了卻了自己一樁心願吧。 ![喬治·舒茨和他的差分機](https://imgkr.cn-bj.ufileos.com/af7b8c40-5c8b-47e6-8c10-21634219a0ff.png) `150` 年後,為了紀念巴貝奇 `200` 年誕辰,從 `1989` 到 `1991` 年人們根據巴貝奇的設計圖紙建造了第一臺真正的巴貝奇差分機,機器完美執行,工程師們驚奇地發現,巴貝奇的圖紙裡只有極少的錯誤,而且這些錯誤八成是當時為防止圖紙被盜用而刻意為之的。這臺差分機被保護在倫敦科學博物館的玻璃櫃裡,後來又造了一臺,放在美國矽谷的計算機歷史博物館,每天由導遊給參觀者講解和演示,人們得以近距離膜拜。 ![倫敦科學博物館·史上第一臺巴貝奇差分機](https://imgkr.cn-bj.ufileos.com/1db5fae7-2318-4b6e-879b-acc8e83063fe.png) ## 差分機的工作原理簡析 在巴貝奇 `1839` 年的設計中,差分機可以支援七次多項式的計算。由於每次參與計算的都是函式值和 1~7 次差分值的最新值,於是僅需響應的 `8` 個計數器。巴貝奇設計的計算器由 `31` 個計數輪垂直疊加而成,即支援 `31` 位十進位制數: ![](https://imgkr.cn-bj.ufileos.com/1e248d79-32c9-4b22-9cf2-3abc0ce03064.png) 加上傳動裝置和進位裝置,就成了這樣一幅喪心病狂的樣子: ![](https://imgkr.cn-bj.ufileos.com/9fbadf85-021e-4a4f-8515-77d8f7c9c0ec.png) 巴貝奇使用梯形的傳動輪實現兩個計數輪之間的相加,由於有梯形齒,傳動輪可以同時帶動兩個計數輪,也可以只帶動一個。於是在進行兩數相加時,傳動輪先順時針旋轉,將右側計數輪上的數字加到左側輪上,而後上升一段距離,逆時針旋轉相同度數,將右側計數輪的示數還原到原來的位置。 ![圖示:3 + 4,加完之後右側計數輪數字歸零了,需要靠傳動輪將其還原為 4](https://imgkr.cn-bj.ufileos.com/3dcf26ed-7a3d-4816-9e84-d90ea81413e0.webp) 仔細觀察可以發現,這兩個輪子上的數字排列順序是相反的。在兩輪相加的過程中,左側輪作為累加輪朝數值增大的方向旋轉,而右側輪作為加數輪則朝數值減少方向旋轉。在巴貝奇改進的並行差分演算法中,兩個步驟交替進行,同一個計數輪需要交替充當累加輪和加數輪的角色,於是當機器執行起來,這些齒輪需要正反方向交替旋轉。 ![](https://imgkr.cn-bj.ufileos.com/3bf63da4-a6a6-4080-9511-5f8b5e627531.webp) **差分機的進位機構比較複雜**,簡單地說,每個計數輪都有一個針對高位的 **“進位提示器”**,當計數輪從 `9` 轉到 `0`,其對應的 **“進位提示器”** 就被撥到 **“需要進位”** 的狀態,每次計算,計數輪都要轉動兩次,第一次是每位數相加,第二次是按照“進位提示器”進行進位。我們直觀地感受一下連續進位是什麼樣子: ![](https://imgkr.cn-bj.ufileos.com/20fe8753-84a1-4e00-8fc8-c2bffc8f9b17.webp) 最後我們來欣賞一下差分機整個執行起來的樣子: ![](https://imgkr.cn-bj.ufileos.com/1ffb53c2-319d-4e59-b027-ab75ea27d077.webp) 還有另外一個適用樂高還原的硬核版本: ![](https://imgkr.cn-bj.ufileos.com/4cd2a399-4571-40c2-9afe-69976f2be25c.webp) >
如果對這一部分感興趣的童鞋請進一步閱讀原版文章:[現代計算機真正的鼻祖——超越時代的偉大思想](https://www.jianshu.com/p/5d739419b93d) # 三、分析機 | 第一臺真正意義上的 Computer 儘管沒能親手實現差分機,但巴貝奇並不會氣餒,或者說他本來就是根本停不下來的那種人。明知實現不了,巴貝奇仍在一刻不停地改進著自己的設計,直到有一天,他構思出了一種空前的機器——分析機,正式成為現代計算機史上的第一位偉大先驅。 *(Father of computing)* `1834` 年,分析機概念誕生之際,巴貝奇自己都為之感到無比震驚。在此之前,任何一臺計算機器都只能完成其被預定賦予的計算任務,要麼是簡單的加減乘除,要麼像差分機那樣只能做差分運算,它們都屬於 `calculator`,而分析機才是真正的 `computer`,它不侷限於特定功能,而竟然是可程式設計的,可以用來 **計算任意函式**——現代人無論如何也無法想象在一坨齒輪上寫程式是怎樣一種體驗吧! 巴貝奇設計的分析機主要包括三大部分: 1. 用於儲存資料的計數裝置,巴貝奇稱之為 **“倉庫”(store)**,相當於現在 **CPU 中的儲存器**,這部分是從差分機上的計數裝置改進而來的,我們很容易想象它的模樣; 2. 專門負責四則運算的裝置,巴貝奇稱之為 **“工廠”(mill)**,相當於現在 **CPU 中的運算器**,這部分的結構相對複雜,巴貝奇針對乘除法還做了一些優化; 3. 控制操作順序、選擇所需處理的資料和輸出結果的裝置,巴貝奇沒有起名字,由於其呈桶狀,我們可以叫它 **“控制桶”**,控制桶顯然相當於現在 **CPU 中的控制器**。 以上三部分,加上巴貝奇並沒有疏漏的輸入輸出裝置,我們驚訝地發現,**分析機的組成部分和現在馮·諾依曼架構所要求的五大部件一模一樣!** 巴貝奇另一大了不起的創舉就是將 **穿孔卡片(punched card)** 引入了計算機器領域,用於控制資料輸入和計算,從那時起,到第一臺電子計算機誕生為止,期間幾乎所有的數字計算機都使用了穿孔卡片。 ![穿孔卡片的提花原理](https://imgkr.cn-bj.ufileos.com/c37e528f-91fa-46d3-b55e-42f7fd92f3af.png) 巴貝奇在一次巴黎展覽會上看到了賈卡的提花機,對其印象十分深刻,由於一直在研究計算機器,自然想到可以把穿孔卡片也應用到分析機上。於是分析機中的輸入資料、儲存地址、運算型別都使用穿孔卡片來表示。在機器執行時,卡片上有孔和無孔的地方會導致對應的金屬桿執行不同操作,可程式設計性由此體現。下圖可以直觀地展現這一原理: ![無孔的地方會頂住探針](https://imgkr.cn-bj.ufileos.com/f1b4d898-a3a2-43f6-8bf2-df82fcc93789.webp) 整個分析機就是在類似這樣的齒輪和拉桿作用下實現可程式設計運算的:先從資料卡片讀入資料到儲存器,再將儲存器中的資料傳輸到運算器,運算器算完後又將資料傳回儲存器。 可惜的是,巴貝奇窮其一生也沒能真正把分析機做出來,留給後世的又是一臺模型機和兩千多張圖紙,以及這樣一段遺言: >
如果一個人不因我一生的借鑑而卻步,仍然一往直前製成一臺本身具有全部數學分析能力的機器……那麼我願將我的聲譽毫不吝嗇地讓給他,因為只有他能夠完全理解我的種種努力以及這些努力所得成果的真正價值。 ![倫敦科學博物館·分析機設計圖紙&模型機](https://imgkr.cn-bj.ufileos.com/64359a29-c88b-4eea-b413-71ef76066058.png) 可以說,巴貝奇一生的奮鬥都是孤獨的,在那個年代,人們看不到分析機的巨大價值和意義,有了先前差分機的失敗,政府也不再願理會分析機的想法。巴貝奇的思想超前了整整一個世紀,但慶幸的是在有生之年,依然有著三位難能可貴的支持者: 1. 首先是他的兒子 **亨利·巴貝奇** *(Henry Prevost Babbage)*,直到巴貝奇過世後,亨利也繼續著分析機的建造工作,但終究也力不從心未能完成; 2. 而後是後來成為了義大利總理的數學家 **閔那布利** *(Luigi Federico Menabrea)*,他在巴貝奇 `1840` 年演講時詳細記錄下了分析機的思想; 3. 最後就是著名詩人拜倫的女兒,史上大名鼎鼎的 **女程式設計師艾達** *(Ada Lovelace)*,她將閔那布利記錄分析機的文章翻譯成英文,巴貝奇建議她在翻譯時增添一些自己的理解,結果艾達註解的長度是原文的兩倍,其中針對計算伯努利數的演算法被視為史上第一個計算機程式,這篇名為《關於巴貝奇先生髮明的分析機簡訊》的譯文被視為程式設計方面的第一篇著作,而 **艾達本人則成了世界上第一位程式設計師**。 ![艾達和她的伯努利數程式](https://imgkr.cn-bj.ufileos.com/e7f550f8-c900-4f61-9546-61d990de5137.png) 艾達幾乎是那個時候唯一一個真正理解分析機的人,她不僅編寫了許多可以在分析機上執行的程式,甚至還看到了巴貝奇自己都沒有看到的事情——她說:分析機不光能用來計算,它應該還能用來表示其他東西,比如音樂。這是多麼遠大的目光啊!**後來美國國防部將一種程式語言命名為 `Ada`**,就是為了紀念這位與巴貝奇同樣具有超前思想的偉大女性。 # 四、製表機 | 穿孔時代的到來 從 `1790` 年開始,美國每 `10` 進行一次人口普查。百年間,隨著人口繁衍和移民的增多,從 `1790` 年的 `400` 萬不到,到 `1880` 年的 `5000` 多萬,人口總數呈爆炸式地增長。 ![1790~1880 年美國人口增長曲線](https://imgkr.cn-bj.ufileos.com/13b449e7-4877-40a8-8f2a-c89dbbed7a36.png) 不像現在這個的網際網路時代,人一出生,各種資訊就已經電子化、登記好了,甚至還能資料探勘,你無法想象,在那個計算裝置簡陋得基本只能靠手搖進行四則運算的 `19` 世紀,千萬級的人口統計就已經成了當時政府的 **“不能承受之重”**。`1880` 年開始的第 `10` 次人口普查,歷時 `8` 年才最終完成,也就是說,他們在休息兩年之後就要開始第 `11` 次普查了,而這一次普查,需要的時間恐怕要超過 `10` 年,那第 `12` 次、`13` 次呢?本來就是 `10` 年一次的統計,如果每次耗時都在 `10` 年以上,這件事情就變得沒有意義了。 這可愁煞了當時的人口調查辦公室,他們決定面向全社會招標,尋求能減輕手工勞動、提高統計效率的發明。正所謂機會都是給有準備的人的,一位畢業於哥倫比亞大學的年輕人 **赫爾曼·霍爾瑞斯** *(Herman Hollerith)* 帶著他在 `1884` 年申請的專利從眾多方案中脫穎而出。 ![赫爾曼·霍爾瑞斯](https://imgkr.cn-bj.ufileos.com/21bf932c-79b3-4e51-8b9a-b24b56fe8af3.png) ## 製表機 他發明的機器叫 **製表機** *(tabulator/tabulating machine)*,顧名思義,就是專門用來製作資料統計表的機器。製表機主要由示數裝置、穿孔機、讀卡裝置和分類箱組成。 示數裝置包含 `4` 行、`10` 列共 `40` 個示數錶盤,每個盤面被均勻地分成 `100` 格,並裝有兩根指標,和鐘錶十分相像,“分針” 轉一圈可計 `100`,“時針” 轉一圈則計 `10000`。可見,整個示數裝置可以表達很龐大的資料。 ![](https://imgkr.cn-bj.ufileos.com/6b8ec168-40e8-4f18-836e-edcfad557121.png) 製表機的工作是圍繞穿孔卡片展開的:操作員先使用穿孔機制作穿孔卡片,再使用讀卡裝置識別卡片上的資訊,機器自動完成統計並在示數錶盤上實時顯示結果,最後,將卡片投入分類箱的某一格中,進行分類存放,以供下次統計使用。 ## 穿孔卡片的應用 此前的某一天,霍爾瑞斯正在火車站排隊檢票,目光不經意落到檢票員手中咔咔直響的打孔機上。他發現,檢票員會特意根據乘客的性別和年齡段,在車票的不同地方打孔。越來越多的人過檢,他進一步確認了這個規律。一個靈感朝他襲來:如果有一張更大的卡,上面有更多的位置可以打孔,就可以用來表示更多的身份資訊,包括國籍、人種、性別、生日等等。 這就是用在 `1890` 年人口普查中的穿孔卡片,一張卡片記錄一個居民的資訊。卡片設計長約 `18.73cm`,寬約 `8.26cm`,正好是當時一張美元紙幣的尺寸,因為霍爾瑞斯直接用財政部裝錢的盒子來裝卡片。 ![](https://imgkr.cn-bj.ufileos.com/94fde218-f3e1-4dbf-94ef-038eff047b97.png) 卡片設有 `300` 多個孔位,與雅卡爾和巴貝奇的做法一樣,靠每個孔位打孔與否來表示資訊。**儘管這種形式頗有幾分二進位制的意味,但當時的設計還遠不夠成熟,並沒有用到二進位制真正的價值**。舉個例子,我們現在一般用 `1` 位資料就可以表示性別,比如 `1` 表示男性,`0` 表示女性,而霍爾瑞斯在卡片上用了兩個孔位,表示男性就其中一處打孔,表示女性就在另一處打孔。其實性別還湊合,表示日期時浪費得就多了,`12` 個月需要 `12` 個孔位,而常規的二進位制編碼只需要 `4` 位。當然,這樣的侷限也與製表機中簡單的電路實現有關。 細心的讀者可能發現卡片的右下角被切掉了,那不是殘缺,而是為了避免放反而專門設計的,和現在的二維碼只有 `3` 個角是一個道理。 這類實用的細節設計在穿孔機上表現得更為出色。下圖為一位操作員正在使用穿孔機給卡片打孔的情景,她並不需要在卡片上吃力地搜尋孔位,而是直接對著孔距更大的操作面板打孔,一根槓桿將兩者的孔位一一對應。操作面板還做成了弧形,頗有一分如今人體工程學鍵盤的風姿。 ![](https://imgkr.cn-bj.ufileos.com/1ab3dc67-48fb-4374-9af8-45f113e339dc.png) 在製表機前,穿孔卡片(或紙帶)多用於儲存指令而不是資料。比較有代表性的,一是雅卡爾提花機,用穿孔卡片控制經線提沉;二是自動鋼琴,用穿孔紙帶控制琴鍵壓放。美劇《西部世界》中,每次故事迴圈的開始,都會給一個自動鋼琴的特寫,彈奏起看似寧靜安逸、實則詭異違和的背景樂。 是霍爾瑞斯將穿孔卡片作為 **資料儲存介質** 開來,並開啟了一個嶄新的 **資料處理紀元**。後來人們也把這類卡片稱為霍爾瑞斯卡片,穿孔卡片和穿孔紙帶作為輸入輸出載體,統治了計算領域整整一個世紀。 ## 統計原理 打好了孔,下一步就是將卡片上的資訊統計起來。讀卡裝置的組成如下圖所示,其外形和使用方式有點類似現在的重型訂書機,將卡片置於壓板和底座之間,按壓手柄,就完成了對這張卡片的資訊讀取。 ![](https://imgkr.cn-bj.ufileos.com/160216e1-7e0a-435a-b5dc-dc41a713cf3d.png) 原理上,通過電路通斷識別卡上資訊。底座中內嵌著諸多管狀容器,位置與卡片孔位一一對應,容器裡盛有水銀,水銀與導線相連。底座上方的壓板中嵌著諸多金屬針,同樣與孔位一一對應,針的上部抵著彈簧,可以伸縮,壓板的上下面由導電材料製成。**這樣,當把卡片放在底座上,按下壓板時,卡片有孔的地方,針可以通過,與水銀接觸,電路接通,沒孔的地方,針就被擋住**。 這一基本原理與雅卡爾提花機類似,不難理解。重頭戲是,**如何將電路通斷對應到所需要的統計資訊呢**?霍爾瑞斯在專利中給出了一個簡單的例子,如下圖所示。這是涉及性別、國籍和人種 `3` 項資訊的統計電路圖,虛線為控制電路,實線為工作電路。 ![](https://imgkr.cn-bj.ufileos.com/1b04ebfa-f0c9-4d55-9daa-9a7825137f6d.png) 圖頂有7根金屬針,從左至右標的分別是:G(類似於總開關)、Female(女)、Male(男)、Foreign(外國籍)、Native(本國籍)、Colored(有色人種)、White(白種人)。 工作電路中分散著標識為 **m1~m10** 的電磁繼電器。 圖底從右至左為標識為 **M1~M6** 的 `6` 組電磁鐵,所對應的統計資訊為(為貼合穿孔的形象,我特意選擇使用圓圈進行標記): ![](https://imgkr.cn-bj.ufileos.com/2e257ea4-7460-4236-887b-d18bcdaf667f.png) 以 **M1** 為例,如果表示 Native、White 和 Male 的針同時與水銀接觸,接通的控制電路: ![](https://imgkr.cn-bj.ufileos.com/b73f7b4c-04b5-4515-9c73-417845c46749.png) 這一示例首先展示了針 G 的作用,它把控著所有控制電路的通斷,目的有二: 1. 在卡片上留出一個專供 G 通過的孔,以防止卡片沒有放正(照樣可以有部分針穿過錯誤的孔)而統計到錯誤的資訊。 2. 令 G 比其他針短,或者 G 下的水銀比其他容器裡少,從而確保其他針都已經接觸到水銀之後,G 才最終將整個電路接通。眾所周知,電路通斷的瞬間容易產生火花,這樣的設計可以將此類元器件的損耗集中在 G 身上,便於後期維護。 不得不感慨,這些發明家做設計真的特別實用、細緻。 控制電路的接通引起圖中標有橘黃色箭頭的 `3` 個電磁繼電器 **m1** 、 **m3** 和 **m5** 閉合,進而接通 **M1** 所在的工作電路: ![](https://imgkr.cn-bj.ufileos.com/e995b8fb-cd40-479c-9f20-13787a6be982.png) 最終,通電的 **M1** 將產生磁場,牽引相關槓桿,撥動齒輪完成計數,最終體現到示數錶盤上指標的旋轉。雖然霍爾瑞斯的專利中沒有給出這一計數裝置的具體結構,可以想象,從 `17` 世紀開始,機械計算器中的齒輪傳動技術已經發展到足夠成熟的水平,霍爾瑞斯無需重新設計,完全可以使用現成的裝置,正如他在專利中所說的“any suitable mechanical counter”(任何合適的機械計數器都可以)。 **電磁鐵不單控制著計數裝置,還控制著分類箱蓋子的開合**。將分類箱上的電磁鐵接入工作電路,每次完成計數的同時,對應格子的蓋子會在電磁鐵的作用下自動開啟,熟練的操作員甚至不用轉頭去看,就可以順手將卡片投到正確的格子裡,由此完成卡片的快速分類。 每天工作的最後一步,就是將示數錶盤上的結果謄抄下來,置零,第二天繼續。 ![分類箱側檢視](https://imgkr.cn-bj.ufileos.com/d9ed2edb-c19c-46a3-bf41-ca8e67fb5974.png) ## 單元記錄時代 在製表機的高效運轉下,`1890` 年的人口普查只花了 `6` 年時間。`1896` 年,霍爾瑞斯成立製表機公司(The Tabulating Machine Company)並不斷改進自己的產品,先後與英國、義大利、德國、俄羅斯、澳大利亞、加拿大、法國、挪威、美國波多黎各、古巴、菲律賓等多個國家和地區合作開展了人口普查。 到 `1914` 年,製表機公司每天生產的穿孔卡片多達 `200` 萬張。不多久,一些競爭對手逐漸起家,歷史迎來了繁榮的資料處理時代。它們的產品也不再侷限於人口普查,逐漸擴充套件到會計、庫存管理等一些同樣需要跟大資料打交道的領域,這些機器作為製表機的後裔被統稱為單元記錄裝置(unit record equipment)。 圍繞穿孔卡片的制卡、讀卡、資料處理和卡片分類是它們的標準功能,穿孔機、讀卡器、分類器是它們的標準配置。這些部件的自動化程度越來越高,比如手動的讀卡裝置很快被自動讀卡機所取代,讀卡速度從每分鐘 `100` 張逐步提高至每分鐘 `2000` 張。隨著識別精度的提高,卡片的孔距也越來越小,具有 `80~90` 列孔位的卡片成為主流,有些卡片的孔位甚至多達 `130` 列。 ![20 世紀典型的 80 系穿孔卡片](https://imgkr.cn-bj.ufileos.com/5af8a964-b698-45ed-91ee-3fa2721f1938.png) 機器的功能也逐漸強大,不再只是簡單地統計穿孔數目,減法、乘法等運算能力陸續登場。`1928` 年,哥倫比亞大學的科學家們甚至用單元記錄裝置計算月球的執行軌跡,他們在 `50` 萬張卡片上打了 `2000` 萬個孔,彰顯著單元記錄裝置的無限潛力。 機器的電路實現越來越複雜,但同時也越來越通用。`1890` 年所用的那臺製表機的 **線路是固定的,遇到新的統計任務,改造起來十分麻煩。** `1906` 年,霍爾瑞斯便引入了接插線板(plugboard)——一塊佈滿導電孔的板卡,可通過改變導線插腳在板上的位置改變線路邏輯。試想一下,接插線板的內部已經布好了具有各種功能的線路,但它們都處在斷開狀態,各自連線著接插線板上的某兩個孔位,像一窩嗷嗷待哺的小鳥長大著嘴巴,外部的導線就像美味的蟲子,當蟲子的頭尾分別與小鳥的上喙和下喙接觸,線路就被導通,這隻小鳥就開始工作了。如此,每次使用就可以啟用不同的 “小鳥”,從而完成不同的任務。**這已經是一種可程式設計性的體現。** ![](https://imgkr.cn-bj.ufileos.com/9c19ca96-b6aa-4d54-a2ba-8ab4821a38b4.png) `1911` 年,製表機公司與另外 `3` 家公司合併成立 **CTR** 公司 *(Computing-Tabulating-Recording Company)*,製表機公司作為其子公司繼續運營到 `1933` 年。 `1924` 年,**CTR** 更名為 **國際商業機器公司**(**I**nternational **B**usiness **M**achines Corporation),就是現在大名鼎鼎的 **IBM** 公司。可見,在如今眾多年輕的 IT 公司中,擁有百年曆史的 IBM 是位當之無愧的前輩,它完整地參與和見證了整個現代計算機的發展史。IBM 保持了製表機公司在單元記錄市場的龍頭地位,到 `1955` 年,其每天生產的穿孔卡片多達 `7250` 萬張。 `1937` 年開始,單元記錄裝置逐步電子化,與電子計算機的界線漸漸模糊,並最終為後者讓路。隨著 `1976` 年 IBM 一型最核心的單元記錄產品的停產,短暫的單元記錄時代也宣告謝幕,它彷彿是電子計算時代來臨前的預演和鋪墊,許多設計被沿用下來,比如穿孔卡片和接插線板。 有趣的是,即使電子計算機逐漸普及,許多機構由於用慣了單元記錄裝置,遲遲不願更換,少數機構甚至一直用到了 `21` 世紀。 > 在翻閱資料的時候發現了一個特別有趣的談計算機發展是的簡書專欄,感興趣的童鞋可以進一步去閱讀:[傳送門](https://www.jianshu.com/nb/28009636) # 參考資料 1. [機織布、針織布和無紡布的概念介紹](https://www.sohu.com/a/163216426_660519) 1. [從織布機到計算機](http://zhongxue.hujiang.com/cy/yuwen/p43333/) 1. [記憶傳承,資訊永生(四)](https://songshuhui.net/archives/51079) 1. [織布機與計算機](http://blog.sciencenet.cn/blog-528739-903746.html) 1. [計算機發展的引路者——賈卡織機的前世今生](https://www.bilibili.com/video/BV1JE411x7eN?from=search&seid=2914951861463322720) 1. [布林與電腦——《科學月刊》](https://pansci.asia/archives/92736) 1. [Who is the father of the computer?](https://www.computerhope.com/issues/ch001335.htm) 1. [現代計算機真正的鼻祖——超越時代的偉大思想](https://www.jianshu.com/p/5d739419b93d) 1. [製表機:穿孔時代的到來](https://www.jianshu.com/p/49f23b77dced) > - 本文已收錄至我的 Github 程式設計師成長系列 **【More Than Java】,學習,不止 Code,歡迎 star:[https://github.com/wmyskxz/MoreThanJava](https://github.com/wmyskxz/MoreThanJava)** > - **個人公眾號** :wmyskxz,**個人獨立域名部落格**:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長! ![](https://imgkr.cn-bj.ufileos.com/ace97ed9-3cfd-425f-85e5-c1a1e5ca7d3f.png) 非常感謝各位人才能 **看到這裡**,如果覺得本篇文章寫得不錯,覺得 **「我沒有三顆心臟」有點東西** 的話,**求點贊,求關注,求分享,求留言!** 創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見!