Slide 1

Slide 1 text

5分で理解するWebAssembly のWebの外の話 PHPはマイコンの夢を⾒るか? うすゆき PHPerKaigi 2024 Day1(⅜) Track A ルーキーズLT 17:05~

Slide 2

Slide 2 text

うすゆき 来月から社会人! 去年は当日スタッフ! PHP4.1.2 < 年齢 < PHP4.1.1 2

Slide 3

Slide 3 text

3 PHPを様々な場所で動かしてぇ

Slide 4

Slide 4 text

でも,環境差異が…… 4 OS, アーキテクチャ, etc…

Slide 5

Slide 5 text

過去のカンファレンスで WebAssembly(以後Wasm)を使って PHPをブラウザで動かす登壇がある…… 5

Slide 6

Slide 6 text

しかも, Wasmは実行環境に依存せず Webの外でも動くらしい 6

Slide 7

Slide 7 text

7 Wasm

Slide 8

Slide 8 text

まずはWasmの原典へ…… “Bringing the Web up to Speed with WebAssembly” Andreas Haas et al. Google, MicroSoft, Apple, Mozillaの共著論文 Introductionに Wasmの要件(should have)が書かれている 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

language-, hardware-, and platform-independent 11

Slide 12

Slide 12 text

language-, hardware-, and platform-independent 12

Slide 13

Slide 13 text

language-independent C/C++ Wasm Rust Go Java 13 コンパイラ

Slide 14

Slide 14 text

language-, hardware-, and platform-independent 14

Slide 15

Slide 15 text

hardware-, and platform-independent OS Wasm Wasmランタイム ISA 15

Slide 16

Slide 16 text

hardware-, and platform-independent OS WebAssembly Wasmランタイム ISA Webブラウザ,CLI,埋め込み向けの Wasmランタイムが存在! 16

Slide 17

Slide 17 text

Wasmの仕様を見てみる 17 より詳しく知りたい方は PHPerKaigi 2024 Day1 14:40~ TrackA “WebAssembly を理解する 〜VM の作成を通して〜 by nsfisis” の方を御覧いただきたいです🙏

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

21 (func i32.const 1 (if (then i32.const 1 call $log ) (else i32.const 0 call $log ) ) ) ⾼級⾔語っぽいシンタックス

Slide 22

Slide 22 text

22 ミニマムな仕様

Slide 23

Slide 23 text

23 ミニマムな仕様 Wasm単体では標準出力すらできない!

Slide 24

Slide 24 text

24 Wasm単体では標準出力すらできない! 機能を外部から注入して動作 ミニマムな仕様

Slide 25

Slide 25 text

具体例 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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

