4. Copyright ? 2020 IIJ Innovation Institute Inc.
?今日話すこと
? そもそもWebAssemblyとは
? 現在のWebAssemblyの活躍
? なぜ安全か
? ウェブブラウザー以外における活躍
? これからの活躍
5. Copyright ? 2020 IIJ Innovation Institute Inc.
そもそもWebAssemblyとは
? ウェブブラウザー上でJavaScriptのように(プラグインなしで)動
作させることを目的として作られた命令セットと、そのバイナリー
フォーマット
? 2017年11月、主要な4つのウェブブラウザー(Chrome?Firefox?
Safari?旧Edge)がver. 1.0をサポート
? 2019年12月、W3CによりHTML?CSS?JavaScriptに続く「ウェブ
ブラウザーで動く4つめの言語」として標準化
? World Wide Web Consortium (W3C) brings a new language to the Web
as WebAssembly becomes a W3C Recommendation
6. Copyright ? 2020 IIJ Innovation Institute Inc.
現在のWebAssemblyの活躍
? Google Meet
? FFMPEG.WASM
? Blazor WebAssembly
? Showcase | Magnum Engine
7. Copyright ? 2020 IIJ Innovation Institute Inc.
Google Meet
Google AI Blog: Background Features in Google Meet, Powered by
Web ML
? 背景ぼかし機能の実装にWebAssemblyが!
? C++で書かれたGoogle製機械学習フレームワーク MediaPipe
をWebAssemblyにコンパイルして実現
? 関連: WebAssemblyでの機械学習モデルデプロイの動向
8. Copyright ? 2020 IIJ Innovation Institute Inc.
FFMPEG.WASM
https://ffmpegwasm.github.io/
? 様々なコーデックを利用して動画や音声の変換ができるCLIツー
ル ffmpeg をWebAssemblyに移植!
? 動画のエンコードなどが全部ウェブブラウザー上で完結!
9. Copyright ? 2020 IIJ Innovation Institute Inc.
Blazor WebAssembly
https://docs.microsoft.com/ja-jp/aspnet/core/blazor/hosting-
models?view=aspnetcore-5.0
? ASP.NET Core Blazor: C#?F#向けウェブアプリケーションフレ
ームワーク
? クライアントもサーバーも概ねC#で書ける
? 実行モデルを切り替えれば主要な処理をサーバーで実行したり
WebAssemblyで実行したりと切り替えられる
10. Copyright ? 2020 IIJ Innovation Institute Inc.
Showcase | Magnum Engine
https://magnum.graphics/showcase/
? 「Magnum Engine」というC++向けグラフィックスエンジンのサン
プル集
11. Copyright ? 2020 IIJ Innovation Institute Inc.
なぜ安全か
? ホストのAPIからの分離
? ホストのデータからの分離
? index空間の分離
12. Copyright ? 2020 IIJ Innovation Institute Inc.
なぜ安全か
用語
? ホスト: ウェブブラウザーなど、WebAssemblyを動作させること
ができるプログラム
? 後述のとおりブラウザー以外でもWebAssemblyを動かすプログラムがある
? index空間: 配列の添え字(index)の集合
? e.g. 長さ50の配列であれば0から49までの50個のindexの集合
? 「名前空間」の「名前」を文字列から整数に置き換えたバージョン
? WAT
? 「WebAssembly Text Format」の略
? WebAssemblyはバイナリーフォーマットなので直接人間が読むのは難しい
ため、テキストファイルとして読めるよう翻訳したもの
? 「普通の機械語」に対する「アセンブリー」と同じ役割
13. Copyright ? 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
WebAssemblyでは
? 原則: ホストのメモリーには勝手にアクセスできない!
? ホストとデータをやりとりしたくなったら
? Memoryオブジェクトが表す、割り当てられた専用の領域を使う
? ホスト側でサイズを指定して作って、WebAssemblyを呼ぶときに渡す
14. Copyright ? 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
コード例 (WAT):
この行でMemoryをimportする必要が
あることを明示
15. Copyright ? 2020 IIJ Innovation Institute Inc.
ホストのデータからの分離
コード例 (Node.js):
ここでMemoryを作って
ここでimport
ここで書き込み
出力: 7
16. Copyright ? 2020 IIJ Innovation Institute Inc.
ホストのAPIからの分離
普通の機械語では
? リンクした関数やOSのシステムコールは原則どのモジュールも
呼べちゃう!
? あなたがダウンロードした悪質なプログラムが、意図しない関数
を呼ぶかも知れない!
※アセンブリーの内容に特に意味はありません
17. Copyright ? 2020 IIJ Innovation Institute Inc.
ホストのAPIからの分離
WebAssemblyでは
? 明示的にimportした外部の関数しか呼べない!
? 何も明示しない限りは何もできない
? ※もう一つ、間接呼び出しを実現するためのTableという機能が
ありますが割愛
ここでimportした関数しか呼べない!
20. Copyright ? 2020 IIJ Innovation Institute Inc.
index空間の分離
関数呼び出し命令callの場合
? callの引数に渡せるのは、関数専用のindexだけ!
? (func …)で定義した関数の他importした関数が含まれる
? 関数専用のindex空間が区切られている
21. Copyright ? 2020 IIJ Innovation Institute Inc.
index空間の分離
ブロックから抜け出す命令brの場合
? brに渡せるのは、brを囲っているブロックのうち、「内側から何
番目のブロックから抜け出すか」を表すindexのみ指定できる
? 図ではbrしている箇所で3つのblockに囲われているので0, 1, 2のい
ずれか
22. Copyright ? 2020 IIJ Innovation Institute Inc.
ウェブブラウザー以外における活躍
? PostgreSQL
? Envoy Proxy
? Krustlet
? WASI
23. Copyright ? 2020 IIJ Innovation Institute Inc.
PostgreSQL
Announcing the first Postgres extension to run WebAssembly
? PostgreSQLのSQLからWebAssemblyで定義した関数が呼べ
る!
24. Copyright ? 2020 IIJ Innovation Institute Inc.
Envoy Proxy
Istio / Redefining extensibility in proxies - introducing
WebAssembly to Envoy and Istio
? Microservice向けのプロキシサーバー
? 「独自の認証?認可機構を使いたい」?「標準でサポートされてないプロトコル
を扱いたい」といったケースのために、拡張機能が
? 従来:
? C++で拡張を書いて静的リンク
? => 速いけどリビルドが必要で気軽じゃない
? Mixerというアダプターにprotobufでメッセージを送る
? => 気軽だけど遅い
? WebAssemblyなら
? デプロイも簡単で動作も速い
? いろいろな言語をサポートできる
? 一般化するために仕様も策定中:
? https://github.com/proxy-wasm
25. Copyright ? 2020 IIJ Innovation Institute Inc.
Krustlet
What is Krustlet?
? KubernetesのノードとしてのWebAssembly処理系wasmtimeを
動かす
? Dockerのimageの代わりに、WebAssemblyのモジュールをとっ
てきてKubernetesクラスターにデプロイできる
26. Copyright ? 2020 IIJ Innovation Institute Inc.
WASI
WASI: WebAssembly System Interface
? WebAssemblyがPOSIX風のAPIを利用できるようにするための
標準仕様
? importしない限りprintfとかopenとかが使えない!
? => importする関数の名前や型を決めましょう!
? WebAssemblyがアクセスできるファイル?ディレクトリーを制限す
る機能を提供することで、セキュリティーを保つ
? importしないとホストのAPIを利用できないのと同様に、ファイル?ディレク
トリーにもホストが明示的な許可を与える仕組みを
28. Copyright ? 2020 IIJ Innovation Institute Inc.
Docker v.s. WebAssembly
DockerのCo-founder, Solomon HykesさんのTwitterでの発言
? 「2008年にWebAssemblyとWASIがあれば、Dockerを作る必要
はなかっただろう」
? Krustletのような仕組みが発達すれば、コンテナーの代わりに
WebAssemblyという時代が来る?
29. Copyright ? 2020 IIJ Innovation Institute Inc.
Shopify
Making Commerce Extensible with WebAssembly, Mitch Dickinson
- YouTube
? テナントのいろいろな要求をテナント側のコードで実現するため
に、Shopifyのサーバーで動くWebAssemblyによるプラグイン機
構を構築中
? Web APIで実現するよりも高速!
30. Copyright ? 2020 IIJ Innovation Institute Inc.
Flash Playerの移植
ruffle-rs/ruffle: A Flash Player emulator written in Rust
? 2020年末(もうすぐ!)サポートが終了するFlash Player
? Flashの資産をなくさないためWebAssemblyでエミュレート!
? WebAssemblyでできること以上のことはできないので、あらゆる
Flashが動くわけではないはず
? 危険なFlashが動く可能性がその分低いということ!
31. Copyright ? 2020 IIJ Innovation Institute Inc.
まだまだパーツが足りない
? 「活躍」とはいったものの、実験的なものが大半で、広く使われる
には至っていない
? CやC++, Rustなど以外の言語を動かすとWebAssemblyのサイ
ズが膨らんでしまったり、
? ホストとWebAssembly間のデータの受け渡しが煩雑だったり、
など多くの問題が
32. Copyright ? 2020 IIJ Innovation Institute Inc.
WASIのさらなる発展
? 現状はファイルシステムや乱数、環境変数やコマンドライン引数
の処理が中心
? ソケットに接続したり、リッスンするAPIは策定中!
? feat(socket): berkeley socket API by 3miliano ? Pull Request #312 ?
WebAssembly/WASI