关于 Emscripten

Emscripten 是一个完整的 开源 编译器工具链,用于 WebAssembly。使用 Emscripten,您可以

  • 将 C 和 C++ 代码(或任何使用 LLVM 的其他语言)编译成 WebAssembly,并在 Web、Node.js 或其他 Wasm 运行时上运行它。

  • 将其他语言的 C/C++ **运行时** 编译成 WebAssembly,然后以**间接**方式运行这些其他语言的代码(例如,这已经针对 PythonLua 完成)。

实际上任何**可移植**的 C 或 C++ 代码库都可以使用 Emscripten 编译成 WebAssembly,从需要渲染图形、播放声音和加载和处理文件的性能游戏,到像 Qt 这样的应用程序框架。Emscripten 已经用于将非常长的实际代码库列表转换为 WebAssembly,包括 虚幻引擎 4Unity 引擎等商业代码库。有关示例和演示,请参阅 社区维护的 wiki 上的列表

Emscripten 生成小型且快速的代码!它的默认输出格式是 WebAssembly,这是一种高度可优化的可执行格式,其运行速度几乎与原生代码一样快,同时具有可移植性和安全性。Emscripten 通过与 LLVM、BinaryenClosure Compiler 和其他工具的紧密集成,自动为您完成许多优化工作。

Emscripten 工具链

下面是 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

Emscripten 对**可移植** C/C++ 代码的支持相当全面。对 C 标准库、C++ 标准库、C++ 异常等的支持非常好,以及 SDL2 和其他 API。Emscripten 中的 OpenGL 支持 对 OpenGL ES 2.0 类型代码的支持非常好,对其他类型的支持也还可以。

原生和 Emscripten 运行时环境 之间存在差异,这意味着通常需要对原生代码进行一些更改。也就是说,许多应用程序只需要更改其定义主循环的方式,以及修改其 文件处理 以适应浏览器/JavaScript 的限制。

还有一些限制,这些限制可能使一些代码更易于移植——阅读 可移植性指南 以确定您可能需要花费更多精力的部分。