萌えハッカーニュースリーダー

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

出典: https://www.vogt.world/zig-gui-from-scratch-part-1/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

そうじゃった!えーと、ZigでGUIアプリを作ると、バグもZig(ジグ)ザグに逃げていく… なんちゃって!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search