Slide 1

Slide 1 text

GoでWebAssembly @from_unknown

Slide 2

Slide 2 text

アジェンダ ● WebAssemblyとは ○ 利点と制約 ● GoでWebAssemblyをビルドする ● ブラウザ上で実行するためには ● 気になるポイント ○ 性能は? ○ Goroutineは? ● まとめ

Slide 3

Slide 3 text

WebAssemblyとは ● バイナリのインストラクションフォーマットである ● 複数の言語で書くことができる ○ C、C++、Rust、Go(次期バージョン正式対応)など ● ネイティブに近い速度で実行できる ● Javascriptを置き換えるのではなく、補完するものである ● 主要ブラウザがWebAssemblyの1.0に対応されている

Slide 4

Slide 4 text

WebAssemblyの利点 ● 効率的で実行速度が早い ● バイナリにコンパイルされるため、テキストのJavascriptよりサ イズが小さい ● 既存のCやC++などの資産を活かせる

Slide 5

Slide 5 text

WebAssemblyの制約 ● サンドボックスの中で実行され、Javascriptと同様の制約を受 ける(Same-originなど) ● 使用できるリソースの量は制限される ● マルチスレッドやガーベージコレクションは現時点ではサポー トされていない ● HTML内のDOMの操作を直接できない ○ DOMの操作はJavascriptを介して操作する

Slide 6

Slide 6 text

GoでWebAssemblyをビルドする Go and wasm: generating and executing wasm with Go https://blog.gopheracademy.com/advent-2017/go-wasm/ こちらも参考にしました サクッと Go → WebAssembly を試す https://qiita.com/cia_rana/items/bbb4112b480636ab9d87

Slide 7

Slide 7 text

GoでWebAssemblyをビルドする 以下の方法でWebAssembly対応が入ったbetaを取得する ● githubのgolang/goからソースを取得してビルドする ○ 既にmasterにWebAssembly対応が入っている ● githubのgolang/goのリリースからgo1.11betaXをダウンロー ドしてくる ● 公式のサブレポジトリにあるgo1.11betaXコマンドを使う

Slide 8

Slide 8 text

GoでWebAssemblyをビルドする WebAssembly対応が入ったGoコマンドのGOOSとGOARCHに 以下を指定してビルドするだけ GOOS=js GOARCH=wasm go build … 簡単ですね!

Slide 9

Slide 9 text

ブラウザ上で実行するためには ● WebAssemblyをブラウザ上で実行するには、 WebAssembly.instantiate()に以下を渡す必要がある ○ wasmファイル(ArrayBufferなどに読み込む必要あり) ○ (Optional)importObject ■ ここで渡したJavascriptのObjectがGo側から呼べる ※wasmファイルをArrayBufferなどにしなくても読み込める instantiateStreaming()が推奨されている様ですが、ブラウザサ ポートがマチマチの様です。

Slide 10

Slide 10 text

ブラウザ上で実行するためには wasm形式にコンパイルしたGoを実行するには ● Javascriptでwasmファイルを取得する ● go/src/misc/wasm内の以下のソースが必要 ○ wasm_exec.js ● WebAssembly.instantiate()にwasmファイルとwasm_exec.js 内のGo.importObjectを渡す ○ wasm対応で追加されたsyscall/jsと連携している ○ これのお陰でGo側からDOMの操作が出来る

Slide 11

Slide 11 text

気になるポイント ● 性能は? ● Goroutineは? デモ

Slide 12

Slide 12 text

まとめ ● GoでWebAssemblyは簡単に出来る ● ただし、まだBeta版なので仕様が変わることもあり ● wasm_exec.jsと連携することでJavascriptを実行することが 出来る ● wasmにすることで何でも性能がよくなる訳ではない ○ 軽い処理より重い処理に向いている ● まだまだ発展途上なので今後に期待

Slide 13

Slide 13 text

ご清聴ありがとうございました!