IBM 029 型打孔機
IBM 029 型打孔機在 1964 年作為 IBM 的 System/360 大型電腦的配件發售的。System/360 是計算系統與外設所組成的一個系列,在 20 世紀 60 年代晚期,它幾乎壟斷了整個大型計算機市場。就像其它 System/360 外設一樣,029 型打孔機也是個大塊頭。那時,計算機和傢具的界限還很模糊,但 029 型打孔機可不是那種會佔領你的整張桌子的機器。它改進自 026 型打孔機,增加了新的字元支持,如括弧,總體上也更加安靜。與前輩 026 型所展出 20 世紀 40 年代的圓形按鈕與工業化的樣貌相比,029 型的按鍵方正扁平、功能按鍵還有酷炫的藍色高亮提示。它的另一個重要買點是它能夠在 數字區 左側自動的填充 0 ,這證明了 JavaScript 程序員不是第一批懶得自己做 左填充 的程序員。(LCTT 譯註:這項功能需要額外的 4 張 標準模塊系統卡 才能使用。例如設置數字區域長度為 6 列時,操作員只需要輸入 73 ,打孔機會自動填充起始位置上的 4 個 0 ,故最終輸出 000073。更多信息)
等等!你說的是 IBM 在 1964 年發布了全新的打孔機?你知道那張在貝爾實驗室拍攝的 Unix 之父正在使用電傳打字機的照片嗎?那是哪一年的來著?1970?打孔機不是應該在 20 世紀 60 年代中期到晚期時就過時了嗎?是的,你也許會奇怪,為什麼直到 1984 年,IBM 的產品目錄中還會出現 029 型打孔機的身影 1 。事實上,直到 20 世紀 70 年代,大多數程序員仍然在使用打孔卡編程。其實二戰期間就已經有人在用電傳打字機了,可那時並沒能普及。客觀的講,電傳打字機幾乎和打孔卡一樣古老。也許和你想像的恰恰相反,並不是電傳打字機本身限制了它的普及,而是計算時間。人們拒絕使用電傳打字機的原因是,它是可交互的,它和計算機使用 「在線」的傳輸方式 。在以 Unix 為代表的分時操作系統被發明前,你和電腦的交互會被任何人的使用而打斷,而這一點延遲通常意味著幾千美元的損失。所以程序員們普遍選擇離線地使用打孔機編程,再將打孔卡放入大型計算機中,作為 批任務 執行。在那時,還沒有即廉價又可靠的存儲設備,可打孔卡的廉價優勢已經足夠讓它成為那時最流行的數據存儲方式了。那時的程序是書架上一摞打孔卡而不是硬碟里的一堆文件。
那麼實際使用 IBM 029 型打孔機是個什麼樣子呢?這很難向沒有實際看過打孔卡的人解釋。一張打孔卡通常有 12 行 80 列。打孔卡下面是從 1 到 9 的 數字行 ,打孔卡上的每一列都有這些行所對應的數字。最上面的三行是 空間行 ,通常由兩行空白行和一行 0 行組成。第 12 行是打孔卡最頂部的行,接下來是 11 行,隨後是從數字 0 到 9 所在的行。這個有點讓人感到困惑的順序的原因是打孔卡的上邊緣被稱為 12 邊 、下邊緣被稱為 9 邊 。那時,為了讓打孔卡便於整理,常常會剪去打孔卡的一個角。
(LCTT 譯註:可參考EBCDIC 編碼)
在打孔卡發明之初,孔洞的形狀是圓形的,但是 IBM 最終意識到如果使用窄長方形作為孔洞,一張卡就可以放下更多的列了。每一列中孔洞的不同組合就可以表達不同的字元。像 029 型這樣的擁有人性化設計的打孔機除了完成本質的打孔任務外,還會在打孔卡最上方列印出每一列所對應的字元。輸入是數字就在對應的數字行上打孔。輸入的是字母或符號就用一個在空間列的孔和一或倆個在數字列的孔的組合表示,例如字母 A 就用一個在第 12 空間行的空和一個數字 1 所在行的孔表示。這是一種順序編碼,在第一台打孔機被發明後,也叫 Hollerith 編碼。這種編碼只能表示相對較小的一套字符集,小寫字母就沒有包含在這套字符集中。如今一些聰明的工程師可能想知道為什麼打卡不幹脆使用二進位編碼 —— 畢竟,有 12 行,你可以編碼超過 4000 個字元。 使用 Hollerith 編碼是因為它確保在單個列中出現不超過三個孔。這保留了卡的結構強度。二進位編碼會帶來太多的孔,會因為孔洞過於密集而斷裂。
打孔卡也有不同。在 20 世紀 60 年代,80 列雖然是標準,但表達的方式不一定相同。基礎打孔卡是無標註的,但用於 COBOL 編程的打孔卡會把最後的 8 列保留,供標識數保存使用。這一標識數可以在打孔卡被打亂 (例如一疊打孔卡掉在地上了) 後用於自動排序。此外,第 7 列被用於表示本張打孔卡上的是否與上一張打孔卡一起構成一條語句。也就是說當你真的對 80 字元的限制感到絕望的時候,還可以用兩張卡甚至更多的卡拼接成一條長語句。用於 FORTRAN 編程的打孔卡和 COBOL 打孔卡類似,但是定義的列不同。大學裡使用的打孔卡通常會由其計算機中心加上水印,其它的設計則會在如 1976 年美國獨立 200 周年 的特殊場合才會加入。
最終,這些打孔卡都要被計算機讀取和計算。IBM 出售的 System/360 大型計算機的外設 IBM 2540 可以以每分鐘 1000 張打孔卡的速度讀取這些卡片 2 。IBM 2540 使用電刷掃過每張打孔卡,電刷通過孔洞就可以接觸到卡片後面的金屬板完成一次讀取。一旦讀取完畢,System/360 大型計算機就會把每張打孔卡上的數據使用一種定長的 8 位編碼保存,這種編碼是 擴增二進式十進交換碼 ,簡寫為 EBCDIC 編碼。它是一種二進位編碼,可以追溯自早期打孔卡所使用的 BCDIDC 編碼 —— 其 6 位編碼使用低 4 位表示數字行,高 2 位表示空間行。程序員們在打孔卡上編寫完程序後,會把卡片們交給計算機操作員,操作員們會把這些卡片放入 IBM 2540 ,再把列印結果交給程序員。那時的程序員大多都沒有見過計算機長什麼樣。
程序員們真正能見到的是很多打孔機。029 型打孔機雖然不是計算機,但這並不意味著它不是一台複雜的機器。看看這個由 密歇根大學 計算機中心在 1967 年製作的教學視頻,你就能更好的理解使用一台 029 型打孔機是什麼情形了。我會儘可能在這裡總結這段視頻,但如果你不去親自看看的話,你會錯過許多驚奇和感嘆。
029 型打孔機的結構圍繞著一個打孔卡穿過機器的 U 形軌道開始。使用打孔機時,右手邊也就是 U 形軌道的右側頂部是 進卡卡槽 ,使用前通常在裡面放入一疊未使用的打孔卡。雖然 029 型打孔機主要使用 80 列打孔卡,但在需要的情況下也可以使用更小號的打孔卡。在打孔機的使用過程中,打孔卡離開軌道右上端的進卡卡槽,順著 U 形軌道移動並最終進入左上端的 出卡卡槽 。這一流程可以保證出卡卡槽中的打孔卡按打孔時的先後順序排列。
029 型打孔機的開關在桌面下膝蓋高度的位置。在開機後,連按兩次 「 裝入 」 鍵讓機器自動將打孔卡從進卡卡槽中取出並移動到機器內。 U 形軌道的底部是打孔機的核心區域,它由三個部分組成:右側是等待區,中間是打孔操作區,左側是閱讀區。連按兩次 「裝入」 鍵,機器就會把一張打孔卡裝入打孔機的打孔操作區,另一張打孔卡進入等待區。在打孔操作區上方有一個列數指示器來顯示當前打孔所在的列的位置。這時,每按下一個按鍵,機器就會在打孔卡對應的位置打孔並在卡片的頂部列印按鍵對應的字元,隨後將打孔卡向左移動一列。如果一張卡片的 80 列全部被打上了數據,這張卡片會被打孔操作區自動釋放並進入閱讀區,同時,一張新的打孔卡會被裝入打孔操作區。如果沒有打完全部的 80 列,可以使用 「 釋放 」 鍵完成上面的操作。
在打孔卡上列印對應的字元這一設計讓人很容易分辨出錯誤。但就像密歇根大學的視頻中警告的那樣,打孔卡上修正一個錯誤可不像擦掉一個列印的字元然後再寫上一個新的那樣容易,因為計算機只會根據卡片上的孔來讀取信息。因為被打出的孔不能被 復原 ,所以並不能直接退回一列然後再打上一個新的字元。打出更多的孔也只能讓這一列的組合變成一個無效字元。IBM 029 型打孔機上雖然有一個可以讓打孔卡回退一列的退格按鍵,但這個按鍵被放置在機器上而非在鍵盤上。這樣的設計也許是為了阻止這個按鍵的使用,因為實際上很少有用戶需要這個功能。
實際上,只有廢棄錯誤的打孔卡再在新的打孔卡上重新打孔這一種修正錯誤的方式。這就是閱讀區的用武之處了。當你發現打孔卡上的第 68 列出錯時,你需要在新的打孔卡上小心的給前 67 列重新打孔,然後給第 68 列打上正確的字母。另一種操作方式是把帶有錯誤信息的打孔卡放在閱讀區,同時在打孔操作區載入一張新的打孔卡,然後按下 「 重複 」 按鍵直到列數指示器顯示 68 列。這時按下正確的字元來修正錯誤。閱讀區和重複按鍵使得 029 型打孔機很容易複製打孔卡上的內容。當然,這一功能的使用可能有各種各樣的原因,但改錯是最常見的。
(LCTT 譯註:有一種說法是「補丁」這個用於對已經發布的軟體進行修復的術語來源於對打孔紙帶或打孔卡上打錯的孔貼上補丁的做法。可能對於長長的一卷打孔紙帶來說,由於個別字母的錯誤而整個廢棄成本過高,會採用「補丁」的方式;而對於這種單張式的打孔卡來說,重新列印一張正確的更為方便。)
「重複」按鍵允許 029 型打孔機的操作員手動調用重複的函數。但是 029 型打孔機還可以設置為自動重複。當用於記錄數據而不是編程時,這項功能十分有效。舉個例子,當用打孔卡來記錄大學生的信息時,每張卡片上都需要輸入學生的宿舍樓的名字,如果發現所輸入信息的學生都在同一棟樓,就可以使用 029 型打孔機的自動重複功能來完成宿舍樓名稱的填寫。
像這樣的自動化操作可以通過 程序鼓 編程到 029 型打孔機裡面。程序鼓就安裝在打孔操作區上方的 U 形軌道中間部分的右上角。通過在打孔卡上寫下程序,然後把打孔卡裝入程序鼓中,就完成了一次給 029 型打孔機的編程任務。用戶可以通過這種方式對打孔卡的每一列都按需要定義不同的自動化操作。029 型打孔機允許指定某些列重複上一張打孔卡相同位置的字元,這就是它能更快的輸入學生信息的理由。它還允許指定某些列只能輸入數字或者字母,指定特定的列為空或者到某一列時就直接跳過一整張打孔卡。編程鼓使它在打孔特定列有特殊含義的固定模式卡片時很容易。密歇根大學製作的另一個進階教學視頻包括了給 029 型打孔機編程的過程,如果你已經掌握了它的基礎操作,就快去看看吧。
這會兒,無論你是否看了密歇根大學製作的視頻,都會感嘆打孔機的操作之簡便。雖然修正錯誤的過程很乏味,但除此之外,操作一台打孔機並不像想像的那樣複雜。我甚至可以想像打孔卡之間的無縫切換讓 COBOL 和 FORTRAN 程序員忘記了他們的程序是打在不同的打孔卡上而不是寫在一個連續的文本文件內。另一方面,思考一下打孔機是如何影響編程語言的發展也是很有趣的,雖然它僅僅是一台輸入設備。結構化編程最終會出現並鼓勵程序員把整個代碼塊視為一個整體,但可以想像打孔卡程序員們強調每一行的作用且難以認同結構化編程的場景。同時你能夠理解他們為什麼不把代碼塊閉合所使用的括弧放在單獨的一行,只是因為這樣會浪費打孔卡。
現在,雖然沒有人再使用打孔卡編程了,每個程序員都該試試這個,哪怕一次也好。或許你因此能夠更好的理解 COBOL 和 FORTRAN 的歷史,或許你就能體會到為什麼每個人把 80 個字元作為長度限制的標註。
喜歡嗎?這裡每兩周都會發表一篇這樣的文章。請在推特上關注我們 @TwoBitHistory 或者訂閱我們的 RSS,這樣你就能在第一時間收到新文章的通知。
via: https://twobithistory.org/2018/06/23/ibm-029-card-punch.html
作者:Two-Bit History 選題:lujun9972 譯者:wwhio 校對:wxy
- 「IBM 29 Card Punch,」 IBM Archives, accessed June 23, 2018, https://www-03.ibm.com/ibm/history/exhibits/vintage/vintage_4506VV4002.html. ↩
- IBM, IBM 2540 Component Description and Operation Procedures (Rochester, MN: IBM Product Publications, 1965), September 06, 2009, accessed June 23, 2018, http://bitsavers.informatik.uni-stuttgart.de/pdf/ibm/25xx/A21-9033-1_2540_Card_Punch_Component_Description_1965.pdf. ↩
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive