![]()
你有沒有想過(guò),瀏覽器的上限在哪?
二十多年前,瀏覽器能看個(gè)網(wǎng)頁(yè)小游戲就不錯(cuò)了。后來(lái)它能放視頻、能聽歌、能寫文檔,現(xiàn)在它能剪視頻、能畫設(shè)計(jì)稿、能跑 3A 游戲的云串流。
但這些,還有人覺得不夠。。。
有一個(gè)叫 copy 的開發(fā)者,把 100 多個(gè)操作系統(tǒng)塞進(jìn)了瀏覽器。
從 1985 年的 Windows 1.01 到 Windows 2000,從 Linux、FreeBSD 到 Android,再到 Haiku、KolibriOS、SerenityOS 這些你可能聽都沒聽過(guò)的,100 多個(gè)操作系統(tǒng)排在頁(yè)面上,像一部濃縮的計(jì)算機(jī)編年史,任你挑選體驗(yàn)。
![]()
這還不是重點(diǎn)。
重點(diǎn)是,這些系統(tǒng)不是模擬還原出來(lái)的,是真正運(yùn)行在網(wǎng)頁(yè)里的原版。。。
是不是沒太明白啥意思,別急,馬上就知道了。
這個(gè)項(xiàng)目叫 v86,網(wǎng)址 copy.sh/v86,免費(fèi)開源,在 GitHub 上有 2 萬(wàn)多人星標(biāo),從 2012 年開始更新一直維護(hù)到現(xiàn)在。
世超刷到時(shí)也很震驚,就決定去里面試試,挑了一個(gè) Windows 98,畢竟這是咱們這代人小時(shí)候摸過(guò)的東西。
點(diǎn)進(jìn)去沒幾秒,桌面出來(lái)了。
說(shuō)實(shí)話,哥們刻在 DNA 里的操作還是沒忘,下意識(shí)的“開始”-“程序”-“游戲”,啟動(dòng)掃雷。。。
畫面真的和小時(shí)候一模一樣,世超也和小時(shí)候一模一樣,懶得算,全憑運(yùn)氣瞎點(diǎn),三下就炸了。
![]()
眼尖的小伙伴應(yīng)該看到上方動(dòng)圖里有一只羊,會(huì)跳到任務(wù)欄、窗口上跑來(lái)跑去,這玩意叫 sheep.exe,一個(gè)桌面寵物軟件。
啟動(dòng)后,就會(huì)有一只白色小羊在屏幕上跑來(lái)跑去,要是用鼠標(biāo)把它拎了起來(lái),它還會(huì)掙扎幾下。
![]()
后來(lái)我又體驗(yàn)了紙牌接龍,畫圖,說(shuō)實(shí)話都很原汁原味。
但到這,世超還是有點(diǎn)將信將疑:
這真是一個(gè)完整的操作系統(tǒng)在跑?會(huì)不會(huì)只是把幾個(gè)經(jīng)典程序用網(wǎng)頁(yè)重寫了一遍,套了層 Windows 98 的皮?
于是我開始挨個(gè)驗(yàn)證。
點(diǎn)開控制面板,里面有幾十個(gè)設(shè)置項(xiàng)。Add/Remove Programs、Display、Network、Modems、ODBC Data Sources,世超挨個(gè)點(diǎn)了一圈,全都能打開。。。
![]()
你就說(shuō) Desktop Themes 的選項(xiàng),點(diǎn)進(jìn)去挑了個(gè)主題切換,壁紙變了,圖標(biāo)變了,窗口顏色全變了。
![]()
甚至點(diǎn)開 IE,進(jìn)入百度,還 TM 能上網(wǎng)。
雖然因?yàn)榧嫒輪?wèn)題加載得磕磕絆絆,很多字符無(wú)法顯示,但頁(yè)面還是出來(lái)了。
![]()
控制面板能用,主題能換,瀏覽器能聯(lián)網(wǎng),到這三板斧下來(lái),世超算是服了——
總沒人會(huì)為了一個(gè)懷舊網(wǎng)頁(yè),做一整套能換主題、還能聯(lián)網(wǎng)、還有控制面板的皮膚吧?
所以基本可以確定,網(wǎng)頁(yè)里跑的就是一臺(tái) Windows 98 本尊。
但這樣的系統(tǒng)本尊,在這個(gè)網(wǎng)頁(yè)里還塞了 100 多個(gè)。
比如你能看到 Windows 1.01,桌面極其簡(jiǎn)陋,只有窗口沒有圖標(biāo),隔著屏幕都能聞到那股古早味。
該說(shuō)不說(shuō),那會(huì)審美還挺好,這配色還真挺好看。
![]()
你也能體驗(yàn)到 Windows 2000,這個(gè)夾在 98 和 XP 之間、很多人壓根沒用過(guò)一兩年的系統(tǒng),桌面上還預(yù)裝了一堆 Blender、Winamp 之類的老軟件。
![]()
甚至你還能玩到一個(gè)預(yù)裝了 DOOM、毀滅公爵、模擬城市等經(jīng)典游戲的 DOS 系統(tǒng)。
輸入幾行命令,1993 年的地獄大門就在瀏覽器里打開了。
![]()
這還沒完。。。
v86 上面還能體驗(yàn)到 Android-x86,信息、撥號(hào)、聯(lián)系人、瀏覽器全都有,側(cè)滑還能打開程序列表。
你可能會(huì)納悶,安卓不是手機(jī)系統(tǒng)嗎,怎么也在這?
因?yàn)?Android-x86 是一個(gè)社區(qū)項(xiàng)目,專門把安卓移植到了 x86 架構(gòu)上。既然安卓都自己跑到 x86 的地盤上來(lái)了,v86 順手就能把它跑起來(lái)了。。。
![]()
現(xiàn)在,世超腦子里就剩一個(gè)問(wèn)題:
這開發(fā)者到底是怎么做的?網(wǎng)頁(yè)里憑啥能體驗(yàn)到這么多系統(tǒng)?
后來(lái)看到 GitHub 上的項(xiàng)目說(shuō)明,我大概明白了。
開發(fā)者 copy 居然用代碼造了一臺(tái)虛擬的 PC???
從 CPU、顯卡、聲卡、網(wǎng)卡都是 copy 用代碼偽裝的,那些 Windows 系統(tǒng)壓根不知道自己跑在網(wǎng)頁(yè)里,以為是臺(tái)真機(jī)器呢。。。
但想騙過(guò)操作系統(tǒng),其實(shí)不簡(jiǎn)單。
系統(tǒng)們?cè)趩?dòng)時(shí),會(huì)瘋狂試探硬件:讀中斷控制器的狀態(tài)、查定時(shí)器的頻率、往顯卡寄存器里寫值看反應(yīng)。任何一個(gè)硬件的行為跟真機(jī)不一致,系統(tǒng)就會(huì)報(bào)錯(cuò)或者直接黑屏。
![]()
所以 copy 需要用代碼偽造一整套硬件的物理行為,精確到每個(gè)寄存器、每個(gè)時(shí)序、每個(gè)邊界條件。
要知道光模擬一個(gè) x86 CPU 工作量就已經(jīng)爆炸。
Intel 自己的官方手冊(cè),講指令集這一卷就有兩千多頁(yè)。copy 干的事,是把這兩千多頁(yè)手冊(cè)里的每一條規(guī)則,翻譯成 JavaScript 和 Rust 代碼,Windows 用的每一條都不能漏,漏了系統(tǒng)就崩。
CPU 只是這臺(tái)虛擬電腦十幾個(gè)硬件之一,你再想想其他的呢?
我只能說(shuō)想想就頭皮發(fā)麻了。
![]()
光有虛擬硬件還不夠。操作系統(tǒng)跑的是 x86 機(jī)器碼,瀏覽器能執(zhí)行的是 WebAssembly,這倆語(yǔ)言完全不通,要跑起來(lái)得翻譯一下。
但翻譯也需要時(shí)間,所以 V86 采用了 JIT 編譯(即時(shí)編譯)。
程序剛開始跑的時(shí)候,v86 逐條指令翻譯,翻一句執(zhí)行一句,這樣速度很慢,“電腦”很卡。
但同時(shí),v86 在后臺(tái)偷偷記錄哪些代碼被反復(fù)執(zhí)行。一旦發(fā)現(xiàn)某段代碼被調(diào)用的次數(shù)超過(guò)閾值,就把它整段翻譯成 WebAssembly 的編譯版本存起來(lái)。下次再碰到,直接跑編譯好的版本,就快得多。
項(xiàng)目嘛大概就是這樣,世超只能說(shuō)太牛了。。。
大家感興趣的可以自行訪問(wèn),倒是世超好奇:這哥們?yōu)槭裁匆鲞@個(gè)項(xiàng)目?
在進(jìn)行了一點(diǎn)簡(jiǎn)單搜索之后,我發(fā)現(xiàn)這個(gè)人很低調(diào),沒有公開社交媒體和博客,只知道叫 Fabian Hemmer。
![]()
世超順著他的項(xiàng)目列表往下看,越看越覺得有意思:這哥們很喜歡小的東西。
比如他做過(guò)只有 652 字節(jié)的俄羅斯方塊,456 字節(jié)的貪吃蛇,159 字節(jié)畫出來(lái)的 Ulam 螺旋。他還用 K 語(yǔ)言連續(xù)做了六年 Advent of Code 編程挑戰(zhàn)(K 是一種極端精簡(jiǎn)的數(shù)組編程語(yǔ)言,常見于金融量化領(lǐng)域)。
所以這哥們干的事,翻來(lái)覆去就一個(gè)主題:把東西往最小的空間里塞,把一個(gè)事情做到極限。
可能有人會(huì)問(wèn),在瀏覽器里跑 Windows 98 ,搞這些花里胡哨能有啥用?
但 Fabian 還真把這個(gè)執(zhí)念變成了工作。他創(chuàng)建了一家叫 Droplet Computing 的公司,賣的就是讓桌面應(yīng)用直接跑在瀏覽器里,底層用的還是 WebAssembly,和 v86 一脈相承。
別人是在電腦上裝軟件,這哥們是用軟件搭了一臺(tái)電腦,再往這臺(tái)電腦上裝軟件,最后還把這事做成了生意。
或許極客就是這樣,寫代碼不一定是為了解決問(wèn)題,有時(shí)就是想看看這條路能走多遠(yuǎn)。
走著走著,路就真走出來(lái)了。
撰文:刺猬
編輯:莽山烙鐵頭 面線
美編:煥妍
圖片、資料來(lái)源:
copy.sh/v86
![]()
特別聲明:以上內(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.