Skip to content
yutopp edited this page Sep 15, 2017 · 1 revision

メモ

Rillの試験機能を試すメモなどを書いていきます。

WebAssemblyを使ってみる

下準備

以下は、Rillのビルドと利用はDockerコンテナ内で行い、それ以外はホストで直に実行する想定です。
環境: GNU/Linux 4.11.7-1-ARCH x86_64

  1. 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
  1. Binaryenをインストール(ホスト)

Binaryenをインストールします。ArchであればAURから入ります。

自分の環境では binaryen version_34 が入っています。

試してみる

(binaryenの制約に引っかかったかバグを踏み抜いたようでabortするため、簡単なコードを使います)

  1. サンプルをコンパイルする(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というファイルが生成されていれば成功です。

  1. WASMにする(ホスト)

.sファイルそのままでは利用できないので、WASM形式に変換します。

$ s2wasm fib-static.s > fib-static.wast
$ wasm-as fib-static.wast > fib-static.wasm

fib-static.wasmというファイルが生成されていれば成功です。

  1. 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で定義しています。

  1. アクセスする(ホスト)

適当なHTTPサーバを立てて、ブラウザからアクセスします。

$ python3 -m http.server

$ google-chrome-stable http://localhost:8000/index.html

ページを開いたら、アラートで print_int32: 102334155 と出ていれば成功です!

今後

WASM用標準ライブラリやリンク周りの環境を整えてDOM操作をしたい!!

Clone this wiki locally