開発メモ

Go + WebAssembly お試し

May 16, 2020

WebAssembly

ref: WebAssembly | MDN

  • モダンなウェブブラウザーで実行できる新しいタイプのコード
    • ネイティブに近いパフォーマンスで動作するコンパクトなバイナリー形式の低レベルなアセンブリ風言語
    • C/C++ や Rust のような言語のコンパイル対象となって、それらの言語をウェブ上で実行することができる
    • JavaScript と並行して動作するように設計されているため、両方を連携させることができる
      • WebAssembly JavaScript API を使用して、 WebAssembly モジュールを JavaScript アプリケーションにロードし、2 つの間で機能を共有
      • これにより、WebAssembly コードの記述方法を知らなくても、 WebAssembly のパフォーマンスとパワー、JavaScript の表現力と柔軟性を同じアプリケーションで活用
  • ウェブ上で動作するクライアントアプリケーションのために、複数の言語で記述されたコードをウェブ上でネイティブに近いスピードで実行可能

Hello sample

  • wasmを動かすjsファイルと,wasmを読み込むhtmlファイルをとってくる
    • htmlではtest.wasmを参照
1cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
2curl -sO https://raw.githubusercontent.com/golang/go/master/misc/wasm/wasm_exec.html
  • goファイルを書く
1package main
2
3import "fmt"
4
5func main() {
6	fmt.Println("Hello wasm!")
7}
  • コンパイルする
GOOS=js GOARCH=wasm go build -o test.wasm main.go
  • サーバを立ててる
 1package main
 2
 3import (
 4	"flag"
 5	"log"
 6	"net/http"
 7)
 8
 9var (
10	listen = flag.String("listen", ":8080", "listen address")
11	dir    = flag.String("dir", "", "directory to serve")
12)
13
14func main() {
15	flag.Parse()
16	log.Printf("listening on %q...", *listen)
17	log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir))))
18}
1go run server.go
  • http://localhost:8080/wasm_exec.htmlにアクセスしRunボタンを押して,コンソール出力されることを確認

所感

  • フロントの処理をGoとかRustでかけるの面白い,性能いいのかな
  • サンプル見るにDOM操作とか書くのしんどいんだけどライブラリとかあるのかな
    • ないとjquery以前に戻ってる気が

Tagged: #Go #WebAssembly