プログラミング
Show HN: Shitty – 高速なターミナル。メモリ安全性はないが、あなたのものより高速
Show HN: Shitty – fast terminal. Memory-unsafe and faster than yours (github.com)
要約
Shittyは、低遅延、高速起動、予測可能なリソース使用量を目指して開発された、メモリ安全性を持たない高速なターミナルエミュレータです。CPU上にターミナル状態を保持し、VulkanやMetalといったネイティブバックエンドでレンダリングを行います。パフォーマンス比較では、多くの既存ターミナルを上回る結果を示しています。
全文翻訳
Shitty 超高速。メモリ安全性はないが、あなたのものより高速。Shittyは低遅延、高速起動、予測可能なリソース使用量のために構築されています。ターミナル状態をCPU上に保持し、ネイティブなコンピューティングバックエンド(LinuxではVulkan、macOSではMetal)でセルをレンダリングします。
パフォーマンス Apple Silicon搭載MacBookでGUI経由で100MBのデータを処理。すべてのターミナルは最初に均等化され、フォントはMenlo 12pt、セルサイズは同じ14x28px、グリッドは80x24、スクロールバックは500行です。3回の実行の最良時間を計測しました。
印刷可能なASCII(スクロールパス):
ターミナル wall user throughput
shitty 0.81s 0.50s ~118 MiB/s
alacritty 0.17.0 0.96s 0.78s ~99 MiB/s
kitty 0.48.2 1.28s 0.95s ~75 MiB/s
ghostty 1.3.1 1.49s 1.60s ~64 MiB/s
ランダムバイト(パーサーの最悪ケース、UTF-8無効状態):
ターミナル wall user throughput
shitty 1.88s 1.79s ~51 MiB/s
alacritty 0.17.0 3.07s 2.92s ~31 MiB/s
ghostty 1.3.1 4.63s ~7.0s ~21 MiB/s
kitty 0.48.2 - - -
kittyはランダムペイロードをスキップします。描画の代わりにタイトル変更やベルでエスケープジャンクに反応します。dev/compare.pyで再現可能で、測定前に各ターミナル内で均等化されたセットアップを検証します。
機能
VT52からVT5xxまでの制御シーケンスと広く使われているxterm拡張をサポートします。プライマリおよびオルタネートスクリーン、プライマリスクリーンのスクロールバック、マージン、タブ、矩形操作、保護セル、同期出力に対応します。ターミナル幅変更時のプライマリスクリーンのスクロールバックのリフロー。Unicodeグラフェムクラスター、結合文字、絵文字シーケンス、倍幅文字。DECのシングル幅、ダブル幅、ダブルハイトライン。16色、256色、24ビットカラー(下線色と拡張下線スタイルを含む)。レガシー、modifyOtherKeys、Kittyキーボードプロトコル。X10、VT200、UTF-8、SGR、SGR-pixel、urxvtマウスプロトコル。線形および矩形選択、プライマリ選択、クリップボード統合、OSC 52ポリシー、OSC 8ハイパーリンク。シェル統合、通知、進捗レポート、インバンドリサイズレポート。グリフの遅延ラスタライズ、永続的なGPUグリフキャッシュ、ダメージ駆動のコンピューティングレンダリング。
Shittyは内部でUTF-8を使用し、子プロセスにはTERM=xterm-256colorをエクスポートします。ホストは対応するterminfoエントリを提供する必要があります。
要件
ShittyはC++23で記述され、Clangでビルドされます。すべてのビルドで必要とされるもの:
Python 3とglslangValidator。librsvg (rsvg-convert)(ビルド時にアイコンをレンダリングします)。pkg-config。Brotliとutf8proc。POSIXスレッドとPTYサポート。
Shittyが使用するlibstdの正確なリビジョンはthird_party/libstdにバンドルされており、同じグラフの一部としてビルドされます。
Linuxでは追加でFreeType、HarfBuzz、Waylandクライアントヘッダー、xkbcommon、wayland-scanner、Vulkanヘッダーとローダーが必要です。
macOSではSPIRV-Crossが必要で、システムSDKからCoreText、Cocoa、Metal、IOSurfaceを使用します。スカラーBase64実装は常に利用可能です。simdutf 6.5以降がインストールされている場合、ビルドはBase64エンコーディングを高速化するために自動的に使用します。Fontconfigもオプションです。存在する場合、フォントファミリー検索が有効になります。明示的なフォントファイルパスはFreeTypeを介して直接処理されます。
Linuxでは実行時に動作するVulkanドライバーとWaylandコンポジタが必要です。macOSはネイティブのMetalドライバーを使用します。ネイティブウィンドウとイベントループレイヤーはthird_party/pltからビルドされます。ターミナルは汎用ウィンドウツールキットに依存しません。インポートされた完全な適合性スイートは、追加でncursesとPerlを必要とします。
ビルド
デフォルトのインストールグループをビルド:
./build
一般的なビルドオプション:
./build -j 8
./build -B .build-debug
CPPFLAGS=-DDEBUG
./build
実行
デフォルトのシェルを起動:
./st
コマンドを実行:
./st -e tmux new-session
初期ターミナルサイズとスクロールバック容量を選択:
./st -geometry 120x36 -saveLines 5000
フォントを選択:
./st -font 'DejaVu Sans Mono' -fontsize 16
./st -font 'DejaVu Sans Mono' -dwfont 'Noto Sans Mono CJK JP'
-fontと-dwfontは明示的なフォントファイルパスを受け入れます。Fontconfigが利用可能な場合、ファミリークエリも受け入れ、Shittyは通常の、太字、イタリック、太字イタリックのフェイスを自動的に解決します。オプションの倍幅フォントは、そのセルの幅が同じ高さのプライマリフォントのちょうど2倍である場合にのみ使用されます。
ビルドバージョンをウィンドウを開かずに表示するには./st -v、メインオプションリストを表示するには./st -help、高度なターミナル、カラー、クリップボード、ウィンドウポリシーオプションを表示するには./st -listresを使用します。ブールフラグは、有効にするには-flag、無効にするには+flagを使用します。SHITTY_FONT_SIZEはデフォルトのフォントサイズを設定します。-fontsizeは優先されます。セッション中に、Ctrl+Shift++でフォントサイズが増加し、Ctrl+-で減少し、Ctrl+0で起動時のサイズに戻ります。フォントリサイズは、ウィンドウを新しいセル寸法にリサイズすることで、ターミナルの行数と列数を維持します。デフォルトでは、アプリケーションはOSC 52を介してローカル選択を読み取ることができず、ホストウィンドウを操作またはクエリすることもできません。これらの操作は、信頼できるアプリケーションに対して明示的に有効にすることができます。
インストール
実行可能ファイルはst、デスクトップアプリケーションとアイコンはshittyという名前です:
install -Dm755 ./st /usr/local/bin/st
install -Dm644 shitty.desktop /usr/local/share/applications/shitty.desktop
install -Dm644 shitty.svg /usr/local/share/icons/hicolor/scalable/apps/shitty.svg
Exec=stはPATH経由で解決され、Icon=shittyはアクティブなアイコンテーマ経由で解決されます。
Nix
flakeはshittyパッケージと開発シェルを提供します:
nix build # ./result/bin/st
nix run # stを直接実行
nix develop # clangツールチェーン + ビルド依存関係
パッケージをflakeオーバーレイからNixOSシステムに追加するか、以下のようにします:
{
inputs.shitty.url = "github:pg83/shitty";
# ...
environment.systemPackages = [ inputs.shitty.packages.${system}.default ];
}
flakesなしのnix-shellにはshell.nixが引き続き利用可能です。
テスト
完全なネイティブおよびインポートされた適合性スイートを実行:
./build test
ネイティブブラックボックステストスイートのみを実行:
./build test_suite
GitHub CIと同じ通常のチェーンとサニタイザーチェーンを実行:
nix build -L --no-link .#checks.x86_64-linux.build && nix build -L --no-link .#checks.x86_64-linux.tests
nix build -L --no-link .#checks.x86_64-linux.build-asan && nix build -L --no-link .#checks.x86_64-linux.tests-asan
nix build -L --no-link .#checks.x86_64-linux.build-ubsan && nix build -L --no-link .#checks.x86_64-linux.tests-ubsan
完全なスイートのインストルメント化されたコピーをビルドし、LCOV、テキスト、およびブラウズ可能なHTMLレポートを生成:
nix build -L -o result-coverage .#checks.x86_64-linux.coverage
xdg-open result-coverage/html/index.html
同じレポートがすべてのGitHubカバレッジ実行に添付され、ファイルごとおよびプルリクエストのカバレッジのためにCodecovにアップロードされます。ネイティブスイートは、実際の生のPTYを介して専用のヘッドレスst_testバイナリを駆動し、外部から見えるターミナルスナップショットと出力をチェックします。プロダクションのstバイナリは、テスト制御エントリポイントを公開しません。
既知の制限
Shittyは現在、双方向テキストレイアウトやsixelなどのインライングラフィックスプロトコルを実装していません。一部の歴史的なDECおよびxterm拡張は、サポート対象プロファイルから意図的に除外されています。
ライセンスの移行と著作権
ShittyはZuttyのハードフォークおよび完全な書き直しです。元のZuttyターミナルエミュレータはTom Szilagyiによって作成されました。Shittyはその系譜を維持しますが、アーキテクチャ、レンダラー、プラットフォーム統合、テスト戦略、プロジェクトアイデンティティを置き換えます。Shittyは、インポートされたGPLベースラインからMITのみのコードベースに移行中です。最終的なプロジェクトライセンスとしてGPLを維持する意図はありません。このリポジトリに最初にインポートされたソーススナップショット、およびそのスナップショットより前のコードは、GPLv3以降のライセンスのままです。新しいShittyへの貢献は、GPLv3以降およびMITのデュアルライセンスです。GPLのみのインポートされた素材がツリーに残っている間は、結合された作品の配布は依然としてGPLの対象となります。正確な条件と貢献ポリシーについては、LICENSE、LICENSE.GPL3、LICENSE.MIT、およびCONTRIBUTING.mdを参照してください。Tom Szilagyiは、Shittyが派生したZuttyの元の作者です。Shittyは、歴史的なコードの系譜がそれらを必要とする場所で彼の著作権表示を保持しています。それ以降の作業は、Shittyの貢献者の著作権です。