关于Emscripten

Emscripten是一个 开源 的LLVM到JavaScript编译器。使用Emscripten可以:

  • 将C/C++代码编译为JavaScript
  • 将任何可以翻译为LLVM字节码的代码编译为JavaScript
  • 将由C/C++编写其他语言 运行时 编译为JavaScript,然后以间接的方式运行其他语言的代码(Python和Lua已经实现)!

小技巧

Emscripten使本机代码可以在Web环境中使用:他是一个基于标准的平台,拥有许多独立的兼用实现,并且可以运行在包括从PC到iPad的任何地方。

使用Emscripten,C/C++开发者无需手动将代码移植为JavaScript,也不必学习JavaScript。Web开发者也能从中获益,因为他们可以在他们的网站中使用成千上万的预先存在的本机实用程序和库。

实际上,使用Emscripten可以将任意 可移植 的C/C++代码编译为JavaScript,从需要渲染图形,播放声音,加载和处理文件的高性能游戏到诸如Qt的应用程序框架。Emscripten已经用于将 相当多的实际代码库 转换为JavaScript,包括 CPythonPopplerBullet Physics Engine 等大型项目,以及 Unreal Engine 4Unity引擎 等商业项目。这是两个使用Unity的演示:

Angrybots game logo
Dead Trigger 2 Game logo

有关更多演示,请参阅 Wiki上的列表

Emscripten能生成高效的代码! 他默认的输出格式是 asm.js ,这是JavaScript的高度优化子集,在许多情况下,它们可以以接近本机的速度执行(查看 当前基准测试结果 或自行运行 基准测试)。优化并压缩后Emscripten代码也具有与本机代码相似的有效大小。

要更好地了解Emscripten移植代码的运行速度和流畅程度,请查看上面的 Dead Trigger 2Angrybots 示例。

Emscripten工具链

下面给出了Emscripten工具链的高级视图。主要工具是 Emscripten编译器前端(emcc) 。这是gcc等标准编译器的直接替代品。

../../../_images/EmscriptenToolchain.png

Emcc 使用 Clang 和 LLVM 编译生成 Wasm或者asm.js。Emscripten将生成编译后可以运行的代码以及所需的运行时库。生成的JavaScript代码可以运行在 node.js 环境,或者使用HTML在浏览器中运行。

Emscripten SDK (emsdk) 用于管理多份SDK和工具,并指定当前正在使用的编译代码(Active Tool/SDK)。 它设置能够从Github 安装(下载并构建)最新版的工具链。

Emsdk 将“活动的”配置存储到 Emscripten Compiler Configuration File (.emscripten) 中。emcc 使用这个文件来获取正确的工具链。

许多其他工具未显示 – 例如, emcc 可以有选择的使用Java来运行 closure compiler, 这可以进一步减少代码大小。

完整的工具链由 Emscripten SDK 提供,并且可以同时运行在Linux,Windows和Mac OS等平台。

为Emscripten移植代码

Emscripten对 可移植的 C/C++代码提供了相当全面的支持。对C标准库,C++标准库,C++异常等等。 SDL 支持足以运行很多代码。 Emscripten中的OpenGL支持 对OpenGL ES 2.0类型的代码非常有用,并且接受其他类型的代码。

本机环境和 Emscripten运行时环境 之间存在差异,这意味着通常需要对本机代码进行一些更改。也就是说,许多应用程序仅需要更改定义主循环的方式,并且修改 file handling 以适应浏览器/ JavaScript的限制。

还有一些限制可以使某些代码更易于移植-请阅读 移植指南 以确定您可能需要花更多精力的地方。