プログラミング
GhosttyとZigに関するMitchell Hashimoto氏へのインタビュー
Interview with Mitchell Hashimoto about Ghostty and Zig (alexalejandre.com)
要約
HashiCorpの創業者であるMitchell Hashimoto氏が、自身の新しいプロジェクトであるターミナルエミュレータ「Ghostty」とプログラミング言語「Zig」について語るインタビュー。氏は、CLIツールの開発経験からターミナルエミュレータの仕組みへの興味を持ち、高速でクロスプラットフォームな、自身の求めるニッチに合うものを開発した経緯を説明しています。また、ターミナルの可能性や、より良いアプリケーション開発のためのプロトコル改善の必要性についても考察しています。
全文翻訳
Alex Alejandre
Mitchell Hashimoto氏は、Vagrant、Packer、Consul、Terraform、Vault、Nomad、Waypointを手がけ、現在はGhosttyとVouchを開発しています。このインタビューでは、ターミナル、Zig、オープンソースについて話します。
あなたは多くのインタビューを受けてきました。なぜ人々はあなたにインタビューしたがるのでしょうか?
インタビューでは、それぞれ異なる角度から質問が来ます。多くの人は、ソフトウェアエンジニアからビジネス創業者へのマインドセットの移行がどうだったかを知りたがります。次に、製品のこと、HashiCorpでの仕事や現在のGhosttyに興味を持つ人もいます。ここでの違いは、どちらも売り込みたいものがない、事前に決められたアジェンダがないことです。
ターミナルにそれほど魅力を感じるのはなぜですか?Ghosttyのような。
私は約15年間CLIアプリケーション(最近よく見るTUIのようなものではなく)を構築してきました。その過程で、偶然にも色を付けたり、カーソルを動かしたりする方法を学びました。HashiCorpを離れた後、技術スキルを磨きたい(長年の怠慢で鈍ってしまったため)と考え、特に以下のことに取り組みたかったのです。AI以前のGPUプログラミング、デスクトップ/シングルノードシステムプログラミング(分散サイドではキャッシュの局所性やベクトル演算を気にしなかったが、ネットワークコストが支配的だったため)。また、Zigをどうしても試したかったのです。これら3つの欲求を満たしたかったのです。
15年間CLIを構築してきた後、ターミナルエミュレータがどのように機能するのか理解していませんでした。ターミナルの構成要素は知っていましたが、それがどのように機能するのかを本当に理解したかったのです。それはGPU、デスクトップ、そしてZigでの作業を可能にするでしょう。私の目標は、vimとコンパイラをその中で実行し、それが自身でビルドされるのを見て、その後捨てることでした。しかし、ターミナルエコシステムについて学ぶにつれて、私が望むニッチ(高速、高機能、ネイティブでクロスプラットフォーム)に合うものが何もないことに気づきました。Discordで数人の友人に共有したところ、彼らは毎日実際に使っているから他の人にも共有してほしいと言いました。GhosttyのDiscordは単なる友人たちのグループチャットでしたが、再利用されました。公の場での私の存在が過剰な注目を集めるのを避けたかったため、公開はしたくなかったので、長い間プライベートベータで運用しました。
ターミナルをさらに押し進めるにはどうすればよいでしょうか?
私はターミナルを極限まで押し進めることを支持しません。確かに、それらはOS上の他のアプリケーションプラットフォーム(ブラウザ、古いJavaアプリケーション実行環境など)と同じことができるアプリケーションプラットフォームです。ビデオやマイクへのアクセス、レスポンシブレイアウトなど、すべての機能を組み込むことができます。それは可能です。
しかし、ブラウザは得意なことがあり、デスクトップは別のことが得意であり、テキストベース(等幅グリッド)アプリケーションも独自の強みを持っています。これらのテキストベースのアプリケーションは、実装が速く、操作が簡単で、セキュリティモデルが明確であるべきです。このエコシステムには多くの機会があり、私はそれを可能にするためのより多くのプロトコルを構築したいと考えています。
ターミナルベースのアプリケーションは、他のパラダイムよりもコンポジションに適しています。TUIはそれほどではありませんが、ほとんどのCLIツールは(標準入力と標準出力以外に)それらを関数のように使用するためのメカニズムを持っています(UNIXの「一つのことをする」哲学はその極端です)。NeovimやAIツールは、ますます多くのコマンドラインフラグを提供しています。より良いターミナルアプリケーションの世界は、より良い自動化、スクリプト可能性の世界です。
私はターミナルをアプリケーションにとって特別な場所したいと考えています。PTYのインバンドシグナリング(エスケープシーケンスを持つ非構造化バイトストリーム)は大きな問題です。Nushellエコシステムは別のレイヤーでそれを修正しようとしていますが、根本的な改善が必要です。多くの人がMicrosoftのエコシステムを嫌っていますが、PowerShellは構造化データに関して多くのことを正しく行っています。
レガシーではないターミナルAPIについてどう思いますか?
私の指針は、現在複数の主要で巨大なアプリケーションプラットフォームがあるという事実です。ブラウザ、Emacs、Appleのエコシステム全体、Microsoftのエコシステム、Android、ビデオゲームコンソールプラットフォームなどです。これらのエコシステムには長所と短所がありますが、それらのフレームワークはどのように機能するのでしょうか?Web上では、DOMとJS APIです。Appleでは、AppKit、Cocoa、SwiftUIです。Windowsでは、Win32、WinUIなどです。Linuxでは、GTKやQtなどです。誰かが、クリップボードデータへのより良いアクセス方法が必要だと言うとき(歴史的なプロトコルはテキストのみですが、画像や複数のMIMEタイプはどうでしょうか?これらはデスクトップでは何十年も扱われてきました)、私はあらゆるプラットフォームのクリップボードマネージャーのドキュメントを調べて、何に落ち着いたのかを確認します。自身の理解に基づいて、過去数十年間の先行事例を調査せずに何かを構築する理由はありません。これが私が取ろうとしているアプローチです。まだカスタムプロトコルは導入していません。
2つのプロトコルが私に強く訴えかけます。現在、ターミナルにはメインスクリーンと、プロパティが異なる代替スクリーン(プライマリとセカンダリと呼ばれることもある)があります。メインスクリーンは、スクロールバックなどがあるシェルに似ており、代替スクリーンはNeovimやほとんどのTUIなどに似ています。これらは2つしかなく、モードをオンまたはオフに切り替えることでプライマリまたはセカンダリ(画面全体を占め、スクロールバックなどを失う)に入ります。
バックグラウンドで無制限の数のスクリーンを作成して入力し、個別のグリッドサイズなどでスクリーンをオーバーレイできるようにするn-screen APIを導入したいと考えています。ターミナルエミュレータは、行折り返し、選択、マウスイベントのルーティングなどを処理できます。スクリーンを、ターミナルエミュレータがグリッドの外でレンダリングするスタンドアロンウィンドウとして指定できます。Neovimのタブが、同時に開かれたネイティブウィンドウタブであると想像してください!この基盤となるレイヤーは多くの問題を解決するでしょう。
また、仕様化されたボタンプロトコルもあります。現在、グリッドセルがクリックされたときに通知を受け取るためのマウスプロトコルがあります。しかし、画面上にあるもの、履歴、スクロールバック時などに関するイベントしか受け取れません。現在、ハイパーリンク(OSC 8)をサポートしており、OSC 8に似た、クリックするとプログラムにメッセージ(指定したもの)を送信するようなものを導入したいと考えています。open_profile IDを持つボタンを作成でき、ユーザーが履歴をスクロールバックしても登録されます。これは、Claude Codeのようなメインスクリーンアプリケーション(スクロールバックを持つ唯一のもの)に影響します。AIについて議論する気はありません。単に非常に人気のあるメインスクリーンアプリケーションだからです。履歴に入ると、ファイルを開いたり、アプリ内リンクを開いたりする能力を失います。
それは、ユーザー空間全体をやり直すことにどの程度近いですか?スコープクリープの余地はたくさんあります。
私はPTYプロトコル全体をWaylandで置き換えることを実験しました。目を細めて見れば、ターミナルは単なるウィンドウサーバーであり、ウィンドウ上のウィンドウとウィジェットを管理しています。GhosttyをWaylandでより良く実行するためにWaylandを研究しましたが、それは解決しようとしていること(ローカルデスクトップ、ウィンドウのレンダリング)に対して非常に良いプロトコルだと考えました。しかし、それは捨てました。
ターミナルの問題は、もはや標準化団体が存在しないことです。古い仕様はありますが、法的に標準化されていますが、過去20年間は最も人気のあるターミナルが何をするかに基づいた標準化が行われてきました。私たちは機能の寄せ集めを持っていますが、洗練されたビジョンを推進する組織はありません。
前進する正しい道が何であるかは分かりません。テキストベースのアプリケーションのための別の場所を作成し、もはやターミナルとは呼ばず、何か新しいものを構築する(レガシーアプリケーションを取り込むためのターミナル変換レイヤーを上に構築する)ことができます。それは何か違うことをしようとしています。
これらのアイデアをユーザーの日常的な要求とどのようにバランスを取りますか?
私は、オープンソースのメンテナーはユーザーに対して一切義務がないことを公言しています。OSライセンスの最初の行は「現状有姿、無保証」です。それが契約であり、無料のソフトウェアを入手し、それに対して要求をすることはできません。しかし、私は良いソフトウェアを構築することに努力したい(私のソフトウェアがひどいと言う人もいるかもしれませんが)ので、問題に対処し、ソフトウェアを改善するという義務を感じています。
ある日は、他人の問題を修正することだけに費やすことを期待して目覚めます。しかし、時には、単に自分が望むことに集中し、一つの問題、議論、またはPRを読むことさえしない日もあります。時には、より大きなビジョンを推進する必要があり、時には、現実の状況に対処する必要があります。
あなたは空中に完璧な都市を建設してから、現実世界でテロと苦しみを見つけるために戻ってくることができます。だから、時にはそれを片付ける必要があるのです。
もし私がただ拾い集めるだけだったら...