世界を動かす技術を、日本語で。

組み込みシステムとWebAssemblyについて進む

2026年4月4日原文(tinygo.org)

概要

TinyGoは、Go言語を組み込みシステムやWebAssembly(WASM)向けに利用可能にするLLVMベースの新しいコンパイラ。 100種類以上のマイコンボードや産業用プロセッサに対応。 WASMコード生成にも対応し、ブラウザやサーバー、エッジコンピューティング環境でも動作可能。 オープンソースで、GitHubやMastodonでも情報発信。 オンラインでTinyGoを試せるプレイグラウンドも提供。

TinyGoとは

  • Go言語組み込みシステムWebAssembly 向けに動作させるための LLVMベース コンパイラ
  • 100種類以上の マイコンボード産業用プロセッサ への対応
    • 例: BBC micro:bitArduino UnoNordic SemiconductorST Microelectronics
  • WebAssembly(WASM) コードの生成機能
    • ブラウザサーバーエッジコンピューティング 環境での利用
    • WebAssembly System Interface(WASI) ファミリーのインターフェース対応
  • コードサイズ が非常に小さいことが特徴

TinyGoの始め方

  • 公式ウェブサイト から セットアップガイドチュートリアル を参照
  • TinyGo Playground でオンライン実行・試用が可能
  • GitHub でソースコードやドキュメントを公開
  • Mastodon でコミュニティ参加・情報交換が可能

主な利用シーン

  • 組み込みシステム開発
    • マイコンボード を使ったIoTプロトタイピング
  • WebAssembly開発
    • ウェブブラウザ 向けアプリケーション
    • サーバーエッジデバイス 向けの高速・軽量なGoアプリケーション

参考リンク

  • 公式ウェブサイト: TinyGo公式ページ
  • GitHub: 最新コードやIssueトラッキング
  • Mastodon: コミュニティ交流・最新情報
  • TinyGo Playground: オンラインでのコード実行環境

Hackerたちの意見

Tinygoは年々進化してるね。最近はmacOSのサポートも始めたし!確かに、macOS用のバイナリもかなり小さくなるよ。 yuriy@MacBookAir ~/t/tinygo> time tinygo build -o test-tiny main.go


実行時間: 1.06秒 fish外部 usr 時間: 1.18秒 0.31ミリ秒 sys 時間: 0.18秒 1.50ミリ秒 0.18秒 yuriy@MacBookAir ~/t/tinygo> time go build -o test-normal main.go


実行時間: 75.79ミリ秒 fish外部 usr 時間: 64.06ミリ秒 0.41ミリ秒 63.64ミリ秒 sys 時間: 96.76ミリ秒 1.75ミリ秒 95.01ミリ秒 yuriy@MacBookAir ~/t/tinygo> ll 合計 5096 -rw-r--r--@ 1 yuriy staff 74B 3 Apr 19:17 main.go -rwxr-xr-x@ 1 yuriy staff 2.3M 3 Apr 19:18 test-normal* -rwxr-xr-x@ 1 yuriy staff 192K 3 Apr 19:18 test-tiny* yuriy@MacBookAir ~/t/tinygo> cat main.go package main import "fmt" func main() { fmt.Printf("Hello world!\n") }

-ldflags=“-s -w”を渡すとどうなるの?

非同期対応のプログラミング言語で組み込みコードを書くのは素晴らしいね(Rustのembassyを見てみて)。でも、マイクロコントローラーで大量のデータを送る必要があるとき、どれだけ競争力があるのか気になるな。リアルタイムな処理には向いてないと思うけど。

tinygoではGCを無効にできるから、必要なバッファを事前に割り当てれば、リアルタイム特性で良いパフォーマンスが出せるよ。ただ、動的メモリ割り当てが必要なら無理だね。GCが必要だから、リアルタイム保証はできないよ。

RSTPカメラのフィードをWASMプラグインとホストブリッジアダプターを通してストリーミングしてるけど、問題ないよ。正直、こんなにうまくいくとは思わなかった。

EmbeddedGoのために結構な量のコードを書いたよ。メインループでヒープ割り当てを避ければ、ガベージコレクターは問題にならない。ただ、CPUがボトルネックになると、ゴルーチンが他の処理をかなりの時間ブロックするかもしれない。プラットフォームが非同期プリエンプションをサポートしていれば、リアルタイム機能を持つゴルーチンスケジューラーをパッチできるかも。

これについて詳しく教えてもらえる?割り込みやDMAのシグナルとはどう違うのか気になる。ハードウェアレベルの非同期は理解できるし、データシートも読める。でも、ソフトウェアの非同期は特定するのが難しそうで、ちょっと怖気づいてるんだ。

Rustよりはパフォーマンスがいいけど、GCが重くない処理ではZigには劣るね。 https://github.com/tinygo-org/tinybench

私たちはServiceRadarのWASMプラグインシステムにTinyGoとWazeroランタイムを使ってる。Golangを使ってるなら、どちらもおすすめだよ。

やった!wazeroのメンテナーだよ、紹介してくれてありがとう!

Wazeroは最高だね。Go以外の言語に埋め込みたい人は、Extismもチェックしてみて!

標準のGoと比べて、どんなトレードオフがあるの?

Hacker Newsで議論の続きを見る