Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WebAssembly Hands-on! ~ powered by Dev Containers ~

Naoya
November 17, 2022

WebAssembly Hands-on! ~ powered by Dev Containers ~

Naoya

November 17, 2022
Tweet

More Decks by Naoya

Other Decks in Programming

Transcript

  1. 6 ▹ ブラウザで動作するハイパフォーマ ンスなコード ▹ バイナリ(.wasm)の手前に人が読め る中間表現であるテキスト形式 (.wat)がある ▹ C/C++やRustのコンパイル対象と

    なっている ▹ jsから.wasmを呼び出して実行する WebAssembly 6 .watの例 https://developer.mozilla.org/ja/docs/WebAssembly/Understa nding_the_text_format .wasmをjsから呼び出す例 https://developer.mozilla.org/ja/docs/WebAssembly/Understa nding_the_text_format
  2. Dev Containersの概念図 https://code.visualstudio.com/docs/devcontainers/containers 8 ▹ VSCodeのextension ▹ Dockerコンテナを開発環境として利 用できる ▹

    extensionやコード補完もコンテナ 内で動作 ▹ VSCodeのterminalもコンテナ内で 実行される ▹ extensionを含めた開発環境の共有 が容易に Dev Containers 8
  3. [package] name = "wasm-rust" version = "0.1.0" edition = "2021"

    [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2" 下記の通りCargo.tomlを記述 16 Step 6 16
  4. use wasm_bindgen::prelude::*; #[wasm_bindgen] extern { pub fn alert(s: &str); }

    #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("hello {}", name)); } 下記の通りlib.rsを記述 17 Step 7 17
  5. <!DOCTYPE html> <html lang="en-US"> <head><meta charset="utf-8"></head> <body> <script type="module"> import

    init, { greet } from "./pkg/wasm_rust.js"; init() .then(() => { greet("world") }); </script> </body> </html> 下記の通りindex.htmlを記述 19 Step 9 19
  6. ▹ 実はブラウザだけじゃなくNode.jsでもWebAssemblyオブジェクトが使える ■ https://developer.mozilla.org/en-US/docs/WebAssembly#browser_com patibility ▹ Google EarthはWebAssemblyで作られている ■ https://medium.com/google-earth/google-earth-comes-to-more-brows

    ers-thanks-to-webassembly-1877d95810d6 ▹ .watを手書きしている記事 ■ https://www.kabuku.co.jp/developers/webassembly ▹ 最速でWebAssemblyだけ試すならこちら(ChromeのConsoleいじるだけ) ■ https://nulab.com/ja/blog/nulab/basic-webassembly-begginer/ 26 Appendix 26