Re: [問卦] 在卡上打洞寫程式是什麼感覺
※ 引述《LaAc (深淵戰士)》之銘言:
: 看關鍵少數那些人學程式就是用卡打洞
: 打完後放進電腦讓它跑
: 這樣連印個Hello world都超難吧
: 如果不小心手殘少打什麼要debug484會瘋掉
: 有沒有卦?
剛好我需要跟學生解釋為何 Linux 核心原始程式碼的風格規範 [1] 中,限制一行至多
80 個字元,其典故跟「打孔卡」(punched card) 有關。
: The preferred limit on the length of a single line is 80 columns.
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 打孔卡機器的運作,和當時人們如何「寫」程式:
https://youtu.be/YnnGbcM-H8c
影片可見 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"。詳細資訊可見哥倫比亞大學的網站:
http://www.columbia.edu/cu/computinghistory/029.html
也許你會認為,IBM 029 型打孔機大概只在 1960 年代活躍,之後程式設計師就改用其他
輸入媒介,像是 UNIX 共同發明者 Ken Thompson 和 Dennis M. Ritchie [10] 在 1972
年於 DEC PDP-11 主機前,透過 teletyper (電傳打字機,可簡稱 TTY) 和主機互動的狀況:
https://www.bell-labs.com/usr/dmr/www/picture.html
上圖可見,Ken Thompson 似乎很成熟 (我不好意思說他少年老成),但他發展 UNIX 時僅
26 歲,而且他與身旁 Dennis Ritchie 協作的過程,沒用到螢幕或顯示器?!
1963 年麻省理工學院的科學記者採訪當時計算中心,並與 Fernando J. Corbató教授
對話,後者是世界上第一個分時多工作業系統 Compatible Time-Sharing System (CTSS)
的主導設計者,Corbató教授在 CTSS 獲得巨大成功後,帶領 MIT 團隊,和通用電氣及
Bell Labs 發展 MULTICS 作業系統,許多慣例和概念一路從 CTSS, MULTICS,到後來的
UNIX 作業系統。可參見以下短片:
https://youtu.be/Q07PhW5sCEk
在這部短片中,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:
https://www.kernel.org/doc/html/latest/process/coding-style.html
[2] Tabulating machine:
https://en.wikipedia.org/wiki/Tabulating_machine
[3] IBM 80-column format and character codes:
https://en.wikipedia.org/wiki/Punched_card#IBM_80-column_format_and_character_codes
[4] Herman Hollerith 的生平和事業,可見泛科學網站:
https://pansci.asia/archives/189683
[5] IBM System/360:
https://www.ibm.com/ibm/history/ibm100/us/en/icons/system360/
[6] IBM 029 Card Punch:
https://en.wikipedia.org/wiki/Keypunch#IBM_029_Card_Punch
[7] IBM 7090: https://en.wikipedia.org/wiki/IBM_7090
儘管 IBM 7090 是全球第一台電晶體計算機,但其二進位系統跟我們今日所見的電腦
有極大的差異,可參見拙作〈解讀計算機編碼〉:
https://hackmd.io/@sysprog/binary-representation
[8] Project Mercury: https://en.wikipedia.org/wiki/Project_Mercury
[9] IBM Standard Modular System:
https://en.wikipedia.org/wiki/IBM_Standard_Modular_System
[10] Dennis M. Ritchie 已在 2011 年離開人世,生前只在一間公司工作,直到退休,
即 Bell Labs。Ritchie 晚年十分低調。以至於在他離開這個世界時,不為眾人
所知,但他創造的 UNIX 作業系統和 C 語言,直接地改變我們所處的世界。
https://www.bell-labs.com/usr/dmr/www/
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.246.163 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1619131060.A.3B7.html
推
04/23 06:38,
2年前
, 1F
04/23 06:38, 1F
推
04/23 06:39,
2年前
, 2F
04/23 06:39, 2F
推
04/23 06:44,
2年前
, 3F
04/23 06:44, 3F
→
04/23 06:45,
2年前
, 4F
04/23 06:45, 4F
推
04/23 06:47,
2年前
, 5F
04/23 06:47, 5F
→
04/23 06:47,
2年前
, 6F
04/23 06:47, 6F
推
04/23 06:47,
2年前
, 7F
04/23 06:47, 7F
推
04/23 06:47,
2年前
, 8F
04/23 06:47, 8F
※ 編輯: jserv (140.116.246.163 臺灣), 04/23/2021 06:49:56
推
04/23 06:49,
2年前
, 9F
04/23 06:49, 9F
推
04/23 06:49,
2年前
, 10F
04/23 06:49, 10F
→
04/23 06:50,
2年前
, 11F
04/23 06:50, 11F
推
04/23 06:53,
2年前
, 12F
04/23 06:53, 12F
推
04/23 06:55,
2年前
, 13F
04/23 06:55, 13F
推
04/23 07:02,
2年前
, 14F
04/23 07:02, 14F
推
04/23 07:03,
2年前
, 15F
04/23 07:03, 15F
推
04/23 07:05,
2年前
, 16F
04/23 07:05, 16F
推
04/23 07:07,
2年前
, 17F
04/23 07:07, 17F
推
04/23 07:08,
2年前
, 18F
04/23 07:08, 18F
推
04/23 07:12,
2年前
, 19F
04/23 07:12, 19F
推
04/23 07:14,
2年前
, 20F
04/23 07:14, 20F
推
04/23 07:16,
2年前
, 21F
04/23 07:16, 21F
推
04/23 07:16,
2年前
, 22F
04/23 07:16, 22F
推
04/23 07:19,
2年前
, 23F
04/23 07:19, 23F
推
04/23 07:21,
2年前
, 24F
04/23 07:21, 24F
推
04/23 07:21,
2年前
, 25F
04/23 07:21, 25F
推
04/23 07:27,
2年前
, 26F
04/23 07:27, 26F
推
04/23 07:29,
2年前
, 27F
04/23 07:29, 27F
推
04/23 07:30,
2年前
, 28F
04/23 07:30, 28F
推
04/23 07:30,
2年前
, 29F
04/23 07:30, 29F
推
04/23 07:31,
2年前
, 30F
04/23 07:31, 30F
推
04/23 07:33,
2年前
, 31F
04/23 07:33, 31F
推
04/23 07:33,
2年前
, 32F
04/23 07:33, 32F
推
04/23 07:33,
2年前
, 33F
04/23 07:33, 33F
推
04/23 07:34,
2年前
, 34F
04/23 07:34, 34F
推
04/23 07:34,
2年前
, 35F
04/23 07:34, 35F
推
04/23 07:34,
2年前
, 36F
04/23 07:34, 36F
推
04/23 07:35,
2年前
, 37F
04/23 07:35, 37F
推
04/23 07:36,
2年前
, 38F
04/23 07:36, 38F
還有 353 則推文
推
04/23 13:55,
2年前
, 392F
04/23 13:55, 392F
推
04/23 14:04,
2年前
, 393F
04/23 14:04, 393F
推
04/23 14:15,
2年前
, 394F
04/23 14:15, 394F
推
04/23 14:30,
2年前
, 395F
04/23 14:30, 395F
推
04/23 14:50,
2年前
, 396F
04/23 14:50, 396F
推
04/23 15:04,
2年前
, 397F
04/23 15:04, 397F
→
04/23 15:05,
2年前
, 398F
04/23 15:05, 398F
推
04/23 15:16,
2年前
, 399F
04/23 15:16, 399F
推
04/23 15:37,
2年前
, 400F
04/23 15:37, 400F
推
04/23 15:47,
2年前
, 401F
04/23 15:47, 401F
推
04/23 16:00,
2年前
, 402F
04/23 16:00, 402F
推
04/23 16:12,
2年前
, 403F
04/23 16:12, 403F
推
04/23 16:13,
2年前
, 404F
04/23 16:13, 404F
→
04/23 16:29,
2年前
, 405F
04/23 16:29, 405F
推
04/23 16:40,
2年前
, 406F
04/23 16:40, 406F
推
04/23 16:51,
2年前
, 407F
04/23 16:51, 407F
推
04/23 16:53,
2年前
, 408F
04/23 16:53, 408F
推
04/23 17:08,
2年前
, 409F
04/23 17:08, 409F
推
04/23 17:32,
2年前
, 410F
04/23 17:32, 410F
推
04/23 17:55,
2年前
, 411F
04/23 17:55, 411F
推
04/23 17:57,
2年前
, 412F
04/23 17:57, 412F
推
04/23 18:27,
2年前
, 413F
04/23 18:27, 413F
推
04/23 18:36,
2年前
, 414F
04/23 18:36, 414F
推
04/23 19:04,
2年前
, 415F
04/23 19:04, 415F
推
04/23 19:07,
2年前
, 416F
04/23 19:07, 416F
推
04/23 19:19,
2年前
, 417F
04/23 19:19, 417F
推
04/23 20:12,
2年前
, 418F
04/23 20:12, 418F
推
04/23 21:13,
2年前
, 419F
04/23 21:13, 419F
推
04/23 21:22,
2年前
, 420F
04/23 21:22, 420F
推
04/23 21:26,
2年前
, 421F
04/23 21:26, 421F
推
04/23 23:29,
2年前
, 422F
04/23 23:29, 422F
→
04/23 23:39,
2年前
, 423F
04/23 23:39, 423F
推
04/24 01:58,
2年前
, 424F
04/24 01:58, 424F
推
04/24 03:27,
2年前
, 425F
04/24 03:27, 425F
推
04/24 03:49,
2年前
, 426F
04/24 03:49, 426F
推
04/24 05:38,
2年前
, 427F
04/24 05:38, 427F
→
04/24 05:38,
2年前
, 428F
04/24 05:38, 428F
推
04/24 07:48,
2年前
, 429F
04/24 07:48, 429F
推
04/24 08:22,
2年前
, 430F
04/24 08:22, 430F
推
04/24 21:46,
2年前
, 431F
04/24 21:46, 431F
討論串 (同標題文章)