Libghostty 1.0 リリース、ABIの安定性を保証
Libghostty 1.0 (mitchellh.com)
要約
Ghosttyプロジェクトから抽出されたターミナルエミュレーションライブラリ`libghostty-vt`がバージョン1.0に到達し、C ABIの安定性が保証されました。このライブラリは既にJetBrains IDE、Neovim、KDE Konsoleなどの多くのプロダクトに採用されており、その広範な普及と技術的な貢献が強調されています。
全文翻訳
Libghostty 1.0
libghostty-vt 1.0 がリリースされました。libghostty は、Ghostty のコアから直接抽出された、ポータブルで高性能なターミナルエミュレーション用 C ライブラリです。1.0 リリースは、ライブラリ自体と C ABI の両方が安定したことを意味します。
1年少し前、私は libghostty が登場する と書きました。当時は、Zig モジュールがマージされたばかりで、C API は存在せず、Ghostty 以外に利用する者はいませんでした。今日、C API は完全なターミナルエミュレータとなり、数百の商用・無料製品で数百万人のユーザーに利用されており、真に強制力のある ABI 安定性ポリシーを持っています。
この記事では、どのようにしてここまで来たのか、そして 1.0 が実際に何を意味するのかについて説明します。
すでに利用しているのは誰か
Ghostty プロジェクトを 2022 年に開始して以来、最もよく聞かれる質問は「なぜ?」でした。この質問には libghostty が登場する という投稿で既に答えたので、必要であればそちらをお読みください。今日は、libghostty がすでに業界にどのような広範な影響を与えているかを示すことで、その存在を強く正当化できると信じています。
1年前、私は JetBrains IDE のターミナルエミュレータである JediTerm のバグ を、ターミナルエミュレーションがいかに正しく実装するのが難しいかの例として挙げました。1年後、JetBrains IDE のターミナルは libghostty 上で動作するようになりました。すべての IntelliJ、PyCharm、GoLand などのユーザーは、libghostty パワードのターミナルを利用しています。JetBrains のレポートによると、これは 1250 万人以上のアクティブユーザーに相当します。
Neovim には、libvterm を libghostty-vt に置き換える 承認されたプルリクエスト があります。これには、他のことの中でも、リサイズ時のスクロールバックのリフローに関する 10年前の課題 が解決されます。メンテナーは、ディストリビューションが依存関係を個別にパッケージ化できるように、タグ付きリリースを待っています。今日のリリースはその準備を整えるはずです。
KDE 開発者は、libghostty を基盤とした Konsole の置き換えを実験しています。Vercel の Turborepo は、その TUI でタスク出力をレンダリングするために それを使用しています。devenv は、シェルを駆動するためにそれを使用しています。Antithesis は TUI プログラムのファズテストにそれを使用 し、btop などで実際のバグを発見しました。Ghostel は Emacs にそれをもたらします。ghostty-web は、Xterm.js 互換 API を持つ WASM ビルドです。OrbStack のような商用製品は それを組み込んでいます。そして、herdr や cmux のような新しいターミナルや「エージェンティック」コーディングツールの波は、さらに別のエミュレータを作成するのではなく、libghostty を基盤として構築されています。
Rust、Go、JavaScript、Swift、Python、.NET、Elixir、Dart、Java などのコミュニティバインディングがあり、awesome-libghostty リストは 100 を超えるプロジェクトを追跡しています。
今日、libghostty アプリケーションよりも libghostty パワードのターミナルを使用している人の方が多いです。そして libghostty は、「単なる」ターミナルエミュレータ以上の影響を与えています。
ABI 安定性
1.0 は、libghostty-vt がセマンティックバージョニングに従い、厳格な ABI 互換性 の約束を持つことを意味します。これにより、ディストリビューションやオペレーティングシステムのパッケージャーは libghostty-vt をパッケージ化する際に、プログラム開発者は動的にリンクする際に自信を持つことができます。
有用な機能を提供するだけでなく、高品質で永続的な C ライブラリの証は ABI 安定性であると信じています。そのため、当初から、私が作業を楽しんだ C ライブラリからインスピレーションを得て、将来の追加を可能にする強力で安定した ABI を持つように API を設計しました。
すべてのオブジェクトは不透明なハンドルです。読み書きする可能性のある数百の値は、少数の enum キー付きゲッターとセッターを介して行われるため、新しいシンボルを導入せずに新しい値を簡単に追加できます。新しいヘッダーを持つプログラムが古い libghostty に対してリンクされた場合、クラッシュや未定義の動作ではなく GHOSTTY_UNSUPPORTED の結果が得られます。数少ない非不透明な構造体にはサイズが記載されており、後でフィールドを追加したり、予約済みのパディングを含めたりできます。enum は、C 標準が許す限り、すべてのコンパイラで int に固定されています。
当社の CI は ABI ポリシーを強制します。すべての変更は、Linux ではコミットされたベースラインに対して、macOS と WebAssembly ではゴールデンタイプマニフェストに対して、libabigail でチェックされます。
ELF プラットフォームでは、エクスポートされるすべてのシンボルにバージョンが付けられているため、動的ローダーは後で不可解な方法で失敗するのではなく、名前による不一致ライブラリのロードを拒否します。
パッケージング
ABI 安定性に加えて、1.0 リリースでは、すべての主要なオペレーティングシステムとディストリビューションが標準の公式ツールを通じて libghostty-vt をパッケージ化できるようにするための、適切なビルドツール、tarball、依存関係ライセンスマニフェスト、ドキュメントなどが提供されます。
Libghostty は Ghostty アプリケーションとは別のリリースサイクルを持っています。また、libghostty が必要とするファイルと依存関係のみを含む独自の tarball を持ち、サイズを小さくし、ライセンス検証と互換性を簡素化します。
各リリースでは、署名付きソース tarball と、Zig 独自のキャッシュレイアウトにあるすべての Zig パッケージを含むコンパニオン依存関係 tarball を公開します。これにより、ディストリビューションは完全にオフラインでライブラリをビルドできます。ビルドは、共有ライブラリと静的ライブラリを適切な SONAME、ヘッダー、pkg-config ファイル、CMake パッケージ構成とともにインストールし、--prefix、DESTDIR、lib64 を尊重します。デバッグ情報はデフォルトで保持されるため、ディストロはそれを分割できます。これらすべては、tarball に含まれる PACKAGING-LIBGHOSTTY.md に文書化されています。
依存関係とライセンス
libghostty-vt は MIT ライセンスです。実行時には libc 以外に何も必要としません。また、必要に応じて完全にフリースタンディングでビルドすることもできます。
ライブラリは、少数の許可ライセンスの依存関係をコンパイルします。SIMD 用に simdutf と Google Highway、グラフームデータ用のコンパクトな Unicode テーブル、Kitty グラフィックスプロトコルでの画像デコード用に Wuffs です。simdutf と Highway はどちらも libc++ なしでビルド されるため、C++ 標準ライブラリの依存関係はありません。
依存関係ツリーのどこにもコピーレフトコードはありません。すべての依存関係は、バージョン、SPDX ライセンス、ハッシュとともに機械可読マニフェストにリストされており、ディストロがバンドルライブラリのメタデータをより簡単に記入できるようにします。
ディストロがシステムの simdutf または Highway を動的にリンクすることを好む場合は、ビルドフラグがあります。
ポータビリティ
libghostty-vt は非常にポータブルです。以下の表は、CI でビルドおよびテスト(完全な単体テストとすべての例の実行)を行うすべてのプラットフォームとアーキテクチャを示しています。
| プラットフォーム | アーキテクチャ |
|---|---|
| Linux (glibc, musl) | x86_64, aarch64 |
| macOS 13+ | x86_64, aarch64 |
| iOS 13+ | aarch64 |
| FreeBSD | x86_64, aarch64 |
| Windows | x86_64 |
| Android | aarch64, x86_64, arm |
| WebAssembly | wasm32 (フリースタンディング) |
CI でビルドするがテストは実行しない、第二のプラットフォームセットがあります。これらのシステムはすべて既知のユーザーがいますが、自動テストの仕組みはまだセットアップされていません。
| プラットフォーム | アーキテクチャ |
|---|---|
| ベアメタル | riscv32, thumb |
| WebAssembly (WASI) | wasm32 |
| Windows | arm64 |
| illumos | x86_64 |
| 32ビット x86 | x86 |
テストされた各プラットフォームは、期待されるアーティファクトを受け取ります。
- Linux および FreeBSD は、適切な SONAME とバージョン付きシンボルを持つ共有ライブラリ、静的ライブラリ、ヘッダー、pkg-config ファイル、CMake パッケージ構成を受け取ります。
- macOS および iOS は、
@rpathインストール名と互換性バージョンを持つdylib、および macOS、iOS、iOS シミュレータをカバーする XCFramework を受け取ります。これは Xcode または Swift Package Manager に直接ドロップできます。 - Windows は、
.pdb、インポートライブラリ、静的ライブラリを持つ DLL を受け取ります。ライブラリは GNU ABI でビルドされますが、MSVC プログラムはインポートライブラリを通じてリンクし、CI はこれを検証します。 - Android は、Android 15+ で要求される 16 KB ページサイズサポートに対してビルドされた共有ライブラリを受け取ります。
- WebAssembly は 2 つのフレーバーで提供されます。1 つは速度最適化、もう 1 つはサイズ最適化されており、小さい方はすべての機能を有効にしても 1 MB 未満です。読み取り専用ビューアのみが必要な場合、入力エンコーディング、検索、選択、Kitty グラフィックスなどのサブシステムはビルドフラグでコンパイルアウトでき、モジュールサイズは約半分になります。すべての関数はエクスポートされたままですが、
GHOSTTY_UNSUPPORTEDを返すだけなので、コードを変更する必要はありません。
ポータビリティは、ビルドおよび実行能力だけではありません。リソース使用量と、さまざまなリソース環境で機能できることも重要です。
リソース使用量に関して、ライブラリはスレッドを作成せず、カスタマイズ可能なアロケータを通じてのみ割り当てを行い、最小限のコンピューティングとメモリを使用します。私は、4 コアと 8 GB の RAM を持つ Linux サーバーで、10,000 のアクティブなターミナルを、それぞれ出力を行うライブシェルを搭載して実行しました。このテストでは、bash が libghostty-vt よりもはるかに多くの RAM を使用し、8 GB の予算に収まらなかったため、dash を使用する必要がありました。
今後の展望
Libghostty 1.0 は大きなマイルストーンです。
これで、約 1,500 行の C コード でターミナルを作成できます。これは、2025 年に存在したほとんどのターミナル、そして今日の 2026 年のほとんどのターミナルよりも多くの機能と優れたパフォーマンスを備えています。そして、豊富な言語バインディングのエコシステムのおかげで、すべての主要なプログラミング言語でこれを行うことができます。これは無料です。ほとんど労力はかかりません。ただ実行するだけです。
libghostty-vt は汎用ライブラリであるため、安定性に焦点を当てながら、存在するすべてのターミナルプロトコルを可能な限り実装します(もちろん、有効/無効にするオプションを提供します)。これにより、組み込み側は選択の贅沢を得られます。
libghostty-vt の組み込み側が報告するすべてのバグは、エコシステムの他のすべての人々を改善します。私たちが libghostty-vt で出荷するすべての機能は、すべての人に迅速かつ安全に利用可能になります。ターミナルは、断片化を減らして、より速く進むことができます。
ライブラリに貢献してくれたすべての人、バインディングを作成してくれた人、バグを報告してくれた人、そして API がまだ実験的であった間にその上に何かを出荷してくれたすべての人に感謝します。すべてのオープンソースと同様に、これは大規模なコミュニティの仕事でした。
ドキュメント、例、ダウンロードは lib.ghostty.org で入手できます。
Boo. 👻
フットノート
- いつものように、すべての投稿でこれを行う必要があるのは嫌ですが、この投稿は AI の支援なしで完全に手書きされたことを નોંધしたいと思います。
- ほとんどの消費者は使用状況を報告しないため、数字は概算ですが、JetBrains だけで 1250 万人の継続的なアクティブユーザー を報告しており、リストの他のすべてを数える前です。
- 元の投稿では「libc さえも!」と書きました。SIMD パスがそれを使用し、デフォルトのアロケータが
mallocであるため、デフォルトのビルドは libc をリンクします。SIMD をオフにすると、ライブラリはフリースタンディングになり、ベアメタル RISC-V および ARM ターゲットで実行される方法です。 - 機能フラグは WASM 固有ではありません。すべてのターゲットで機能します。組み込みデバイスのようなものにも役立つ可能性があります。
- ここでの「機能」とは、ターミナルプロトコルとシーケンスのセットを理解していることを意味し、「パフォーマンス」とは、解析スループットとメモリ使用量を意味します。これは
libghostty-vtが提供する部分であるためです。