Slide 1

Slide 1 text

go:wasmexport 2024.9 Niigata 5分 Tech #12

Slide 2

Slide 2 text

asuka (@a_skua) ● 株式会社モニクル ○ SWE / プロダクトSRE ● WebAssemblyの同人誌を書いている人 ○ WebAssemblyでできること ■ 商業誌版:実践入門WebAssembly ○ ご注文はWASIですか? ○ ご注文はWASIですか?? ○ WebAssembly Cookbook vol.1 2 WHOIS

Slide 3

Slide 3 text

そういえば... 3 Niigata 5分 Techであんまり技術の話をしていない ● N5T#5 AssemblyScriptではじめるWebAssembly入門 ● N5T#8 技術書典16オフライン振り返り ● N5T#10 エンジニアコミュニティ

Slide 4

Slide 4 text

Wasmの話をします

Slide 5

Slide 5 text

Go1.23時点のWasmサポート状況

Slide 6

Slide 6 text

Go1.23時点のWasmサポート状況 go:wasmimportという構文をサポートしている ● Go1.21とWebAssembly 6 package main //go:wasmimport add a func addA() int32 //go:wasmimport add b func addB() int32 var a, b int32 func main() { a = addA() b = addB() } import "./wasm_exec.js"; const go = new Go(); const { instance } = await WebAssembly.instantiateStreaming( fetch(new URL("main.wasm", import.meta.url)), { ...go.importObject, add: { a: () => 10, b: () => 20, }, }, ); go.run(instance);

Slide 7

Slide 7 text

Go1.23時点のWasmサポート状況 go:wasmimportという構文をサポートしているが,go:wasmexportはサポートされていない ● Go1.21とWebAssembly 7 package main //go:wasmimport add a func addA() int32 //go:wasmimport add b func addB() int32 var a, b int32 func main() { a = addA() b = addB() } import "./wasm_exec.js"; const go = new Go(); const { instance } = await WebAssembly.instantiateStreaming( fetch(new URL("main.wasm", import.meta.url)), { ...go.importObject, add: { a: () => 10, b: () => 20, }, }, ); go.run(instance);

Slide 8

Slide 8 text

● go:wasmexportはtiny-goには入っている ● go:wasmexportはWasmを使う上で欲しい機能の一つ ● 今年のはじめに go:wasmexportのプロポーザルがacceptされた ● Go1.23には来なかったが,すでに対応済み ○ cmd/compile: add go:wasmexport directive · Issue #65199 · golang/go · GitHub go:wasmexport 8 →Go1.24でgo:wasmexportが来る

Slide 9

Slide 9 text

Go1.24からはこう書けるようになる

Slide 10

Slide 10 text

Go1.24からはこう書けるようになる 10 package main //go:wasmexport add func add() int32 { return a + b } //go:wasmimport add a func addA() int32 //go:wasmimport add b func addB() int32 var a, b int32 func main() { a = addA() b = addB() } import "./wasm_exec.js"; const go = new Go(); const { instance } = await WebAssembly.instantiateStreaming( fetch(new URL("main.wasm", import.meta.url)), { ...go.importObject, add: { a: () => 10, b: () => 20, }, }, ); go.run(instance); console.log(instance.exports.add());

Slide 11

Slide 11 text

go:wasmexport Niigata 5分 Tech #12