Shitty Terminal Emulator: High-Performance C++23 Terminal
Overview
Shittyは、低レイテンシ、高速な起動、および予測可能なリソース利用を実現するために設計された、高性能なターミナルエミュレータです。ターミナル状態をCPU上に保持し、レンダリングにはLinuxではVulkan、macOSではMetalといったネイティブな計算バックエンドを利用することで、優れたスループットを実現します。
Performance Benchmarks
Apple-silicon MacBook(Menlo 12pt, 80x24 grid, 500 lines of scrollback)を使用した標準テストにおいて、Shittyは異なるデータタイプ全体でトップクラスのスループットを示しています:
Printable ASCII Throughput
100MBの表示可能なASCIIデータを処理する際、Shittyは比較対象のターミナルの中で最も速い実時間(wall time)とスループットを達成しました:
| Terminal | Wall Time | User Time | 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 |
Random Byte Throughput (Invalid UTF-8)
Shittyは、パーサーのワーストケースとなるランダムなバイト列の解析時でも、安定性とパフォーマンスを維持します:
| Terminal | Wall Time | User Time | 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 | N/A | N/A | N/A |
Technical Architecture
Parser Implementation
Shittyは、ターミナル状態マシンを生成するためにRagelを利用しています。このアプローチは、あらゆる可能なターミナル状態に対してアクションを伴う巨大な決定論的有限オートマトン(DFA)を作成することで、パーサーを完全かつ破壊不能なものにします。この設計により、ターミナルはcat /dev/urandomをクラッシュの原因ではなく、ベンチマークとして扱うことができます。
Rendering and Graphics
レンダリングはダメージ駆動型(damage-driven)であり、フリッカーのないリサイズと高い効率性を確保するためにネイティブなGPU計算バックエンドを活用します:
- macOS: Metal, CoreText, Cocoa, and IOSurfaceを使用。
- Linux: Vulkan and Waylandを使用。
- Glyph Management: 遅延グリフ・ラスタライズ(lazy glyph rasterization)と永続的なGPUグリフ・キャッシュを実装。
Unicode and Text Handling
ターミナルは、個々のコードポイントではなく、書記素クラスター(grapheme clusters)としてセルを扱います。これにより、以下のものが正しくレンダリングされます:
- Emoji sequences
- Variation selectors
- Combining marks
- Wide CJK characters
Feature Set
Shittyは、包括的なターミナル機能セットを提供します:
- Protocols: VT52からVT5xxコントロール、xterm拡張、および複数のマウス・プロトコル(X10, VT200, UTF-8, SGR, SGR-pixel, urxvt)をサポート。
- Keyboard Support: レガシー、
modifyOtherKeys、およびKitty keyboardプロトコルをサポート。 - Visuals: 16色、256色、および24ビットカラー、拡張アンダーライン・スタイルを含むサポート。
- Security: デフォルトでロックダウンされています。アプリケーションは、明示的な許可なしに選択範囲を読み取ったり、ホストのウィンドウを操作したりすることはできません。
- Self-Containment: バイナリは軽量でフォントを埋め込んでおり、フォントがインストールされていないシステムでも起動可能です。
Build and Requirements
ShittyはC++23で書かれており、Clangが必要です。macOSでは、システムのClangが同梱のlibstdに必要な-std=c++26をサポートしていないため、HomebrewのLLVMが必要です。
Key Dependencies:
- Python 3, Ragel 6, and
glslangValidator utf8proc2.9+librsvg(for build-time icon rendering)- Linux-specific: FreeType, HarfBuzz, Wayland client headers, xkbcommon, and Vulkan headers/loader.
Lineage and Licensing
Shittyは、Tom Szilagyiによって作成されたZuttyのハードフォークであり、完全な書き直しです。Zuttyの系譜を継承しつつ、アーキテクチャ、レンダラー、およびテスト戦略を置き換えています。
ライセンスに関しては、プロジェクトはGPLベースからMIT-onlyのコードベースへと移行しています。現在、新しい貢献はGPLv3-or-laterとMITのデュアルライセンスで提供されていますが、統合された成果物は、インポートされた素材 due to to imported material due to the GPLの対象となります。
Community Insights and Counterpoints
ユーザーと開発者の間の議論は、いくつかの論争点や関心事を示しています:
- Naming: プロジェクト名が議論を呼んでいます。ユーモアとして称賛する者もいれば、、プロフェッショナルではないため企業導入の妨げになる可能性があると主張する者もいます。
- Performance Context: 極端なスループット・ベンチマークの有用性について、一部のユーザーは疑問を呈しています。標準的なターミナル(Terminal.appなど)は、ほとんどのワークフローにおいて十分であることを指摘しています。あるユーザーは、X11環境下の
urxvtがASCIIスループットにおいて依然としてShittyを上回っている(~122 MiB/s)と主張しています。 - Competitive Benchmarking: Mitchell Hashimoto (creator of Ghostty) は、GhosttyのIOスループットがバージョン1.3.1以降、大幅に改善されたと述べ、
mainブランチとの比較ベンチマークを再実施することを提案しています。 - Missing Features: 批判的な意見として、他の現代的なターミナルと比較して、双方向テキスト・レイアウト(bidirectional text layout)やインライン・グラフィックス・プロトコル(sixelなどの)の欠在が、大きな欠陥として指摘されています。