2016/05/01(日)emscriptenで遊んでみた

emscriptenという、c/c++のコードをLLVMのバイトコードを経由してjavascriptに変換するコンバータがよく話題になっています。以前、kvライブラリをemscriptenで変換して動かしたというメールを頂いたことがあって、ずっと気になっていました。そこで、ちょっとインストールして遊んでみました。

インストールしたばかりのubuntu 16.04で試しました。しかし、
sudo apt install emscripten
で入れてもうまく動かない模様です。clang/llvmのバージョンの問題っぽいがよく分かりません。

そこで、本家の Download and install — Emscripten 1.36.1 documentation に従ってインストールしてみました。そこではポータブル版というroot権限なしで入れる方法が紹介されていました。その方が周辺ツールのバージョンに左右されなくてインストールが楽なのかな。
sudo apt install cmake
Portable Emscripten SDK for Linux and OS X (emsdk-portable.tar.gz) をダウンロードして展開し、その中にcdして
./emsdk update
./emsdk install latest
./emsdk activate latest
します。最後の作業で/home/kashi/.emscriptenが作られました。これでインストールは終了。使う前に
source emsdk_env.sh
でPATHの設定が必要です。

適当なc++のプログラムを作って、
emcc test.cc
node a.out.js
で動くのを確認しました。

次に、kvのプログラムを動かしてみました。問題はboostで、emscriptenでは外部ライブラリを使ったプログラムはそのままでは動きません。外部ライブラリもソースから変換する必要があります。kvの場合は幸いなことにboostはheader onlyの範囲でしか使っていませんので、大丈夫なはずです。自分は、
ln -s /usr/include/boost ホームのどこか
とリンクを張ってしまって、-Iにそれを指定してごまかしました。これが正しいかどうかは分かりません。また、javascriptの中ではfesetroundによる丸めの向きの変更は効かないので、そのままでは精度保証出来ません。kvは-DKV_NOHWROUNDを付けると丸めの向きの変更を行わずエミュレーションで方向付き丸めを行なう機能を持っており、それをつけるとちゃんと精度保証付きで計算してくれるようです。
emcc -I(kvの場所) -I(boostの場所) -DKV_NOHWROUND hoge.cc
みたいな感じです。kvのサンプルはmpfrを使ったもの以外は大体動きそうです。実行速度はちゃんと測ってませんがネイティブのC++の30倍程度でしょうか。htmlに変換してfirefoxに食わせた方がnode.jsより速いようにも見えました。

単なる遊びであってあまり意味はないですが、楽しいです。
OK キャンセル 確認 その他