概要
GhosttyのGTKアプリケーションをGObject型システムに完全対応させてZigから再実装。 Valgrindによる徹底的なメモリ検証で安定性と保守性を大幅向上。 ZigとGObject型システムの連携、Valgrindによるメモリ問題の発見が主な技術的焦点。 新構成でGUI機能追加やメモリ管理が格段に容易に。 今後もValgrind活用とドキュメント強化を継続予定。
Ghostty GTKアプリケーション再実装の背景
- Ghosttyは macOS, Linux, FreeBSD対応 のクロスプラットフォームターミナルエミュレータ
- 各プラットフォームで ネイティブGUIフレームワーク を採用
- macOS:Swift + Xcode
- Linux/BSD:GTK + X11/Wayland
- コア部分は Zigで実装 し、C ABI互換APIとしてエクスポート
- GTKアプリの再実装は 保守性・機能性・安定性向上 が目的
ZigとGObject型システムとの連携
- GTK利用時は GObject型システムとの連携が不可避
- 以前はGObjectを避けていたが、 寿命管理や機能制限 で問題が多発
- 例:ZigメモリとGTKメモリの解放タイミング不一致によるバグ
- GObject型システム採用により 参照カウントによるメモリ管理 が可能に
- GhosttyConfig GObject でZigのConfig構造体をラップ
- プロパティ変更通知 でGUI全体に設定変更を伝播
- 参照がなくなった時点で自動解放、 メモリ管理が単純化
- GTKネイティブ機能 (シグナル、プロパティ、アクション等)が活用可能に
- Blueprint等の最新GTK UI技術 の採用でGUI機能追加が容易
ValgrindによるGTKアプリとZigコードのメモリ検証
- 全てのPRと機能追加でValgrindによる検証を徹底
- GTKアプリでのValgrind利用には 大規模なサプレッションファイル が必要
- 80%はGTK公式提供、残りはサードパーティやGPUドライバ
- Valgrindで 見逃されがちなバグを多数発見
- 例:GObject WeakRefのクリア忘れによる未定義メモリアクセス
- Zigコードベースのメモリ安全性
- 発見された問題は 1件のリークと1件の未定義アクセス
- リークはサードパーティC API由来、Zig自身の問題はほぼなし
- Zigの デバッグアロケータやValgrind連携 機能が有効
- 問題のほとんどは C API境界やGObjectの複雑なライフタイム管理 に起因
- C APIは オブジェクト寿命の転送・曖昧化 の境界
- 言語側の安全性はAPI理解とラッパー実装の質に依存
今後の展望とまとめ
- 今後も 全てのGTK PRをValgrindで検証 し、 ドキュメント整備 を推進
- GUI部分の再実装は 5回目 で、各回ごとに新たな知見を獲得
- 今回の経験を macOS側にもフィードバック 予定
- GTKサブシステム保守チームの協力 で再実装を完了
- 新しいGhostty GTKアプリは mainブランチのデフォルト に
- 1.2リリース で全ユーザーに提供予定
Linuxにおける「プラットフォームネイティブ」について
- Linuxでは「プラットフォームネイティブ」の定義が曖昧
- 一般的には GTKやQtアプリ が「ネイティブ」感を持つとされる