-
Notifications
You must be signed in to change notification settings - Fork 7
WASM Memo
Rillの試験機能を試すメモなどを書いていきます。
以下は、Rillのビルドと利用はDockerコンテナ内で行い、それ以外はホストで直に実行する想定です。
環境: GNU/Linux 4.11.7-1-ARCH x86_64
- WebAssemblyを有効にしたLLVMを用意して、Rillをビルド
Dockerを使う場合は以下でいい感じになるはずです。(小さいイメージにするためキャッシュなどが消えており、apt-getなどがそのままではできないイメージになっています)
LLVM 4.0.0がインストールされています。ターゲットはX86とWebAssemblyに絞ってあります。
$ cd rill
$ docker run -it --rm -v $(pwd):/cibase yutopp/rill-build-env
> rm .omakedb .omakedb.lock *.omc # キャッシュが残っている場合のみ必要
> omake
- Binaryenをインストール(ホスト)
Binaryenをインストールします。ArchであればAURから入ります。
自分の環境では binaryen version_34
が入っています。
(binaryenの制約に引っかかったかバグを踏み抜いたようでabortするため、簡単なコードを使います)
- サンプルをコンパイルする(Dockerコンテナ)
examples/fib-static.rill
をコンパイルします。
> rillc/src/rillc --target=wasm32-unknown-unknown --format=asm -c examples/fib-static.rill
ターゲットにwasm32-unknown-unknown
を指定し、リンクなどは行わずにコンパイルだけ行います。
fib-static.s
というファイルが生成されていれば成功です。
- WASMにする(ホスト)
.s
ファイルそのままでは利用できないので、WASM形式に変換します。
$ s2wasm fib-static.s > fib-static.wast
$ wasm-as fib-static.wast > fib-static.wasm
fib-static.wasm
というファイルが生成されていれば成功です。
- index.htmlの準備(ホスト)
呼び出し元のindex.html
ファイルを作ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<script>
fetch('fib-static.wasm')
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.compile(buffer))
.then(module => {
let importObject = {
env: {
// assertは今回無視
rill_assert: (b) => {},
// printはアラートで出す
rill_print_int32: (i32) => { alert(`print_int32: ${i32}`); }
}
};
let instance = new WebAssembly.Instance(module, importObject);
instance.exports._Rill_main(); // main()呼び出し
});
</script>
</head>
<body>Hello</body>
</html>
生成したfib-static.wasm
を読み込むのと、Rillの標準関数の一部をjsで定義しています。
- アクセスする(ホスト)
適当なHTTPサーバを立てて、ブラウザからアクセスします。
$ python3 -m http.server
$ google-chrome-stable http://localhost:8000/index.html
ページを開いたら、アラートで print_int32: 102334155
と出ていれば成功です!
WASM用標準ライブラリやリンク周りの環境を整えてDOM操作をしたい!!