很多人在之前討論最早的計算機的文章中有這樣的回復(fù):
![]()
那么咱們今天就來扒一扒最早的計算機到底是個啥,這東西有哪些是現(xiàn)在的計算機不能企及的,又有哪些部分是現(xiàn)代計算機早已經(jīng)遠遠超越的。
![]()
首先要說的是——ENIAC作為世界上第一臺真正意義上的電子計算機,其工作原理和今天的計算機既有傳承,也有巨大差異。它并不是靠“存儲程序”來運行的,而是依賴上萬個真空管、繼電器和電纜,通過物理插接和開關(guān)配置來定義運算路徑。
![]()
早期,在ENIAC上編程主要是依靠線纜跳線來完成的,所以,在上面照片中并不是工作人員在維護ENIAC,而是在執(zhí)行真正的編程操作。
通常的情況下,ENIAC的計算程序設(shè)計會被先繪制在一張編程板上:
![]()
在解決一個計算問題的時候需要在這個板子上畫好了線路跨接路徑,定義好接線的次序和接線參數(shù)然后由操作員對照著紙上的連接提示把連接線相互連起來。
![]()
一旦連接線連接好了之后,ENIAC就可以通電走完整體的邏輯關(guān)系。實際上在單步計算上沒有現(xiàn)代計算機指令集的調(diào)用、沒有用到地址表、不需要進行復(fù)雜的尋址操作。因此它的計算速度會遠遠超過現(xiàn)代計算機。
但這并不意味著它整體算力超越現(xiàn)代計算機。原因很簡單:ENIAC沒有現(xiàn)代意義上的指令集和內(nèi)存尋址機制,它靠人工布線,每一次編程就是一次硬件重構(gòu),復(fù)雜邏輯和數(shù)據(jù)存取全都要靠外部輔助。所以要清楚一點——它的“快”只是單一算術(shù)電路并行觸發(fā)的結(jié)果,而不是系統(tǒng)性的性能優(yōu)勢。
由于每個步驟需要拔插電纜,在ENIAC的計算過程中反而費時費力的并不是計算本身,而是重新配置編碼盤接線。因此這個東西的整體計算效率并不高。
為了解決這個問題,就出現(xiàn)了一個關(guān)鍵的人物——馮·諾伊曼。馮·諾伊曼之所以成為計算機史上的轉(zhuǎn)折人物,就在于他敏銳地看到了 ENIAC 的局限:人工布線的編程方式把機器禁錮成了“巨大但僵硬的計算器”,只能解決單一問題,缺乏通用性。他提出的核心思想就是——把程序像數(shù)據(jù)一樣存儲在內(nèi)存中,讓計算機通過讀取指令來自動完成邏輯控制,這就是后來被稱為“馮·諾伊曼結(jié)構(gòu)”的體系。它徹底改變了計算機的編程模式:不再需要拔插電纜,而是通過指令流和數(shù)據(jù)流的調(diào)度,機器可以在一套硬件架構(gòu)下反復(fù)執(zhí)行不同的程序。用的東西很簡單——“打孔帶”。
![]()
這是一種在1725年就出現(xiàn)在提花織布機上的古老物件。通過在紙帶上打孔來控制織布機的行針方式,從而可以織出各種圖案的布匹。
![]()
到了1846年這種打孔帶也就逐漸的被應(yīng)用在電報業(yè)務(wù)中。成了圖案之外的真正信息載體。
![]()
如果我們?nèi)タ碋NIAC的編碼盤,我們會發(fā)現(xiàn)這也是一個基于位置的陣列系統(tǒng):
![]()
天生就和打孔紙帶上的陣列孔有相似特性。馮·諾伊曼就是利用了這一點,把接線規(guī)則替換成了光電信號。利用紙袋機替換掉了手工接線的過程。到了1948年前后,馮·諾伊曼借鑒了提花織機、打孔卡/紙帶的思想,把“信息載體”與“控制邏輯”綁定,讓電信號能自動驅(qū)動邏輯單元,而不是讓操作員每次都重新插線。
![]()
有了輸入設(shè)備(紙帶)、輸出設(shè)備(同樣是紙帶),加上統(tǒng)一的存儲結(jié)構(gòu)和邏輯控制,計算機才真正進化成我們今天熟悉的“馮·諾伊曼機”。ENIAC是開端,而馮·諾伊曼的思想才是靈魂。
那么,我們能不能復(fù)現(xiàn)這個過程呢?其實是可以的!
![]()
例如上面這張圖片:就可以當(dāng)作一個程序和數(shù)據(jù)的載體讓ENIAC執(zhí)行計算工作。它的本質(zhì)就是一個二維陣列:每一列代表一個時鐘周期的指令或數(shù)據(jù),每一行對應(yīng)不同的通道/寄存器。打孔的位置就是“1”,不打孔就是“0”。當(dāng)紙帶通過光電讀頭時,電信號就會按照預(yù)設(shè)的節(jié)奏被送進邏輯電路,從而觸發(fā)加法器、乘法器或者跳轉(zhuǎn)控制。
為了讓大家能夠更直觀地感受到 ENIAC 的工作方式,今天沒事就專門寫了一個“ENIAC 紙帶模擬系統(tǒng)”。它的目標(biāo)很簡單:讓現(xiàn)代人通過電腦和一塊廉價的 ESP32 開發(fā)板,就能體驗當(dāng)年工程師用紙帶控制電子計算機的過程。
![]()
整個系統(tǒng)分成幾部分。首先是紙帶生成器,它能把二進制程序數(shù)據(jù)轉(zhuǎn)換成一張帶有鏈輪孔的“紙帶圖像”。圖像里包含了程序頭、數(shù)據(jù)區(qū)、CRC32 校驗等信息,完全模仿了歷史上的紙帶格式。然后是紙帶讀取器,它會把圖像再解碼回數(shù)據(jù),并通過串口發(fā)送到 ESP32,等于是把“打孔紙帶”的物理過程轉(zhuǎn)化為現(xiàn)代通信。ESP32 這一端有一個接收程序,負(fù)責(zé)把數(shù)據(jù)保存到板載存儲,并且返回確認(rèn)信號,確保傳輸可靠。
![]()
為什么用ESP32呢?這玩意便宜!,一個ESP32芯片本身的價格也就是7塊錢人民幣,而一個ESP32的開發(fā)板價格也就只有20多塊錢。
最核心的部分是彈道計算程序。ENIAC最初的用途就是做炮彈彈道表,我在程序里復(fù)刻了這一邏輯:以初速 850 m/s、發(fā)射角 32.5° 為參數(shù),在重力作用下計算每個時間步長的位置,直到炮彈落地。計算公式依舊是經(jīng)典的牛頓力學(xué),軌跡點的推算完全按 ENIAC 累加器的思路來實現(xiàn)。
![]()
最后就是ENIAC模擬器。它會讀取剛才生成的程序文件,用虛擬的累加器和指令集執(zhí)行,并打印出軌跡、射程和最大高度。相比真實的 ENIAC,這個模擬器快得多,但在架構(gòu)邏輯上保留了“指令即電路”的特征,讓人能清晰看到那個時代的設(shè)計思路。
![]()
其實,在這個演示中,我們只需要運行幾個腳本,就能走完整套流程:生成程序、轉(zhuǎn)換為紙帶、發(fā)送到 ESP32、最后在模擬器執(zhí)行。例如上面的這條紙袋所代表的含義則是:
速度: 890 m/s
射角: 32.5?
距離: 73179.04 m
最大高度: 11655.05 m
飛行時間: 97.49 s
ENIAC的“快”是電路層面的瞬時快,不是體系結(jié)構(gòu)的可持續(xù)快。它是十進制環(huán)形計數(shù)器堆出的算術(shù)陣列:20個累加器、脈沖觸發(fā)、函數(shù)表外接常量,靠插接板與撥盤把數(shù)據(jù)路徑“焊死”成一次性的算法網(wǎng)絡(luò)。加法約0.2毫秒、乘法約2.8毫秒,這些數(shù)字只說明單個算術(shù)單元在被正確布線后響應(yīng)迅速;但一旦問題變了,程序等于報廢,所有路徑重畫、重插、重校。1948年那次“改裝”,只是把函數(shù)表等部件當(dāng)作臨時的程序只讀源,勉強串起有限的指令序列,它依然不是存儲程序機。因此,把ENIAC與現(xiàn)代處理器做“速度”對比,本身就是錯誤命題:缺少地址空間、條件控制與可重定位代碼的系統(tǒng),談不上通用算力。
![]()
所以說,馮·諾伊曼結(jié)構(gòu)真正改變的是編程對象。在這套結(jié)構(gòu)里,程序與數(shù)據(jù)被一體安置到同一可隨機訪問的存儲器中,處理器以“取指—譯碼—執(zhí)行”的時序循環(huán)驅(qū)動控制流,條件分支、循環(huán)、間接尋址與子程序由此成為一等公民。但是要注意——所謂“馮·諾伊曼結(jié)構(gòu)”不是泛泛的“用了紙帶/卡片輸入”,而是把指令表示為可尋址的字,用統(tǒng)一的地址空間管理控制與運算,讓“重布線”退場,由“重編譯/重裝載”接管。從這一步開始,計算機才真正的獲得了抽象層級:匯編—高級語言—編譯器—操作系統(tǒng),軟件得以迭代,硬件得以解耦。
還有一點得說說了,這是咱們目前計算機教育的缺失,在大多數(shù)計算機教材中都寫到現(xiàn)代計算機是“馮·諾伊曼結(jié)構(gòu)”,其實這件事不對!甚至可以說是半個世紀(jì)之前的老皇歷了。
今天絕大多數(shù)通用處理器只在語義層承襲“存儲程序”思想:指令與數(shù)據(jù)共享統(tǒng)一的虛擬地址空間,處理器按“取指—譯碼—執(zhí)行”來保證可編程性與可重定位代碼。這是一種編程契約,而不是對物理實現(xiàn)的準(zhǔn)確描述。
到了實現(xiàn)層,主流CPU早已是“改良哈佛”。指令與數(shù)據(jù)各有獨立的一級緩存、TLB、預(yù)取與一致性路徑,前端還會把復(fù)雜指令拆成微操作并緩存在μop cache 里;后端亂序執(zhí)行、寄存器重命名、分支預(yù)測與投機回滾,把“線性指令流”硬生生改造成并行的數(shù)據(jù)通道。所謂“馮·諾伊曼瓶頸”被多級緩存、帶寬并行與預(yù)取器部分掩蔽——這和傳統(tǒng)意義上的“單總線取指取數(shù)排隊”完全不是一回事。
![]()
再往上到系統(tǒng)層,我們已經(jīng)是“多結(jié)構(gòu)并存”:CPU保持通用性,GPU/TPU走數(shù)據(jù)流/空間映射路線(SIMD/SIMT、脈動陣列、片上SRAM作顯式工作區(qū),靠DMA搬運),NPU/ISP/編碼器是更強的專用陣列;內(nèi)存體系呈NUMA與異構(gòu)分層(HBM+DDR+持久內(nèi)存),總線與互聯(lián)(CCIX/CXL/Infinity/NVLink)提供跨設(shè)備一致性與共享虛擬內(nèi)存。說白了,軟件語義仍是馮·諾伊曼的“存儲程序”,硬件形態(tài)卻同時在走哈佛化與數(shù)據(jù)流化。所以,現(xiàn)在很多人看到了一些計算機架構(gòu)圖,例如:
![]()
你會發(fā)現(xiàn)這些看起來像是當(dāng)初大學(xué)計算機課程里面學(xué)的馮·諾伊曼結(jié)構(gòu),但是又有一些不對勁。其實就是我們所學(xué)到的教材偷懶了。很多教材里那張“CPU—存儲器—輸入輸出”的框圖,說是“馮·諾伊曼結(jié)構(gòu)”,在現(xiàn)在看只是一個歷史符號而已。它描述的是1940年代的理想模型,而不是2020年代的現(xiàn)實硬件。
到了今天,你隨便找一張現(xiàn)代主板的架構(gòu)圖(比如上面這一張),CPU旁邊除了內(nèi)存控制器,還有PCIe控制器;南橋PCH下面掛了一堆網(wǎng)卡、聲卡、硬盤控制器;緩存、預(yù)取、分支預(yù)測、亂序執(zhí)行全都埋在處理器內(nèi)部。這和當(dāng)年“指令和數(shù)據(jù)走一根總線”的馮·諾伊曼機,已經(jīng)完全不是一回事。
換句話說,我們繼承的是編程契約,不是物理實現(xiàn)。程序員眼里還是統(tǒng)一地址空間、取指執(zhí)行循環(huán),但硬件工程師眼里早已是“改良哈佛 + 異構(gòu)數(shù)據(jù)流”的混合體。CPU在保持通用性的同時,身邊圍滿了GPU、TPU、NPU這些“專職干活的外援”,真正的算力早就不是單核、單總線能解釋的。
所以,當(dāng)教材還在用“馮·諾伊曼結(jié)構(gòu)”去概括“現(xiàn)代計算機”,其實就是一本半個世紀(jì)前的老皇歷。它方便教學(xué),但別因此產(chǎn)生錯覺:好像我們今天用的電腦,還跟1948年的ENIAC是一個物種。事實恰恰相反——我們站在馮·諾伊曼抽象之上,但實現(xiàn)層早已四分五裂,硬件世界走的是混血架構(gòu)。這才是當(dāng)下計算機體系真正的樣子。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.