Timetable

Back to Timetable
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
# 概要
TinyGo で組み込み開発をしていると、コードを書くたびに実機へ書き込んで確認するサイクルが開発体験のボトルネックになります。私はこの課題を解決するために TinyGo 向けの開発エミュレータを Go で自作し、設計の失敗と改善を繰り返してきました。
辿り着いたのは build tag・net/rpc・Ebitengine という Go の仕組みだけを組み合わせた設計です。同じコードがそのまま実機でもエミュレータでも動き、ファイルを保存するたびに即座に動作確認できるホットリロード開発体験を実現しました。
本セッションでは「作っては壁にぶつかり、設計を作り直す」実体験を通じて、TinyGo の開発サイクルを高速化するアプローチと、Go のエコシステムを活かした開発ツール設計の勘所を共有します。
# 対象者
1. Go を学び始めて 1〜2 年ほどの方
2. TinyGo や組み込み開発に興味があるが何から始めればいいかわからない
3. Go を使って開発ツールを作ることに興味がある
# 詳細説明
1. なぜこのテーマか
TinyGo は Go の知識をそのまま組み込み開発に活かせるツールチェーンですが、コード変更のたびに実機へ書き込むフィードバックループが開発速度の足を引っ張ります。このサイクルを短縮するために、デスクトップ上で動作するエミュレータを自作しました。その過程で向き合った設計の選択と失敗が、このセッションの主な題材です。
2. TinyGo と Go の違いを理解する
build tag による実機/デスクトップの切り替え・標準ライブラリの制約など、TinyGo 固有の事情を整理します。この違いを理解することが、エミュレータ設計の出発点になります。
3. v1:AST 書き換えアプローチとその限界
最初の実装は Go の AST を使って TinyGo 固有の import をスタブに書き換える方式でした。ユーザーのコードを無改変のまま動かすシンプルな発想でしたが、対応パッケージのハードコード・起動のたびに走る go mod tidy の通信コスト・ウィンドウが閉じるホットリロードなど、実用上の限界が積み上がりました。この失敗の過程が、次の設計判断の土台になります。
4. 設計の刷新:build tag × net/rpc × Ebitengine
課題を受けて設計を根本から見直しました。Ebitengine で Wio Terminal の UI を表示するサーバーと、build tag で実機/デスクトップを切り替えるクライアントラッパーを分離する構成です。net/rpc・build tag・Ebitengine という Go 標準・エコシステムの組み合わせだけで、ユーザーは import を変えるだけで同じコードが実機でもエミュレータでも動きます。
UI に Ebitengine を採用した理由はシンプルな API や Go 界隈での実績だけではありません。TinyGo 向けゲームエンジン koebiten は Ebitengine にインスパイアされた API を持つため、koebiten で書いた TinyGo コードがほぼそのまま PC でも Ebitengine として動きます。この対称性があるからこそ、「実機用のコードをそのままデスクトップで確認する」 という体験が自然に成立します。
5. ホットリロードで変わる開発体験
サーバーを起動したままユーザーコードだけを再起動することで、ファイル保存 → エミュレータ上で即動作確認というサイクルを実現します。実機への書き込みは最終確認だけで済み、普段の Go 開発と変わらないスピード感で TinyGo を書けるようになります。
6. 今日から始めるには
```
go install github.com/kurakura967/wiodisplay/cmd/wio-emu@latest
```
実装リポジトリ:https://github.com/kurakura967/wiodisplay
# 聴講者が持ち帰れること
1. TinyGo と通常の Go の違い(build tag・標準ライブラリの制約)
2. build tag を使って実機/デスクトップを同一コードで切り替える設計パターン
3. koebiten × Ebitengine の対称性を活かした実機/PC 共通コードの設計パターン
4. Go のエコシステムを組み合わせて開発ツールを設計するアプローチ
# セッション構成(20分)
時間/内容
1分/自己紹介
3分/TinyGo とは・通常の Go との違い
2分/課題:実機依存の開発サイクルのボトルネック
3分/AST 書き換えとその限界
5分/設計の刷新:build tag × net/rpc × Ebitengine
3分/ホットリロードで変わる開発体験
3分/まとめ・go install で今日から始めるには
# レベル
初級者向け
株式会社ZOZOバックエンドエンジニア
ZOZOTOWNの検索機能の改善に努めています。