今更であるが、読書をするまとまった時間ができたので、少しずつ「ハンズオン WebAssembly」を読んでみることにした。
読みながらメモはできないので、読んだ後にまとめてみることにする。
WebAssemblyの長所は、Javascriptのようなインタプリタ型で動作する実行系に対して高速に動作することだ。 また、Javascriptは動的型付けの言語であり実行時に型の決定のための負荷があるが、WebAssemblyは静的に型付が行われるためその面でも高速である。
様々なプログラミング言語からWASMへのコンパイルがサポートされている。本書ではC/C++がメインだが、RustやGoなどもWASMコンパイル向けのプログラミング言語として有名だ。 WebAssemblyはブラウザ上でJavascriptと協調して動作するように設計されている。本書の中盤では、C/C++コードから生成したWebAssemblyをJavascript/HTMLに連動させてブラウザ上で動作させる例がある。 実際、C/C++やRustなどで記述されたコードは、WASMでコンパイルされた後、ブラウザ上でローディングされた際にネイティブコード(x86やARMなど)に変換されて実行される、という寸法だ。
WebAssemblyの汎用的なバイナリ形式と考えてもほとんど差し支えいないという理解で、WASMファイルは内部ではセクションに分割されている。 KnownセクションとUnknownセクションが定義されており、KnownセクションはまあELF形式のプロシージャの記述と、データ、メモリ領域の定義などが含まれていると考えてよいだろう。 詳細はわからないがこのセクション構造はうまく設計されており、ワンパスコンパイルでWASMが生成できるようになっている。
本書の中盤では、Emscriptenを使用してC++のコードから WASM / Javascript / HTML の生成をハンズオンする。 EmscriptenはWASM単体、WASMとJavascript、WASM, Javascript, HTMLの生成をサポートしている。
C++のコードは素数の判定を行うコードをサンプルとしている。
最も一般的なのはWASM, Javascriptを生成するというものらしい。この時、printf
の結果はブラウザのデバッグウィンドウに表示される。
WASM / Javascript / HTML だとprintf
は直接ブラウザに表示されるようだ。
このハンズオンを眺めて、なんとなく動作の概要が掴めてきた気がする。