第4回は、WebAssembly開発で人気のあるC/C++とEmscriptenによる開発事例を紹介します。標準的なC/C++の関数の出力をWebページに反映させる事例の他に、C/C++の関数をJavaScriptから呼び出す事例も紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
連載第2回ではAssemblyScriptによるTypeScript言語、連載第3回ではBlazor WebAssemblyによるC#言語、それぞれの開発事例を紹介しました。スクリプト言語であるTypeScriptでの取り回しの容易さ、フレームワークBlazorによる充実した機能の利用のしやすさをお伝えできたのではないかと思います。
今回は、スクリプト言語やフレームワークはいったん脇に置き、WebAssembly開発の本命の一翼とされるC/C++による開発を紹介します。これには、C/C++においては最も一般的とされる、Emscriptenというコンパイル環境を利用します。Emscriptenによる開発では、標準ライブラリを含めたC/C++の言語仕様を十分に生かしたWebAssemblyプログラムが作成可能です。
C/C++はネイティブコードをターゲットにしたプログラミング言語であるので、その高い効率と高速性を生かした使い方が、真価を発揮しやすいといえます。EmscriptenはAPIを数多く備えており、その一つを使うことでC/C++コードからのWebページの操作なども可能です。ですが連載第1回でも紹介したように、まずは速度が重視される部分をC/C++が受け持つというのが、自然な使われ方でしょう。
本稿では、それを前提にJavaScriptコードの連携まで含めたEmscriptenの使い方を紹介していきます。
Emscriptenとは、C/C++からWebAssemblyへの、LLVMをベースとしたオープンソースのコンパイル環境です。LLVMとは、C言語系、FORTRANなど、さまざまなプログラミング言語に対応できる共通のコンパイラ基盤です。C/C++のコードを.wasm形式に直接コンパイルできる他、実行のためのJavaScriptグルー(.wasmファイルを読み込むためのJavaScriptコード)、HTMLファイルの生成も可能です。基本としてのWebブラウザ上での動作に加えて、Node.jsやWASIランタイム上での動作もサポートされています(本稿ではWebブラウザ上での動作のみ紹介します)。
C/C++のコードをWebAssemblyにコンパイルできることから、UnityやUnreal Engineなどのゲームエンジン、SQLiteなどのデータベースソフトウェア、AutoCADなどのCADソフトウェアなどで広く利用されています。また、APIを数多く備えており、スタンドアロンのC/C++プログラムと似たようにグラフィックスやデバイス、ファイルシステムやネットワークを利用できます。
LLVMをベースとしているので、これをサポートする多くのプラットフォームで利用可能です。macOS(10.14 Mojave以降)、Linux、Windowsとプラットフォームを選ばずに利用できます。
Main - Emscripten 3.1.32-git (dev) documentation
Emscriptenを使うために、以下に挙げるいくつかのソフトウェアを準備しておきます。
Copyright © ITmedia, Inc. All Rights Reserved.