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