(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

Slide 28

Slide 28 text

(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

Slide 29

Slide 29 text

(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

Slide 30

Slide 30 text

language-, hardware-, and platform-independent の仕組みこそが を実現 (import "env" "print" (func $print ( param i32))) 30 環境依存の処理はWasmの外!

Slide 31

Slide 31 text

5分で理解するWebAssembly のWebの外の話 PHPはマイコンの夢を⾒るか? うすゆき 環境に依存しないWasmの仕様によって! が可能に!

Slide 32

Slide 32 text

めでたしめでたし 32

Slide 33

Slide 33 text

これまでOSが提供してくれた標準出力等を 自前で用意するの 大変すぎでは!? 33

Slide 34

Slide 34 text

この問題は 先人が解決済み 34

Slide 35

Slide 35 text

1. Webブラウザ, JSランタイムの場合 2. CLI向けのWasmランタイムの場合 解決手法は実行場所により異なる 35

Slide 36

Slide 36 text

1. Webブラウザ, JSランタイムの場合 2. CLI向けのWasmランタイムの場合 解決手法は実行場所により異なる 36

Slide 37

Slide 37 text

1. Webブラウザ, JSランタイムの場合 Wasmコンパイル時に 対応するJSを一緒に生成するツール が存在 37

Slide 38

Slide 38 text

C/C++コード Wasm 対応するJavaScript (グルーコード) Emscripten 38 1. Webブラウザ, JSランタイムの場合

Slide 39

Slide 39 text

Emscriptenと開発者の努力で などがブラウザで動いている ● PHP Playground ● WordPress ● Dockerコンテナ 39

Slide 40

Slide 40 text

Emscriptenでphp/php-srcも ビルドできる! ビルドされたwasmを見てみる PHPインタプリタ 40

Slide 41

Slide 41 text

41

Slide 42

Slide 42 text

システムコールっぽいものが出てくる 42

Slide 43

Slide 43 text

システムコールっぽいものが出てくる 43 Emscriptenは システムコールをJSで実装

Slide 44

Slide 44 text

Wasmはなんかすごいアセンブリ つまり 44

Slide 45

Slide 45 text

Wasmはなんかすごいアセンブリ Emscriptenなどのコンパイラが大活躍! つまり 45

Slide 46

Slide 46 text

1. Webブラウザ, JSランタイムの場合 2. CLI向けのWasmランタイムの場合 解決手法は実行場所により異なる 46

Slide 47

Slide 47 text

2. CLI向けのWasmランタイムの場合 (基本的に)JSが使えない ランタイム側に予め実装←インターフェースは標準化 47

Slide 48

Slide 48 text

CLI版Wasmのインターフェース仕様 1. WASI Preview1 2. WASI Preview2 3. WASIX 48 2. CLI向けのWasmランタイムの場合

Slide 49

Slide 49 text

1. WASI Preview1 2. WASI Preview2 3. WASIX ● Wasmer社が独自に仕様定義 ● POSIX互換の関数群 ● いろいろできる 49 ● Bytecode Allianceが標準化 ● 脱POSIX風味 ● HTTP通信までサポート ● Bytecode Allianceが標準化 ● POSIX風味がある ● 標準出力など一部のみの定義 時間の都合上,割愛!!!!! 2. CLI向けのWasmランタイムの場合 CLI版Wasmのインターフェース仕様

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

2. CLI向けのWasmランタイムでの対処 1. WASI Preview1 2. WASI Preview2 3. WASIX WASI Preview1に対応した php/php-srcのWasm版が存在 51 PHPインタプリタ

Slide 52

Slide 52 text

vmware-labs/webassembly-language-runtimes 52

Slide 53

Slide 53 text

vmware-labs/webassembly-language-runtimes 複数のCLI Wasmランタイムで起動を確認! wasmtime Wasm3 wazero 53

Slide 54

Slide 54 text

ファイルを指定しての実行はできない 54 vmware-labs/webassembly-language-runtimes

Slide 55

Slide 55 text

対話モードでechoできることを確認! 55 vmware-labs/webassembly-language-runtimes

Slide 56

Slide 56 text

vmware-labs/webassembly-language-runtimes 複数のCLI Wasmランタイムで起動を確認! wasmtime Wasm3 wazero 56

Slide 57

Slide 57 text

vmware-labs/webassembly-language-runtimes 複数のCLI Wasmランタイムで起動を確認! wasmtime Wasm3 wazero マイコンでも動く! 57

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

php/php-srcのWASI版Wasmを マイコンに書き込んでみる…… 59 PHPインタプリタ

Slide 60

Slide 60 text

手元のマイコン(ESP32-S3)では 容量オーバー…… (サイズ小さくするのは難しい) 60

Slide 61

Slide 61 text

PHPはまだマイコンの夢は見れない 61

Slide 62

Slide 62 text

でもphp/php-srcは  Wasmを通じて   いろいろな場所で動く 世界になってきた! 62 PHPインタプリタ

Slide 63

Slide 63 text

でもphp/php-srcは  Wasmを通じて   いろいろな場所で動く 世界になってきた! 63 x86, x86_64, ARM, RISC-V, PowerPC, MIPS, Xtensa, ARC32, ... Linux, Windows, OS X, FreeBSD, Android, iOS ブラウザ,スマホ,PC,マイコン PHPインタプリタ

Slide 64

Slide 64 text

ご清聴ありがとうございました! 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