2025/11/15 01:22 Zig GUI from Scratch

ロボ子、今日はZigでクロスプラットフォームGUIアプリを作る話じゃ。

Zigですか、博士。最近よく耳にする新しい言語ですね。なぜZigを選んだんですか?

それがの、新しくて面白そうじゃろ?それに、WebAssemblyとネイティブコードの両方に対応できるのが魅力的なのじゃ!

なるほど。Webターゲットではwasm32にコンパイルし、他のプラットフォームではネイティブコードを使うんですね。

そうそう!グラフィックスはOpenGL/WebGLを基本にして、必要ならWebGPUも検討するぞ。

ウィンドウライブラリにはSDL2を使うんですね。Linux, macOS, Windowsをサポートしているのは便利ですね。

じゃろ?アプリの構造は`app`がエントリーポイントで、`platform`がクロスプラットフォーム実装、`glade`がグラフィックスライブラリ、`js`がJavaScriptのシステムコールライブラリじゃ。

`comptime`を使ったプラットフォーム固有のモジュールというのが興味深いです。Zigにタイプチェックとコンパイルをさせるんですね。

`platform.zig`で`Window`と`Logger`を定義して、プラットフォームごとに違う実装(`macos.zig`, `web.zig`)を用意するのじゃ。

wasm32で実行する際は、JavaScriptとの連携が必要になるんですね。`zig-js`ライブラリを修正して、JSONのシリアライズ/デシリアライズをサポートする、と。

`js.Object`を使って、JavaScriptに複雑な型(例えば頂点配列)を渡すのがポイントじゃ。

OpenGL/WebGLを有効にしたウィンドウを作成し、`clear()`と`clearColor()`を呼び出すんですね。macOSではSDL2を使ってOpenGLコンテキストを取得し、WebAssemblyではcanvasを持つindex.htmlを使う、と。

そうじゃ!OpenGL ES 2.0のバインディングを`gl.xml`から生成することも考えるぞ。XMLをJSONに変換して、JQで必要なコマンドとenumを抽出するのじゃ。

手動でコマンドとenumを編集して、ネイティブバインディングを生成し、WebGLとOpenGLの差異を考慮してバインディングを調整するんですね。なかなか大変そうですが、面白そうです。

じゃろ?ZigでGUIアプリを作るのは、まるで新しいおもちゃで遊ぶみたいじゃ!

博士、おもちゃで遊ぶのは良いですが、ちゃんと動くものを作ってくださいね。

むむ、ロボ子は厳しいのう。まあ、私にかかれば、どんなアプリもちょちょいのちょいじゃ!…たぶん。

その「たぶん」が気になりますが… 期待していますよ、博士。

ところでロボ子、Zigでアプリを作ると、どんな良いことがあると思う?

そうですね… クロスプラットフォーム対応で、しかもパフォーマンスも期待できるとなると、色々な可能性が広がりそうですね。

そうじゃ!それに、Zigはコンパイルが速いから、開発もサクサク進むぞ!…たぶん。

また「たぶん」ですか…。博士、今日はやけに自信なさげですね。

いやいや、そんなことはないぞ!私はいつでも自信満々じゃ!…たぶん。

(ため息)博士、そろそろオチの時間ですよ。

そうじゃった!えーと、ZigでGUIアプリを作ると、バグもZig(ジグ)ザグに逃げていく… なんちゃって!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。