Shitty 터미널 에뮬레이터: 고성능 C++23 터미널

개요

Shitty는 낮은 지연, 빠른 시작, 예측 가능한 리소스 활용을 위해 설계된 고성능 터미널 에뮬레이터입니다. 터미널 상태를 CPU에 유지하고 렌더링에 네이티브 컴퓨트 백엔드를 활용함으로써 우수한 처리량을 달성합니다: Linux에서는 Vulkan, macOS에서는 Metal을 사용합니다.

성능 벤치마크

Apple 실리콘 MacBook(Menlo 12pt, 80x24 그리드, 500줄 스크롤백)을 사용한 표준 테스트에서 Shitty는 다양한 데이터 유형에서 선도적인 처리량을 보여줍니다:

출력 가능한 ASCII 처리량

100MB의 출력 가능한 ASCII 데이터를 처리할 때 Shitty는 비교된 터미널 중에서 가장 빠른 벽 시간과 처리량을 달성했습니다:

터미널 벽 시간 사용자 시간 처리량
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)

Shitty는 랜덤 바이트를 파싱할 때도 안정성과 성능을 유지합니다. 이는 파서의 최악의 시나리오를 나타냅니다:

터미널 벽 시간 사용자 시간 처리량
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

기술 아키텍처

파서 구현

Shitty는 터미널 상태 머신을 생성하기 위해 Ragel을 사용합니다. 이 접근 방식은 모든 가능한 터미널 상태에 대한 동작을 갖는 대형 결정적 유한 오토마톤(DFA)을 생성하여 파서가 총괄적이고 파괴되지 않도록 보장합니다. 이 설계 덕분에 터미널은 cat /dev/urandom을 충돌의 원인이 아닌 벤치마크로 처리할 수 있습니다.

렌더링 및 그래픽

렌더링은 손상 기반이며 네이티브 GPU 컴퓨트 백엔드를 활용하여 플리커 없는 크기 조정과 높은 효율성을 보장합니다:

  • macOS: Metal, CoreText, Cocoa 및 IOSurface를 사용합니다.
  • Linux: Vulkan과 Wayland를 사용합니다.
  • 글리프 관리: 지연 글리프 래스터라이징과 지속적인 GPU 글리프 캐시를 구현합니다.

유니코드 및 텍스트 처리

터미널은 개별 코드포인트가 아닌 그래페메 클러스터로 셀을 취급합니다.これにより 다음이 올바르게 렌더링됩니다:

  • 이모지 시퀀스
  • 변형 선택자
  • 결합 표시
  • 넓은 CJK 문자

기능 세트

Shitty는 포괄적인 터미널 기능을 제공합니다:

  • 프로토콜: VT52부터 VT5xx 컨트롤, xterm 확장, 여러 마우스 프로토콜(X10, VT200, UTF-8, SGR, SGR-pixel, urxvt)을 지원합니다.
  • 키보드 지원: 레거시, modifyOtherKeys, 그리고 Kitty 키보드 프로토콜을 지원합니다.
  • 시각적: 16색, 256색, 24비트 색을 지원하며 확장된 밑줄 스타일도 포함합니다.
  • 보안: 기본적으로 잠겨져 있으며, 명시적인 권한 없이는 애플리케이션이 선택을 읽거나 호스트 창을 조작할 수 없습니다.
  • 자체 포함: 바이너리가 작고 폰트를 내장하여 폰트가 설치되지 않은 시스템에서도 시작할 수 있습니다.

빌드 및 요구 사항

Shitty는 C++23로 작성되었으며 Clang이 필요합니다. macOS에서는 시스템 clang이 필요한 -std=c++26을 지원하지 않으므로 Homebrew의 LLVM이 필요합니다.

주요 의존성:

  • Python 3, Ragel 6, 그리고 glslangValidator
  • utf8proc 2.9+
  • librsvg (빌드 타임 아이콘 렌더링용)
  • Linux 전용: FreeType, HarfBuzz, Wayland 클라이언트 헤더, xkbcommon, 그리고 Vulkan 헤더/로더.

계보 및 라이선스

Shitty는 Tom Szilagyi가 originalmente 만든 Zutty의 하드 포크이자 완전한 재작성입니다. Zutty 계보를 유지하지만 아키텍처, 렌더러 및 테스트 전략을 대체합니다.

라이선스 측면에서, 프로젝트는 GPL 기준에서 MIT-only 코드베이스로 전환 중입니다. 현재 새로운 기여는 GPLv3-or-later와 MIT 이중 라이선스로 제공되지만, 가져온 자료로 인해 결합된 작업은 여전히 GPL의 적용을 받습니다.

커뮤니티 인사이트 및 반론

사용자 및 개발자 간의 논의에서 몇 가지 논란점과 관심사가 강조되었습니다:

  • 이름: 프로젝트의 이름이 논쟁을 일으켰으며, 일부는 유머를 칭찬하고 다른 일부는 전문적이지 않으며 기업 채택을 방해할 수 있다고 주장합니다.
  • 성능 맥락: 일부 사용자는 극한 처리량 벤치마크의 실제 유용성을 의문시하며, 표준 터미널(예: Terminal.app)이 대부분의 워크플로에 충분하다고 지적합니다. 한 사용자는 X11에서의 urxvt가 여전히 Shitty보다 ASCII 처리량에서 우수하다고 주장했습니다(~122 MiB/s).
  • 경쟁 벤치마크: Ghostty의 창시자 Mitchell Hashimoto는 Ghostty의 IO 처리량이 버전 1.3.1 이후 크게 향상되었으며 main 브랜치와의 재벤치마크를 제안했습니다.
  • 누락된 기능: 비판자들은 양방향 텍스트 레이아웃과 인라인 그래픽 프로토콜(예: sixel)의 부재를 다른 현대 터미널과의 중요한 격차로 지적했습니다.

Sources