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