Slide 1

Slide 1 text

WebAssemblyの Web以外のことぜんぶ話す Takaya Saeki (@nullpo_head) Kernel/VM勉強会 online part 2

Slide 2

Slide 2 text

WebAssemblyと は?(一般的なやつ ウェブブラウザのクライアントサイドスク リプトとして動作する低水準言語である。 ブラウザ上でバイナリフォーマットの形で 実行可能であることを特徴とする [Wikipediaより] 応用例色々 - Web: Google Meet, Figma, AutoDesk - ゲーム

Slide 3

Slide 3 text

今日はそういう話はしません

Slide 4

Slide 4 text

今日のFocus: Web外Wasm ~Kernel/VM的wasm入門~

Slide 5

Slide 5 text

Web外wasmってやつがあります • Wasmer • Wasmをネイティブで動かすランタイム (Emscripten, WASI) • Envoy • パケットやHTTPリクエストの許諾や改変をwasmプラグインで書ける • Krustlet • Kubernetes上でwasmコンテナを実現する • Kernel-wasm • Linuxカーネル内でコンテキストスイッチ無しでWasmバイナリを動かす • Nabulet • Wasmでmicrokernelを高速に実現する => 一発ギャグではない! アツいフロンティアがある

Slide 6

Slide 6 text

WasmのWeb以外のこと全部話す 今日全部話すこと 1. Web外Wasmがなぜアツいのか 2. WasmがWebの外でどう使われているか 3. Web外Wasmのエコシステム 今日話さないこと 1. WasmのメインフィールドであるWebについて 2. Wasmの詳細な基本仕様について

Slide 7

Slide 7 text

何がwasmを そんなにアツくさせるのか

Slide 8

Slide 8 text

Wasmがなぜアツいのか • Wasmが夢見る世界は複合的な側面をもつ + Javaが目指したもの (portable executable) + CLIが目指したもの (common language bytecode VM) + NaClが目指したもの/eBPF (secure/isolated sandbox) + Lua (embeddable runtime) =>WasmのことをJVM againやeBPF againだと理解すると、 ほかの側面のアツさを見逃す

Slide 9

Slide 9 text

Wasmをアツくする特徴 Fast, safe, and portable semantics: • Fast • Safe • Well-defined • Hardware-independent • Language-independent • Platform-independent • Open Efficient and portable representation: • Compact • Modular • Efficient • Streamable • Parallelizable • Portable

Slide 10

Slide 10 text

Wasmをアツくする特徴 • Safe Untrustedなコードを安全に動かすことができる (like eBPF, NaCl) • JVMでは厳しい • Language-Independent 低レベルな言語を含め、言語を選ばない (like NaCl. CLIもやや実現 • JVM/eBPFでは現実的には厳しい • Portable/Platform-Independent 環境/OSを選ばない (like JVM • NaClでは厳しい • Open ホスト環境とのAPIインターフェースがオープンである (like Lua, NaCl • 今まで決定的な選択肢が存在しなかった Design Goalsの13個のGoalsから、注目する4つを抜粋

Slide 11

Slide 11 text

Wasmがなぜアツいのか(改 • Wasmが目指す世界は複合的な側面をもつ + Javaが目指したもの (Portable/Platform-Independent) + CLIが目指したもの (Language-Independent) + NaClが目指したもの/eBPF (Safe) + Lua (Open) =>WasmのことをJVM againやeBPF againだと理解すると、 ほかの側面のアツさを見逃す =>しかもそれぞれの需要のための投資が集中するからエコシス テムの発展が速いのも魅力

Slide 12

Slide 12 text

4つの特徴から見る言語仕様

Slide 13

Slide 13 text

Wasmの基礎言語仕様: 1. Language / 2. Platform Independent • 低レベルなスタックマシンのバイナリバイトコード • JVMやCLIとは違い、GCもオブジェクトのようなOOPの概念もない • ハーバードアーキテクチャ • 基本VMランタイムで動く • 言語仕様が小さいのでコンパイルも可能  様々なコンパイラが第1ターゲットとしてサポートできる (Like: NaCl / Unlike: JVM (Graal含む))  ホストアーキテクチャに依存しない (Like: JVM / Unlike: NaCl)

Slide 14

Slide 14 text

Wasmの基礎言語仕様: 3. Safe • ホストランタイムから隔離された単一メモリ空間を持つ • そしてハーバードアーキテクチャである • デフォルトでは外界に副作用を行えない • Structuredな言語構造しかない (block, loop… • ジャンプや条件付ジャンプ、CallなどはBasic Blockにしか飛べない • ローカル変数の存在 • CallスタックはVMが管理するのでVM上はControl Flow Integrityがある • VMの上の言語レベルでCFIがあるかどうかは話は別だけど.. • 構造化プログラミング以後のアセンブリ言語だとでも思ってください  UntrustedなコードをWasm VM上/AOTで動かすことができる (Like: NaCl, eBPF / Unlike: JVM) 参考資料:カーネル空間ですべてのプロセスを動かすには -TAL, SFI, Wasmとか - カーネル/VM探検隊15 (slideshare.net)

Slide 15

Slide 15 text

Wasmの基礎言語仕様: 4. Open Wasmはオブジェクトファイ ルフォーマットの仕様を含む • webでもなければアセンブリでも なければ言語仕様でもない・・・? • ホストにImport/Exportする 関数/変数etcの定義がある • しかし、具体的中身については 仕様では定めない(重要) • 最も一般的なのはJSとのglue • 似たものはあまりないが、 Luaが活躍しているフィールド Chapter 2. A look inside WebAssembly modules - WebAssembly in Action: With examples using C++ and Emscripten (manning.com) Portable, L.I., Safeな上で、 さらにOpenであることが Wasmに多様な応用を生む!

Slide 16

Slide 16 text

Wasm Embedding Interfaces Wasmはオブジェクトフォーマット. ELFが実際何をできるかはPOSIX/Linux/BSDが決めるように、 Wasmが何ができるかは外のInterfaceが決める • Web / JS • WASI • Proxy-Wasm • その他面白インターフェース • In-kernel • Ethereum • TEE • などなど

Slide 17

Slide 17 text

だからWasmは既存技術の リバイバル「ではない」!

Slide 18

Slide 18 text

Wasmがwebの外で どう使われてるか 特にWASIとProxy-Wasmついて

Slide 19

Slide 19 text

WASI • OSの上でwasm executableを動か すためのPortableなAPI / ABI • POSIXと同じか少し下のレイヤ • Safe/Portableさを利用している • 有名かつ直感的なEmbedding Interface • Bytecode Allianceによってコミュニ ティベースで仕様がメンテされてる • Mozilla, Fastly, Intel, Redhat…

Slide 20

Slide 20 text

WAI APIの例 • FS, processなどのインターフェースを定義 • ここにAPIがドドーンとある:WASI/docs.md at main · WebAssembly/WASI (github.com) Standardizing WASI: A system interface to run WebAssembly outside the web - Mozilla Hacks - the Web developer blog

Slide 21

Slide 21 text

WASI セキュリティ • 独自のセキュリティ機構をもつ(予定) • WasmはSafeでIsolated! …本当? 語弊がある. ホストが提供するAPI (systemcall)の安全性に依存する • Capability Baseのセキュリティ機構 • 例えばFSのアクセスはディレクトリごとにcapabilityを 取得する必要がある • 多くのMicrokernelを想起させる機構 • まだまだ策定中 • イメージとしては、スマホアプリのようなセキュリティモデルが 実現できるようになる(かも) • ネイティブみたいにSeccompでガチガチに固めたりしなくていい  WASIはPortableな実行ランタイムであり、 しかもセキュリティ的にexecutableとしても先進性がある

Slide 22

Slide 22 text

Proxy-wasm WebAssembly for Proxies • Portable/Safe/Openさを利用 • Envoyがリファレンス実装 • Nginxなども試験実装がある • L4/L7 リクエスト/レスポンスを 自由にこねくり回すロジックをWasmが 発行するためのEmbedding Interface • Envoyまわりの人たちが中心のコミュニティ 主導でメンテされている • Google, Tetrate…

Slide 23

Slide 23 text

どういうこと? • パケットやHTTP通信が 来た時に呼ばれる関数をWasm 側からexport • EnvoyなどのProxyは通信が発生 したさいにその関数を 呼ぶ • Wasm側はそこでさらに、 Proxy側が定義したAPIを読んで ログを書きだすなりレスポンス を返すなりする  Wasmのランタイムとの 双方向のインターフェースに よって実現

Slide 24

Slide 24 text

Proxy-wasmはなぜうれしい? • Envoyで言えば、同じ仕組みを前からC++ static libraryを プラグインとして差し込むことで実現できた • 比較してwasmの利点 • Safe • Untrustedなコードを実行できる • Wasm側がクラッシュしてもProxy側に影響がない • Portable • アーキテクチャ/CPU非依存に実現できる • Language Independent • C++だけでなく、RustやGoでproxy pluginを実装できる  これはかなり便利な一般化できる話. 現在だとLuaのフィールド

Slide 25

Slide 25 text

Proxy-wasmのモチベーションの 一般化が教えてくれること • 一般に、双方向のAPI(hostcall/guestcall)が欲しくて、 Safeでportable, そしてfastに動いてほしい場所にwasmが適用可能 • カーネル内の実行可能ファイル • イーテリアム • 一般のプラグイン機構 • みなさんもこれWasmでもっとうまくやれるんじゃね? というユースケースを考えよ う! • 特定の組み込み言語を使っている • 特定の言語向けにしかAPIがない • 双方向のAPIを必要とする • APIを用意してあげたいがIPCのコストは許容できない • 例えばVimのようなエディタ, ETL..? •

Slide 26

Slide 26 text

プロプライエタリプロダクトの 有名なWasm組み込み事例 CDN • CDNのエッジでパケット操作のロジックを書くために利用する • FastlyのLucet • VCLの流れ • CloudFlare • Proxy-wasmとまったく同じモチベーション. というかFastlyが多分元祖.

Slide 27

Slide 27 text

Proxy-wasm WebAssembly for Proxies • Portable/Safe/Openさを利用 • Envoyがリファレンス実装 • Nginxなども試験実装がある • L4/L7 リクエスト/レスポンスを 自由にこねくり回すロジックをWasmが 発行するためのEmbedding Interface • Envoyまわりの人たちが中心のコミュニティ 主導でメンテされている • Google, Tetrate…

Slide 28

Slide 28 text

Proxy-wasm WebAssembly for Proxies • Portable/Safe/Openさを利用 • Envoyがリファレンス実装 • Nginxなども試験実装がある • L4/L7 リクエスト/レスポンスを 自由にこねくり回すロジックをWasmが 発行するためのEmbedding Interface • Envoyまわりの人たちが中心のコミュニティ 主導でメンテされている

Slide 29

Slide 29 text

WASI的なモチベーションの応用 WASIのモチベーション(Safe & Portable)も一般化できる • Krustlet • Wasm OCI Image • Wasm • FaaS • みなさんもユースケースを(略 • 特定の言語ランタイムしか受け付けないインフラ • Seccompやcgroupで実行ファイルをガチガチに固める状況

Slide 30

Slide 30 text

Web外Wasmのエコシステム

Slide 31

Slide 31 text

Ecosystem 今回はつぎの二つについてさらっと紹介. 名前だけでも覚えて帰ってください • Runtime • ToolChain

Slide 32

Slide 32 text

Wasm Runtimes ※ざっと見ただけなので不正確な紹介になっている可能性があります • Wasmtime • Bytecode alliance project • リファレンス実装的側面がある • JITネイティブコード生成バックエンドはCranelift • Wasmer • Wasmer社が開発している • バックエンドはCranelift, singlepass, LLVM • Lucet • Bycode alliance project. Fastly社由来 • CDNで使われている. AOTができる. Wasmtimeと多くのコンポーネントを共有 • WAVM • LLVMをつかってコードを生成するらしい • Wasm3 • JITをしない代わりに組み込みやすく、高速なインタプリタ • V8 • 言わずと知れたやつ. みなさんが思ってるよりは組み込みやすい ほかにもいっぱいあるはず

Slide 33

Slide 33 text

Toolchain 多くの言語が言語ネイティブのツールチェインが バックエンドとしてwasmをサポート(そうでないものもある • 現状webassembly.orgにリストされている言語 • C/C++ • Rust • C# • F# • Go • Kotlin • Swift • D • Pascal • Zig

Slide 34

Slide 34 text

新しい低レイヤ Wasmはまだまだエコシステムが未熟なので、 整備中ものがたくさんある • Dynamic link • Dwarf / Debugger • Inter-Language Type Procedure 今の時代に低レイヤの仕様が スクラッチから開発されるのを見るのは楽しい

Slide 35

Slide 35 text

Summary • Wasmは複合的なアツさをもつ + Javaが目指したもの (Portable/Platform-Independent) + CLIが目指したもの (Language-Independent) + NaClが目指したもの/eBPF (Safe) + Lua (Open) • 特にOpenさが多様な応用先を生む • 例えば以下のようなspecがある • WASI • Proxy-wasm • これから色々な分野で応用されていくはず • あなたも君だけのWasm Embedding Interfaceを考えよう