1946 ENIAC#
案發現場#
1946 年 2 月 14 日,美國賓州大學摩爾電機學院。一台重 27 噸、佔地 167 平方米、裝有約 17,468 支真空管、7,200 顆二極體、7 萬顆電阻、耗電 150 千瓦的龐然大物正式公開:ENIAC(Electronic Numerical Integrator and Computer,電子數值積分計算機)。
它的誕生場景是戰爭:陸軍彈道研究實驗室需要計算炮彈的射表——每張射表要算數千條彈道,用當時的機械微分分析儀或人工計算員(human computer,多是女數學家)算一條彈道要幾十秒到幾分鐘。戰爭逼出了計算需求的爆炸,而計算需求的爆炸孵出了電子計算機。
「案發現場」的理論基礎早已備好:圖靈(Alan Turing)1936 年的圖靈機理論已證明「通用計算機」在數學上可能;真空管技術(1897-湯姆生電子.md 以來的電子學)與雷達戰時催生的高速脈衝電路(1940-雷達.md)提供硬體基礎。理論、技術、需求三線匯合,只等戰爭點火。
偵查過程#
線索一:從機電到電子的跳躍。 設計者莫奇利(John Mauchly, 1907–1980)與埃克特(J. Presper Eckert, 1919–1995)的關鍵推理:機電繼電器每秒只能開合幾十次,真空管可以每秒幾萬次——速度差三個數量級。當時輿論嘲笑:一萬七千支真空管,每幾分鐘就會壞一支,機器永遠停機維修。埃克特的對策:把電壓降到遠低於額定值、讓真空管「半工作」,故障率暴跌——ENIAC 實測平均每兩天才壞一支管。這是工程判斷戰勝直覺懷疑的經典案例。
線索二:效能的偵查。 ENIAC 每秒執行約 5,000 次加法——比當時最快的機電計算機快千倍。人工計算員算一條彈道要 30 秒;ENIAC 只要一枚砲彈飛行時間還短:「它算得比砲彈飛得還快。」 一張射表從數週縮到幾小時。
線索三:程式設計的隱形偵探。 ENIAC 沒有儲存程式——「程式」要用插線與開關手動設定,換一道題要接線數天。實際完成接線與除錯的,是六位女性數學家(Bartik、Spence、Holberton、Meltzer、Lichterman、Jennings)——她們成為史上第一批「程式設計師」,卻在當時被當成「操作員」而隱形。這是科技史上著名的性別冤案之一,1990 年代起才被正名。
線索四:馮紐曼的下一步。 ENIAC 尚未完工,馮紐曼(John von Neumann)1945 年加入團隊,寫出「馮紐曼架構」:程式與資料存進同一個記憶體——EDVAC 報告成為此後七十年所有電腦的模板。戰後埃克特與莫奇利創辦公司量產 UNIVAC,電腦從軍用走向商用。
結案報告#
ENIAC 屬於迴路的技術⚙環節——戰爭計算需求(實驗端)孵出電子計算機,而電腦反過來成為一切理論與實驗的新工具,迴路升級的起點。其遺產:
- 計算成為第三種科學方法——繼理論、實驗之後,「計算模擬」成為科學的第三支柱;戰後氫彈設計、天氣預報、核反應堆模擬全部依賴電腦。
- 戰時總動員的副產品——與 1940-雷達.md、1945-原子彈.md 同源:戰爭把迴路轉速推到極限。
- 馮紐曼架構的七十年統治——儲存程式概念至今仍是所有電腦的基本設計,通往 1947-電晶體.md、1958-積體電路.md、1971-微處理器.md 的整條矽路。
- 程式設計師職業的誕生——六位女性接線員的正名冤案,提醒迴路的每一環都有被隱形的偵探。
證據與工具#
# 偵查證物:ENIAC 的速度帳本 —— 為什麼電子比機電快三個數量級
# 每秒操作次數對比
relays_per_sec = 50 # 機電繼電器
eniac_per_sec = 5000 # ENIAC 真空管
modern_per_sec = 1e12 # 現代晶片
print("--- 計算速度的三個數量級 ---")
print(f"機電繼電器:{relays_per_sec} 次/秒")
print(f"ENIAC:{eniac_per_sec} 次/秒(快 {eniac_per_sec/relays_per_sec:.0f} 倍)")
print(f"現代晶片:{modern_per_sec:.0e} 次/秒(比 ENIAC 快 {modern_per_sec/eniac_per_sec:.0e} 倍)")
# 射表時間帳本:一條彈道的人工 vs ENIAC
trajectories = 1800 # 一張射表的彈道數
human_sec = 30 # 人工計算員每條 30 秒
print(f"\n一張射表:人工 {trajectories*human_sec/3600:.0f} 小時,ENIAC 數分鐘")
# ENIAC 的零件帳本:為什麼它還能跑
tubes = 17468
mtbf_hours = 48 # 實測平均每兩天壞一支真空管
print(f"\nENIAC 真空管 {tubes} 支,平均故障間隔 {mtbf_hours} 小時")
print(f"每天故障約 {tubes/mtbf_hours:.1f} 支 → 降壓操作讓機器可維修運轉")