Re: [問卦] 在卡上打洞寫程式是什麼感覺

八卦

4173971

: 看關鍵少數那些人學程式就是用卡打洞
: 打完後放進電腦讓它跑
: 這樣連印個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
he005046161樓大神先推 04/23 06:38
Costco55662樓阿鬼您還是講中文ㄅ… 04/23 06:39
mozume3樓有神快拜 04/23 06:44
s92340324樓等等補推 04/23 06:45
tsubasawolfy5樓漲姿勢了 04/23 06:47
本人6樓@Costco5566, 對不起,我的中文程度不夠好 04/23 06:47
johnhmj7樓 04/23 06:47
FlashGet8樓講的淺顯易懂 04/23 06:47
syldsk9樓文組 04/23 06:49
JoJo5610樓 04/23 06:49
本人11樓@syldsk, 我每年都要寫論文,「文」組無誤 04/23 06:50
zener51712樓哇~讚啦 04/23 06:53
james8035113樓 04/23 06:55
corel14樓神人 04/23 07:02
foxhero15樓老師早 04/23 07:03
ashs9222316樓推推 04/23 07:05
rickphyman4217樓老師起得真早 04/23 07:07
ayasedd18樓大神推 04/23 07:08
Luluemiko19樓先膜拜大神 04/23 07:12
platinum556620樓長知識了 04/23 07:14
amethystboy21樓 04/23 07:16
tanby22樓有神快拜 神都不用睡覺 04/23 07:16
holmes213623樓未看先推 04/23 07:19
GNFLAG24樓長知識了 謝謝 04/23 07:21
beinggood25樓 04/23 07:21
donation1226樓好懷念!我當年上計概老師也是教這個! 04/23 07:27
t2003121027樓老師早~ 04/23 07:29
step33028樓神奇 04/23 07:30
z8906229樓嗚嗚嗚 04/23 07:30
daemonshadow30樓 04/23 07:31