Wasmめも
セキュリティ: サンドボックス環境
ポータビリティ: バイナリフォーマット(Wasmのランタイムがあればどこでも動く)
システムコールの話
Wasmは完全なサンドボックスとして提供されているため、Wasmモジュールから直接システムコールへアクセスする術を持ち合わせてはいない。
→実行時にシステムコールにアクセス可能なモジュールをインポートする必要がある(独自実装)
Goとの関わり
Go 1.11以降Wasmへのビルドをサポート
GoのWasmモジュールは実行するために独自のインターフェースを持っている(公式提供)
jsから実行するにはwasm_exec.jsが必要 →(知らないとわからない)
cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
code: js
import "./wasm_exec.js";
const filepath = new URL(
"./hello.wasm",
import.meta.url
)
const go = new Go();
const {instance} = await WebAssembly.instantiateStreaming(fetch(filepath), go.importObject)
go.run(instance);
deno run --allow-read run.js
同じWasmモジュールであっても実行方法が異なると透過的にプログラムを実行するのが困難。(どの言語でWasmモジュールが作られたかを利用者が知る必要がある)
→WASIの登場(WebAssembly System Interface)
WASIをサポートしているランタイムであれば、どのような言語を用いてビルドされたモジュールなのかを意識する必要がない。(Go 1.21からWASIのプレビュー1がサポートされた)
WASIをサポートしているWasmランタイみゅ(wastime等)を利用することでGoからビルドされたWasm モジュールを直接使える
code:main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
// GOARCH=wasm GOOS=wasip1 go build -o hello.wasi.wasm main.go
// wasmtime hello.wasi.wasm
Wasmランタイムについて