: 打完後放進電腦讓它跑
: 這樣連印個Hello world都超難吧
: 如果不小心手殘少打什麼要debug484會瘋掉
: 有沒有卦?
剛好我需要跟學生解釋為何 Linux 核心原始程式碼的風格規範 [1] 中,限制一行至多
80 個字元,其典故跟「打孔卡」(punched card) 有關。
1890 年代,美國人口普查就使用新發明的穿孔卡及機器,僅用 6 週就完成統計,對比
1880 年代全人工進行的普查,歷時 8 年。這個劃時代的發明出自德裔美籍的 Herman
Hollerith,後者以打孔卡技術,建構出打孔卡片製表機 (Tabulation Machine) [2],
由於美國人口普查的成功,他創立名為 Tabulating Machine Company 的新事業 [4],
向全世界的人口統計局兜售自家的產品,並成功獲得多國採納,1911 年,華爾街的金融
大亨 Charles Ranlett Flint 買下 Herman Hollerith 創立的 Tabulating Machine
Company,將其併入到 CTR (Computing Tabulating Recording) 公司,著眼於大量的
打孔卡背後巨量的資料處理。
因 CTR 公司經營不善,業務一直停滯,於是 Flint 在 1914 年雇用 Thomas J. Watson
來扭轉業績。
> Thomas J. Watson 在 1943 年有句名言:
> "I think there is a world market for maybe five computers."
此前 Watson 曾因壟斷罪而吃了一年牢飯,瞧不起 Watson 的 CTR 董事會
只讓他擔任職務不大的經理,不過 Watson 忍辱負重,不僅使 CTR 業績成長,最終成為
該公司實際的經營者,然後就是人們熟知的 IBM 公司。Watson 到 CTR 任職的第一件事
是向銀行貸款 5 萬美元 (相當於今日的 134 萬美元!),採用出租機器的嶄新銷售手法,
刺激業務量。1914 年 Watson 長子 Thomas Watson Jr. (IBM 的第二任總裁) 出生,也
是第一次世界大戰的起點,儘管主要戰場在歐洲,但列強的相互牽制下,美國無法脫身,
而戰爭結束時,製表需求激增,幾乎每間大型保險公司和鐵路公司都用得到 CTR 公司的
打孔卡片製表機器,1919 年 CTR 公司的營業額高達 1300 萬美元。1924 年,身為 CTR
公司總經理的 Watson 將公司更名為 IBM,打孔卡相關的產品持續改變這世界。
1928 年,IBM 發明 80 欄、12 列格式的矩形孔卡片 [3],是用耐溼、耐皺、又耐熱的
絕緣質料紙張製成,長 7 又 3/8 吋、寬 3 又 1/4 吋,以美國壹圓紙鈔的尺吋為準,
每張卡片的每欄代表一個文字、數字或特殊符號,12 列的排列順序由上而下,其中卡片
下端的 0 到 9 共 10 列,稱為數字打孔位置,凡在數字位置上打孔就代表該數字。卡片
上端的 0, 11, 12 等三列稱為區域打孔位置,為打英文字母或特殊符號時配合之用。
這個 IBM 發明的格式很快就成為業界標準,且伴隨著該公司在電腦主機的成功,使得
早期的電腦普遍採用事先透過打孔機已輸入資訊的打孔卡,當做電腦程式和資料的主要
輸入媒介,這也是為何年紀偏長的人會回憶「寫程式到打孔卡」,因為打孔卡就是當時
業界標準的輸入媒介,而為何把 programming 稱為「寫」程式呢?因為早期的程式開發
者需要事先謄寫程式碼和資料在紙上,交付給電腦中心的人員,批次透過人工操作打字
機式的鍵盤,將前述程式碼和資料「輸入」到打孔卡。
IBM 的打孔卡格式是業界標準的事實,使得 80 欄這樣的打孔卡寬度限制,成為蟄伏在
電腦演化過程中的「枷鎖」,就算今日我們用了更大更好更漂亮的電腦螢幕,當我們啟動
終端機 (Terminal) 視窗時,仍會見到 80 個字元寬度的預設值。
我們來觀賞以下短片,感受 IBM 打孔卡機器的運作,和當時人們如何「寫」程式:
影片可見 IBM 029 型打孔機 [6]。1964 年 IBM 銷售 System/360 大型電腦 [5],一度
壟斷大型電腦市場,而 IBM 029 型打孔機則伴隨 System/360 主機,作為配件銷售。
電影《關鍵少數》(Hidden Figure) 讓世人理解在 1960 年代,"computer" 一詞指真的
負責計算 (compute) 的人,這群英雄負責替工程師計算驗證複雜的數學算式。此外,這
部電影也讓我們看到,幫助美國太空總署 (NASA) 在美蘇冷戰時期,完成首次太空船載人
繞行地球任務 (Project Mercury [8]) 的另一功臣:IBM 7090 處理器 [7],後者也是
全球第一台電晶體計算機,每秒可執行 229,000 道運算,亦是大型主機的始袓。以農神
火箭實際發射登月太空船之前,NASA 已利用 IBM 7090 執行過數千次的模擬飛行,在
1969 年,NASA 更以五套 IBM System/360 執行任務控管,使得阿波羅 11 號成功得以
成功地執行登月任務。
IBM 029 型打孔機搭配 Standard Modular System (SMS) 卡 [9] 時,可做到當時非常
先進的功能,像是數字區自動填補左側的 0 —— 當設定數字區域長度為 6 欄時,打孔
機操作員只要輸入 "43",打孔機就會自動填充起始位置開頭的 4 個 '0',於是最終輸出
"00043"。詳細資訊可見哥倫比亞大學的網站:
也許你會認為,IBM 029 型打孔機大概只在 1960 年代活躍,之後程式設計師就改用其他
輸入媒介,像是 UNIX 共同發明者 Ken Thompson 和 Dennis M. Ritchie [10] 在 1972
年於 DEC PDP-11 主機前,透過 teletyper (電傳打字機,可簡稱 TTY) 和主機互動的狀況:
上圖可見,Ken Thompson 似乎很成熟 (我不好意思說他少年老成),但他發展 UNIX 時僅
26 歲,而且他與身旁 Dennis Ritchie 協作的過程,沒用到螢幕或顯示器?!
1963 年麻省理工學院的科學記者採訪當時計算中心,並與 Fernando J. Corbató教授
對話,後者是世界上第一個分時多工作業系統 Compatible Time-Sharing System (CTSS)
的主導設計者,Corbató教授在 CTSS 獲得巨大成功後,帶領 MIT 團隊,和通用電氣及
Bell Labs 發展 MULTICS 作業系統,許多慣例和概念一路從 CTSS, MULTICS,到後來的
UNIX 作業系統。可參見以下短片:
在這部短片中,Corbató教授談及過往批次處理系統的限制,並快速回顧電腦運作原理及
如何實作分時多工、依據優先權進行排程等等,是此,電腦猶如電話交換機,同時為多個
使用者所操作,每位使用者都能依據需求使用終端機,存取到運算和儲存資源,不會和
其他使用系統的人有所衝突。另外,也不難從影片中看到形似打字機、可和電腦對話互動
的裝置,那就是 TTY —— 早期的電腦沒有配備螢幕,而是透過 TTY,藉由訊號連線,
建立人機互動的終端機 (console),現在受到 UNIX 影響的作業系統,像是 Linux 和
macOS,都保有 tty 子系統,其名稱和功能就來自 teletype —— 存在 50 年以上的
「活化石」。
值得注意的是,TTY 和打孔卡幾乎一樣古老,且 1970 年代,程式設計師仍用打孔卡作為
程式和資料輸入的媒介,配合批次任務的執行,畢竟物美價廉的儲存設備還不存在,打孔
卡還是持續風行。TTY 適合「線上」(指操作員和電腦主機連線互動) 操作,而打孔卡則
適合程式設計師「線下」撰寫程式碼和準備資料。
打孔卡對程式設計的影響不可小覷,甚至讓 COBOL 和 FORTRAN 這樣早期的程式語言,
需要特別考慮到標誌 (labeling) 在特定位置的作用。1960 年代,打孔卡不僅沒專用
的編號 (試想要是操作員將這些卡片散落一地,該如何正確地重排呢?),也沒浮水印,
於是用於 COBOL 程式的打孔卡會將最後的 8 欄保留給標誌使用,以決定卡片間的順序,
卡片中間還特別設計其他標誌,判斷是否用二張或更多卡片來表達單一敘述 (即今日程式
設計常見的跨行程式敘述)。FORTRAN 程式語言也有類似的考量,該語言發明的年代還
沒有今天我們意義上的鍵盤與螢幕,程式碼必須使用打孔機,於是特定的欄位和行也被
保留為識別用途。
[1] Linux kernel coding style:
[2] Tabulating machine:
[3] IBM 80-column format and character codes:
[4] Herman Hollerith 的生平和事業,可見泛科學網站:
[5] IBM System/360:
[6] IBM 029 Card Punch:
[7] IBM 7090:
儘管 IBM 7090 是全球第一台電晶體計算機,但其二進位系統跟我們今日所見的電腦
有極大的差異,可參見拙作〈解讀計算機編碼〉:
[8] Project Mercury:
[9] IBM Standard Modular System:
[10] Dennis M. Ritchie 已在 2011 年離開人世,生前只在一間公司工作,直到退休,
即 Bell Labs。Ritchie 晚年十分低調。以至於在他離開這個世界時,不為眾人
所知,但他創造的 UNIX 作業系統和 C 語言,直接地改變我們所處的世界。
--