Emscriptenについて

Emscriptenは、WebAssembly向けの完全なオープンソースコンパイラツールチェーンです。 Emscriptenを使用すると、

  • CおよびC++コード、またはLLVMを使用するその他の言語をWebAssemblyにコンパイルし、Web、Node.js、またはその他のWasmランタイムで実行できます。

  • 他の言語のC/C++ **ランタイム**をWebAssemblyにコンパイルし、それらの他の言語のコードを*間接的に*実行します(たとえば、PythonLuaで行われています)。

事実上、あらゆる**ポータブルな**CまたはC++コードベースをEmscriptenを使用してWebAssemblyにコンパイルできます。高性能なゲーム(グラフィックのレンダリング、サウンドの再生、ファイルのロードと処理が必要)から、Qtなどのアプリケーションフレームワークまで幅広く対応します。Emscriptenはすでに、Unreal Engine 4Unityエンジンなどの商用コードベースを含む、非常に多くの現実世界のコードベースをWebAssemblyに変換するために使用されています。例とデモについては、コミュニティが管理するWiki上のリストを参照してください。

Emscriptenは、小さく高速なコードを生成します!デフォルトの出力形式はWebAssemblyであり、高度に最適化可能な実行形式で、ネイティブコードとほぼ同等の速度で実行されながら、ポータブルで安全です。Emscriptenは、LLVM、BinaryenClosure Compiler、その他のツールとの綿密な統合により、多くの最適化作業を自動的に実行します。

Emscriptenツールチェーン

Emscriptenツールチェーンの高レベルビューを以下に示します。メインツールはEmscriptenコンパイラフロントエンド(emcc)です。これは、gccclangなどの標準コンパイラの代替として使用できます。

emccClangとLLVMを使用してWebAssemblyにコンパイルします。emccは、コンパイルされたコードにAPIサポートを提供するJavaScriptも出力します。そのJavaScriptはNode.jsで、またはブラウザのHTML内で実行できます。

Emscripten SDKを使用して、emccやLLVMなどを含むツールチェーン全体をインストールします。Emscripten SDK(emsdk)は、Linux、Windows、またはmacOSで使用できます。

Emscriptenを使用するためのコードの移植

**ポータブルな**C/C++コードに対するEmscriptenのサポートは非常に包括的です。C標準ライブラリ、C++標準ライブラリ、C++例外などのサポートは非常に優れており、SDL2やその他のAPIも同様です。EmscriptenにおけるOpenGLサポートは、OpenGL ES 2.0タイプのコードに対しては優れており、その他のタイプについても許容範囲です。

ネイティブとEmscriptenランタイム環境には違いがあるため、通常、ネイティブコードに変更を加える必要があります。つまり、多くのアプリケーションでは、メインループの定義方法を変更し、ブラウザ/JavaScriptの制限に適応するためにファイル処理を変更するだけで済む場合があります。

一部のコードの移植を容易にする制限もあります。より多くの労力を費やす必要がある場所を判断するには、移植性ガイドラインを参照してください。