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

5分で理解するWebAssemblyのWebの外の話 PHPはマイコンの夢を見るか?

usuyuki
March 08, 2024

5分で理解するWebAssemblyのWebの外の話 PHPはマイコンの夢を見るか?

usuyuki

March 08, 2024
Tweet

More Decks by usuyuki

Other Decks in Technology

Transcript

  1. まずはWasmの原典へ…… “Bringing the Web up to Speed with WebAssembly” Andreas

    Haas et al. Google, MicroSoft, Apple, Mozillaの共著論文 Introductionに Wasmの要件(should have)が書かれている 8
  2. Should have 1. Safe, fast, and portable semantics a. safe

    to execute b. fast to execute c. language-, hardware-, and platform-independent d. deterministic and easy to reason about e. simple interoperability with the Web platform 2. Safe and efficient representation a. compact and easy to decode b. easy to validate and compile c. easy to generate for producers d. streamable and parallelizable 9
  3. Should have 1. Safe, fast, and portable semantics a. safe

    to execute b. fast to execute c. language-, hardware-, and platform-independent d. deterministic and easy to reason about e. simple interoperability with the Web platform 2. Safe and efficient representation a. compact and easy to decode b. easy to validate and compile c. easy to generate for producers d. streamable and parallelizable 10
  4. Wasmの仕様を見てみる 17 より詳しく知りたい方は PHPerKaigi 2024 Day1 14:40~ TrackA “WebAssembly を理解する

    〜VM の作成を通して〜 by nsfisis” の方を御覧いただきたいです🙏
  5. 名前 型 i32, i64 整数(32bit, 64bit) f32,f64 浮動小数点数(32bit, 64bit) (memory)

    (線形メモリ) ※⼀部のランタイムではVector型や参照型,複数値をサポート Wasmの型 18
  6. 名前 型 i32, i64 整数(32bit, 64bit) f32,f64 浮動小数点数(32bit, 64bit) (memory)

    (線形メモリ) ※⼀部のランタイムではVector型や参照型,複数値をサポート 数値は扱える 19 Wasmの型
  7. 名前 型 i32, i64 整数(32bit, 64bit) f32,f64 浮動小数点数(32bit, 64bit) (memory)

    (線形メモリ) ※⼀部のランタイムではVector型や参照型,複数値をサポート それ以外は線形メモリで表現 20 Wasmの型
  8. 21 (func i32.const 1 (if (then i32.const 1 call $log

    ) (else i32.const 0 call $log ) ) ) ⾼級⾔語っぽいシンタックス
  9. 具体例 Wasm (import "env" "print" (func $print ( param i32)))

    ;;中略 call $print JavaScript let memory = new WebAssembly.Memory({ initial: 1 }); let importObject = { env: { buffer: memory, print: function (len) { // printする関数の実装 import命令でランタイムから関数などを受け取れる! 25
  10. Wasm (import "env" "print" (func $print ( param i32))) ;;中略

    call $print JavaScript let memory = new WebAssembly.Memory({ initial: 1 }); let importObject = { env: { buffer: memory, print: function (len) { // printする関数の実装 ←call命令で呼び出し可能! 具体例 26
  11. (import "env" "print" (func $print ( param i32))) ;;中略 call

    $print Wasm JavaScript let memory = new WebAssembly.Memory({ initial: 1 }); let importObject = { env: { buffer: memory, print: function (len) { // printする関数の実装 具体例 27
  12. (import "env" "print" (func $print ( param i32))) ;;中略 call

    $print Wasm JavaScript let memory = new WebAssembly.Memory({ initial: 1 }); let importObject = { env: { buffer: memory, print: function (len) { // printする関数の実装 具体例 28
  13. (import "env" "print" (func $print ( param i32))) ;;中略 call

    $print Wasm JavaScript let memory = new WebAssembly.Memory({ initial: 1 }); let importObject = { env: { buffer: memory, print: function (len) { // printする関数の実装 具体例 29
  14. 41

  15. 1. WASI Preview1 2. WASI Preview2 3. WASIX • Wasmer社が独自に仕様定義

    • POSIX互換の関数群 • いろいろできる 49 • Bytecode Allianceが標準化 • 脱POSIX風味 • HTTP通信までサポート • Bytecode Allianceが標準化 • POSIX風味がある • 標準出力など一部のみの定義 時間の都合上,割愛!!!!! 2. CLI向けのWasmランタイムの場合 CLI版Wasmのインターフェース仕様
  16. Wasmの仕様と実装 WebAssembly仕様 (Version1, Version2) W3C 仕 様 実 装 Webブラウザ

    Chrome, Safari, Firefox… Wasmインタプリタ (CLI) Wasmtime, Wasmer, wazero, Wasm3, … JSランタイム Node.js, Deno, Bun, … Wasmインタプリタ (CLI) Wasmtime, Wasmer, wazero, Wasm3, … Webブラウザ Chrome, Safari, Firefox… Wasmランタイム (CLI) Wasmtime, Wasmer, wazero, Wasm3, … JSランタイム Node.js, Deno, Bun, … Wasmランタイム (埋め込み) Wasmtime, Wasmer, wazero, Wasm3, … WASIXの仕様 Wasmer WASIの仕様 Bytecode Alliance 50
  17. 2. CLI向けのWasmランタイムでの対処 1. WASI Preview1 2. WASI Preview2 3. WASIX

    WASI Preview1に対応した php/php-srcのWasm版が存在 51 PHPインタプリタ
  18. でもphp/php-srcは  Wasmを通じて   いろいろな場所で動く 世界になってきた! 63 x86, x86_64, ARM, RISC-V, PowerPC,

    MIPS, Xtensa, ARC32, ... Linux, Windows, OS X, FreeBSD, Android, iOS ブラウザ,スマホ,PC,マイコン PHPインタプリタ
  19. ご清聴ありがとうございました! 1. Andreas Haas et al.“Bringing the web up to

    speed with WebAssembly”, PLDI 2017: Proceedings of the 38th ACM SIGPLAN Conference on Programming Language Design and Implementation, pp.185–200, 2017 2. Rick Battagline, 株式会社クイープ.“入門WebAssembly”, 翔泳社, 2021 3. WebAssembly Community Group.“WebAssembly Specification”. WebAssembly 2.0 (Draft 2024-03-05). 2024-03-07. https://webassembly.github.io/spec/core/binary/modules.html 4. 永野(@glassmonekey) .“PHPをブラウザで動かす技術”, PHPerKaigi2023 day0 Track B 5. Philip Kindred Dick,浅倉 久志.“アンドロイドは電気羊の夢を見るか?”,早川書房 ,1977 参考⽂献 64