Emscripten 是一個完整的 開放原始碼 編譯器工具鏈,用於 WebAssembly。使用 Emscripten,您可以
將 C 和 C++ 程式碼,或任何其他使用 LLVM 的語言,編譯成 WebAssembly,並在 Web、Node.js 或其他 Wasm 執行環境中執行。
將其他語言的 C/C++ **執行環境** 編譯成 WebAssembly,然後以*間接*方式執行這些其他語言的程式碼(例如,這已針對 Python 和 Lua 完成)。
實際上,任何 **可移植的** C 或 C++ 程式碼庫都可以使用 Emscripten 編譯成 WebAssembly,範圍從需要渲染圖形、播放聲音以及載入和處理檔案的高效能遊戲,到 Qt 等應用程式框架。Emscripten 已被用於將許多真實世界的程式碼庫轉換為 WebAssembly,包括像 Unreal Engine 4 和 Unity 引擎等商業程式碼庫。如需範例和演示,請參閱 Wiki 上由社群維護的列表。
Emscripten 生成小而快的程式碼!其預設輸出格式為 WebAssembly,這是一種高度可最佳化的可執行格式,其執行速度幾乎與原生程式碼一樣快,同時又具有可移植性和安全性。Emscripten 透過與 LLVM、Binaryen、Closure Compiler 和其他工具的仔細整合,自動為您完成大量最佳化工作。
Emscripten 工具鏈的高階視圖如下所示。主要工具是 Emscripten 編譯器前端 (emcc)。這是像 *gcc* 或 *clang* 這樣的標準編譯器的替代品。
*Emcc* 使用 Clang 和 LLVM 編譯成 WebAssembly。Emcc 還會發出 JavaScript,為編譯後的程式碼提供 API 支援。該 JavaScript 可以由 Node.js 執行,或從瀏覽器中的 HTML 內執行。
Emscripten SDK 用於安裝整個工具鏈,包括 emcc 和 LLVM 等等。Emscripten SDK (emsdk) 可以在 Linux、Windows 或 MacOS 上使用。
Emscripten 對 **可移植的** C/C++ 程式碼的支援相當全面。對 C 標準函式庫、C++ 標準函式庫、C++ 例外處理等的支援非常好,對 SDL2 和其他 API 的支援也很好。Emscripten 中的 OpenGL 支援 對於 OpenGL ES 2.0 類型的程式碼來說非常優秀,對於其他類型來說也是可以接受的。
原生環境和 Emscripten 執行環境 之間存在差異,這表示通常需要對原生程式碼進行一些變更。也就是說,許多應用程式只需要變更它們定義主迴圈的方式,並且修改它們的 檔案處理 以適應瀏覽器/JavaScript 的限制。
還有一些限制會讓某些程式碼更容易移植 — 請閱讀 可移植性指南 以判斷您可能需要投入更多精力的地方。