CheerpX:使用 WebAssembly 在瀏覽器中執行任何程式語言

banq發表於2021-12-16

我們都知道 WebAssembly 支援多種語言,但是 CheerpX 有點特別。CheerpX 是 x86 處理器架構本身的模擬器 - 允許您直接在 WebAssembly 執行時上執行 x86 二進位制檔案。
CheerpX構建了一個基於 WebAssembly 的虛擬機器來在瀏覽器中執行 X86 二進位制檔案。您可以使用它執行任何 REPL 環境。示例:https : //repl.leaningtech.com/?python3
 
從歷史上看,JavaScript 一直是  Web的程式語言。這隨著 WebAssembly 的引入而改變,儘管是以一種相當間接的方式。
從根本上說,WebAssembly 是一個 編譯器:由來自不同源語言的專門程式發出的二進位制表示 。
這也反映在 WebAssembly 引擎本身的設計中,它假設傳入的位元組碼已經被很好地最佳化,並且它們的大部分內部最佳化管道被禁用。這與 JavaScript 編譯形成鮮明對比,JavaScript 編譯在該領域內最優秀的頭腦數十年的工作投入到讓低質量的 JavaScript快速執行 。
在撰寫本文時,WebAssembly 最常使用基於 LLVM 的工具鏈從 C/C++ 程式碼生成。當努力移植現代動態程式語言(如 Python)時,首選的解決方案是編譯 C/C++ 實現。為了實現這一點,可以使用精簡版本,例如禁用 JIT 支援或依賴於本地構建元件的模組。
將重要的 C/C++ 程式碼庫移植到 WebAssembly 並不一定是一項簡單的工作。程式語言實現很可能有多個依賴於目標的程式碼路徑或定義,因此所需的工作與將語言移植到新的本機架構沒有什麼不同。
如果在移植 Python 之後,你還想移植 Ruby……嗯,你需要從頭開始。
 

CheerpX 的核心是 X86 架構的模擬器
顯然,一個簡單的模擬器在效能方面不會讓你走得太遠,所以我們實現了一個複雜的 JIT 編譯器,它能夠為熱程式碼生成高效的 WebAssembly 表示。整個過程是 100% 自動化的,不需要任何後設資料或假設。該系統非常健壯,它實際上可以處理在執行時在內部生成新程式碼的應用程式,甚至可以處理自修改程式碼。這意味著您實際上可以執行 NodeJS 之類的東西,包括完整的 V8 引擎及其卓越的 JIT 和程式碼垃圾收集。
可以想象,這是一個極其複雜的問題。在設計 CheerpX 時,我們決定只關注使用者模式程式碼(Ring 3),忽略(目前)系統級(Ring 0)功能的複雜性。為了縮小差距並讓真實世界的應用程式執行,我們實現了 Linux 系統呼叫介面的(子集)。
到現在為止,可能很清楚 CheerpX 可用於在瀏覽器中執行任何程式語言 REPL。我們沒有將每種語言環境手動移植到 WebAssembly,而是讓整個 Linux/X86 構建執行在 CheerpX VM 之上。
。。。
  

Flash 模擬器
CheerpX 是CheerpX for Flash的基礎技術, 它是一種 Flash 模擬器,可在純 HTML5 中執行舊版 Adob​​e Flash 內容。CheerpX for Flash 透過執行 Flash 播放器(Linux 的 X86 二進位制檔案)來工作,其執行方式與我們在本文中展示的方式並無不同。
原文點選標題
 

相關文章