Terminfoの死:40年もの技術的前提が期限切れになるとき
ソフトウェア保守の世界には、あまりにも深く根付いていて見えなくなっている「法則」‑ 技術的前提があります。多くの Unix ベテランにとって、その法則の一つは terminfo と curses ライブラリの必要性でした。40 年間、テキストユーザインタフェース(TUI)を作成する標準的な手法は、ユーザーのハードウェアについて何も前提とせず、代わりに端末の機能を記した複雑なデータベースに依存し、VT100 から Wyse 50 まであらゆる端末でプログラムが動作できるようにすることでした。
最近、Eric S. Raymond(ESR)は、古い Unix ゲーム「greed」を C から Rust へ移植する過程で、この慣習が時代遅れであるという個人的な悟りを共有しました。彼の経験は、コンピューティングにおける大きな変化を浮き彫りにしています。すなわち、断片的なハードウェア環境から、均質化されたソフトウェアエミュレーション環境への移行です。
Curses と Terminfo の遺産
この変化がなぜ重要なのかを理解するには、curses の役割を知る必要があります。Unix の初期には、ユーザーはさまざまな物理的文字セル端末を介してシステムに接続していました。各メーカーは、カーソル移動、画面クリア、色変更などのために異なるエスケープシーケンスを持っていました。
この問題を解決するために、curses ライブラリが開発されました。curses は TERM 環境変数を確認し、terminfo と呼ばれるシステム全体のデータベースに問い合わせることで機能しました。このデータベースには「マジック文字列」‑ 特定の端末モデルを操作するために必要な制御コードが格納されていました。ハードウェアを抽象化することで、開発者は何百もの異なるデバイスで動作するコードを一つ書くだけで済むようになったのです。
触媒:Rust への移植
「greed」の保守作業中、Raymond は安全性を保証する Rust へのコードベース移行を決意しました。ポート作業を AI アシスタントに任せたところ、生成された Rust コードが unsafe ブロックだらけであるという繰り返しの問題に気付きました。
調査の結果、AI が単に C の curses ライブラリをラップしているだけだと判明しました。curses は C ライブラリであるため、Rust からそれを呼び出すには unsafe ブロックが必要となり、移行の主目的である安全性が失われてしまいます。
Raymond が AI に純粋な Rust の代替である crossterm の使用を指示したところ、AI は障壁に直面しました。Raymond は cargo(Rust のパッケージマネージャ)をインストールしておらず、ポート作業を手作業で書くのではなく AI に「コード研磨」を任せていたからです。
「偶然」のイノベーション
パッケージマネージャがない状況に直面した AI は、予想外の手段に出ました。外部ライブラリやレガシーな C の curses システムに依存する代わりに、ソースコード内にカスタムの軽量スクリーン描画バックエンドを直接書き込んだのです。
重要なのは、この新しいバックエンドが大胆な前提を置いたことです:ユーザーがカラー ANSI 端末を使用していると仮定しました。
熟練した Unix 開発者にとってこれは基本的なルールへの違反です。しかしコードを確認した結果、Raymond はそれが小さくエレガントで、unsafe ブロックが全く含まれていないことに気付きました。20 世紀の Unix ハードウェアに関する「制度的記憶」を持たない AI は、もはや実用的な意味を持たない要件を単に無視したのです。
ターミナルの新たな現実
今日、ほぼすべての端末は ANSI 互換エミュレータです。terminfo を必要とした多様な物理ハードウェアは姿を消し、共通の標準に従うソフトウェアに取って代わられました。
Raymond はこの認識が「宇宙が横に揺れた」ように感じたと述べています。何百もの 旧式端末タイプをサポートしなければならないという前提は、必要がなくなった後も長く残っていました。彼の言葉を借りれば:
"私は、TERM と terminfo を必要とした全ての前提が、ダイヤルアップのアコースティックモデムと同じくらい時代遅れであるという事実に、直接向き合う必要があるとは思ってもみませんでした。"
反論と考慮点
ANSI のみを前提とすることで開発はシンプルになりますが、レガシーシステムの摩擦に直面する開発者もいます。Hacker News のコメント投稿者は、terminfo との唯一のやり取りは環境変数が誤設定されたとき(例:$TERM が screen-256color ではなく screen に設定されている)に起こり、vim や less といったツールが壊れると指摘しています。そのようなケースでは、標準端末を前提とする方が、破損した可能性のある環境変数に依存するより むしろ 信頼性が高いと主張しています。
結論:コードは柔らかい粘土のように
「greed」をシンプルな ANSI バックエンドへ移行したことは、レガシーコードに対する見方の変化を示しています。AI 支援開発の時代において、根本的なアーキテクチャ前提を変更するコストは劇的に低減されました。もし非 ANSI 対応が必要なユーザーが現れたとしても、数か月に及ぶ書き直しではなく、AI へのシンプルなプロンプトで解決できるのです。
40 年もの前提という重荷を捨てることで、開発者はより軽量で安全、かつ保守性の高いソフトウェアを生み出すことができます。いくつかの「古代の法則」は、もはや現代の世界に適用できないことを認めるべきです。