EmscriptenでRustをJavaScriptへコンパイルする

以前のエントリではうまくいかなかった、RustのJavaScriptへのコンパイルですが、

gifnksm.hatenablog.jp

先日フォーラムに投稿されていたやり方をまねるだけで簡単にできるようになっていました。

internals.rust-lang.org

Rust本体にEmscripten対応が取り込まれたのですが、動かすためには専用のLLVMが必要などいくつか制限があります。 制限があるとはいえ、以前よりも簡単にEmscriptenでのコンパイルが試せるようになったのは朗報ですね!

追記

リンクしか内容がない記事というのもアレなので、Emscripten を使ったコンパイル方法を簡単に書いておきます。

  1. Emscripten環境変数を設定する

     $ source <path to emsdk>/emsdk_portable/emsdk_env.sh
    
  2. rustc--target オプションつきで呼び出す

     $ <path to rust root>/x86_64-unknown-linux-gnu/stage2/bin/rustc --target asmjs-unknown-emscripten ./hello.rs -O
    

以上。簡単ですね。

以下のプログラムをコンパイルしてみたところ、1MB程度の巨大なJavaScriptのコードが生成されました。ただの Hello world にしてはすごい量ですが、Emscriptenのランタイム (?) のソースコードの量が多いようです。

fn main() {
  println!("Hello emscripten world!");
}

-O や、 -C lto 等の最適化オプションをつけることもできます。 最適化あり・なしの結果をGistに貼り付けてみました。

main関数はここから始まるようです。 なにがなんやら、、、といった感じですね。。。。

LTO有効だからといって、劇的にサイズが減るわけでもないようです。