看板 Gossiping作者 jserv (松鼠)標題 Re: [問卦] 在卡上打洞寫程式是什麼感覺時間 Fri Apr 23 06:37:27 2021
※ 引述《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 (臺灣)
※ 文章代碼(AID): #1WWVgqEt (Gossiping)
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1619131060.A.3B7.html
→ jserv: @Costco5566, 對不起,我的中文程度不夠好6F 04/23 06:47
※ 編輯: jserv (140.116.246.163 臺灣), 04/23/2021 06:49:56
→ jserv: @syldsk, 我每年都要寫論文,「文」組無誤11F 04/23 06:50
推 corel: 神人14F 04/23 07:02
推 tanby: 有神快拜 神都不用睡覺22F 04/23 07:16
推 GNFLAG: 長知識了 謝謝24F 04/23 07:21
推 tt7642: 都是中文,但是看某.....33F 04/23 07:33
推 Cireiat: 知識大爆發啦!好文37F 04/23 07:35
推 sd785: 科普文 推41F 04/23 07:38
推 Murloc: 哇 又一篇好文48F 04/23 07:44
→ rnmrn: 神啊55F 04/23 07:53
推 kobashi: 推薦此文章,學到了很多電腦發展的歷史59F 04/23 07:57
推 s87069: 釣出上古神獸62F 04/23 07:59
推 hengy: 推63F 04/23 08:00
推 acake: 現在不是80了72F 04/23 08:04
推 urmfo: 讚73F 04/23 08:05
推 BANDITCS: 謝謝老師,原來萬惡的80字元限制是這樣來的XD75F 04/23 08:07
推 q65: 認真推83F 04/23 08:09
推 roroccc: 為何這篇只有3X推84F 04/23 08:11
推 kudoe: 老師早91F 04/23 08:14
推 v7q4: 嗯!跟我想的差不多94F 04/23 08:14
→ hitmd: 凡人如我完全沒辦法想像打孔運作97F 04/23 08:16
推 mmarty: 看八卦長知識99F 04/23 08:18
推 kids9995: 老師這篇太早發了,這時間看文的比較少吧100F 04/23 08:18
推 magon: 好復古101F 04/23 08:19
推 e04bank: 八卦需要更多這種文章102F 04/23 08:19
推 ponponx: 謝謝大神!資訊爆炸啦!103F 04/23 08:19
推 Daiwa: God106F 04/23 08:21
推 Dvdoer: U文拜讀109F 04/23 08:24
推 nxupap: 講得很清楚115F 04/23 08:26
推 coburn: 老師您是教軟體還是教歷史的呢118F 04/23 08:27
推 Mozar: 推jserv大大124F 04/23 08:29
推 im31519: PTT真是神人一堆....127F 04/23 08:30
推 hit0123: 在學術電子佈告欄看到學術文章131F 04/23 08:32
推 kklo: 推137F 04/23 08:35
推 s0805744: 推 八卦需要更多這種文章138F 04/23 08:35
推 gamefox: 上課了同學,老師好~~~141F 04/23 08:35
推 shiwa: 好酷@@!!144F 04/23 08:38
推 bunnyer: 已經是系教授等級150F 04/23 08:39
推 ups: 神推155F 04/23 08:41
推 jospa: 趕快推一下,不然人家以為我是文組。157F 04/23 08:43
推 lpoijk: 我覺得80的限制該重新討論一下了 code review為了這80 有時候真的好煩啊161F 04/23 08:44
推 idletime: 我有生能見到活字典 真是感動166F 04/23 08:47
推 lolmap: 一定是機器人回覆的,怎麼可能都不用睡覺QQ169F 04/23 08:47
→ diiky: 推171F 04/23 08:48
推 shermantan: 完整的演進史、歷歷在目。
不知現在的計概還會教這些古董級的歷史嗎?175F 04/23 08:51
推 dongkee: 先推免得被發現我看不懂179F 04/23 08:52
推 izual: 老師好猛...180F 04/23 08:53
推 g1254501: 學過cobol 有夠擊敗的語言 原來如此185F 04/23 08:56
推 windqqr: 看 PTT 長知識188F 04/23 08:57
推 dodoju: 推大神!191F 04/23 08:58
推 missin: 2B鉛筆塗的電腦答案卡應該是類似概念192F 04/23 08:59
→ asidy: 又是你193F 04/23 09:00
推 mmx3259: 先推,這樣就表示我都懂 ==194F 04/23 09:01
推 yerym: 推推195F 04/23 09:01
→ rmn0920: FB 80 各大銀行現在還是用IBM大型主機199F 04/23 09:08
推 fouto: 長知識209F 04/23 09:13
推 miuya: 長知識212F 04/23 09:16
推 Brioni: 真.考古文216F 04/23 09:19
推 leoone: 打這麼長誰看的.....喔. 抱歉是jserv 老師 我乖乖看完218F 04/23 09:20
推 yjn: 每年都要寫論文,意思是走學術界的,搞不好是個教授等級了222F 04/23 09:22
推 xru03: 推223F 04/23 09:24
推 Deparic: 我沒有預料會在八卦看到這種等級的文章224F 04/23 09:24
推 achun3399: 老師的年代才有打洞...1980吧 時代進步神速226F 04/23 09:28
推 APC: 特推237F 04/23 09:34
推 dj533kevin: 難怪我的IDE整天說我太長,就是打孔機害的241F 04/23 09:38
推 savageg: 很厲害但老人臭都出來了243F 04/23 09:40
推 sses60802: 推....但是還是不懂 學程式學到現在還是爛爛的QAQ245F 04/23 09:41
--