![見出し画像](https://assets.st-note.com/production/uploads/images/120910438/rectangle_large_type_2_d3f6d5f39e2fe6d3ed4e599fde91dfe8.jpeg?width=1200)
#102 WebAssembly
バックエンドもフロントエンドもJavaScriptのWebアプリが流行りですが、WebAssemblyという技術を使えば、CやC++でもWebアプリが作れます。
JavaScriptでいいじゃんとも思いますが、なぜあえてWebAssemblyを使うのか。
Mozillaのドキュメントでは、パフォーマンス上の利点が強調されています。WebAssemblyは、事前にプログラムを特殊なバイトコードにコンパイルして、JavaScript VM上で実行します。コンパイル言語の強みを取り入れつつ、長年強化されてきたJavaScript VMで動かすことでセキュリティと互換性を保っています。
RustやAssemblyScript(JavaScriptの甥っ子)でもコンパイルできるようです。とりあえず、C++でHello Worldまで。
Emscripten
Emscriptenは、C/C++でWebAssemblyをコンパイルするためのツールです。GitHubからSDKを取得して、ちょちょいと設定すればコンパイルできます。Python3とNodeJsに依存しているので、こちらもインストールが必要です。
aptでインストールする場合は、特に設定の必要なくコンパイルまでできました。
sudo apt install emscripten
Hello World
hello.cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
コンパイルはem++コマンドでできます。
em++ hello.cpp
すると、a.out.jsとa.out.wasmというファイルが生成されます。jsファイルには、WebAssemblyを実行したり、JavaScriptとWebAssemblyの橋渡しをするための処理が含まれています。実際のバイトコードはwasmファイルに書き込まれています。
HTMLで、jsファイルを読み込めば、wasmが実行されます。
index.html
<html>
<head>
<script src="/a.out.js"></script>
</head>
<body>
<h1>test</h1>
</body>
</html>
テスト
pythonでサーバーを立てて、確認してみます。
python3 -m http.server 8080
![](https://assets.st-note.com/img/1699194734731-ZClS4L7dVu.png?width=1200)
コンソールにHello World出力されています!
まとめ
WebAssemblyという形で、ブラウザでバイナリを実行できました。まだまだ発展途上の技術ですが、ちょっとセキュリティ面で不安な気もします。クロスサイトバッファオーバーフローなんてでてきたりして…もうちょっと深堀するのもおもしろそうです!
EOF