Edited at

GoでWasmでファイルサイズが小さいTinyGo!

元の記事

https://far.tokyo/post/tinygo/

とりあず動くページを見てくれ。

https://1l0.github.io/t/tinygo/

こいつはほぼGoで書かれている。

つまりGo使いはJavascriptからおさらばできる……かもしれない。


GoとWASM

Goは2018年の中頃にwasmを一応サポートした。なにが一応なのかというと、問題があるのだ。


問題点

本当シンプルにこれだけなのだが、生成されるwasmファイルがくそでかい。なぜならGoのランタイムをまんまwasmにぶちこんでいるからだ。GCやらchannelやらが動くように。

なぜwasmができたかというとファイルサイズの節約が目的の一つになっているので本末転倒である。ページを開いてwasmファイルをロードするのに時間がかかるのだ。

そんなこんなで皆が絶望しかけていた頃、救世主が登場する。

TinyGoだ。


TinyGo

https://tinygo.org/

こいつは元々wasmを目的としていたわけじゃない。IoTやら小さなデバイスで動くように設計されたGoコンパイラだ。LLVMというライブラリを使っているのだが、それがwasmを生成できるため、「こいつは使える!」となり今に至る。


改善点

こいつが生成するwasmは凄まじく小さい。上記の問題点をピンポイントで解決するのだ!


問題点

ただし問題もある。今の所GCがサポートされてない。つまりメモリ管理を慎重にしなくてはならない。Goの利点がちょっと薄れますな。

あと標準ライブラリの対応も現在進行中で完備されていない。つまり既存のライブラリをimportするのは今は無理がある。

今の所安定してコンパイルできる環境はLinuxに限られる(macOS版も進行中)。


まとめ

TinyGo最っ高ぅ!

成長速度早いし、今年(2019)中にも使えるものになりそう。

現時点(2019/2/11 19:38)ではリポにあるサンプルで動かそうとしてもSafariなどで動かないので注意が必要だ(上のデモは修正済み)。なお、修正のプルリクは申請済みなので直すべき箇所はここを見てくれ。

https://github.com/tinygo-org/tinygo/pull/183