Ghostty 源码拆解
从进程入口到 GPU 帧的 Ghostty 源码阅读路线
Ghostty 源码拆解
Ghostty 的核心问题不是“把字符画到窗口里”,而是:在 shell、PTY、终端协议、字体 shaping、GPU 和原生窗口系统之间,如何保持高吞吐、低延迟、可移植,又不牺牲终端兼容性。
这套笔记以 ghostty-main 本地快照为基线,沿用 refs/dg-ai-notes 的拆解方法:每章都把概念、源码证据、运行链路、设计取舍和失败路径放在一起。
先看一张总图
CLI / AppKit / GTK
│ runtime callbacks + C ABI
▼
App ─── Surface ─── Renderer Thread
│ │ │
│ └──── Termio ──┘
│ │
│ PTY / subprocess / xev
│ │
└──────── TerminalStream
│
Parser → Terminal → Screen/Page
│ │
└──── State ───┘
│
font shaping + atlas
│
Metal/OpenGL/WebGL章节导航
| 章节 | 核心问题 |
|---|---|
| 00. 阅读指南 | 如何带着问题读一个 4,000+ 文件的终端项目? |
| 01. 全景架构 | Ghostty 的共享核心、运行时和渲染边界在哪里? |
| 02. 启动与运行时 | 一个进程如何从 main 走到窗口和线程? |
| 03. 配置与输入 | 配置、keybind、action 如何变成运行时行为? |
| 04. PTY 与 Termio | shell 输出如何被读取、写回和跨线程传递? |
| 05. VT Parser 与 Terminal | 转义序列如何改变终端状态? |
| 06. Screen 与 Scrollback | 网格、alternate screen、scrollback 和压缩如何组织? |
| 07. 字体与 Renderer | 一个 Unicode cell 如何成为 GPU 可绘制几何? |
| 08. 平台宿主 | macOS SwiftUI、GTK 和 embedded runtime 如何复用核心? |
| 09. libghostty 与 C API | Ghostty 如何从应用变成可嵌入库? |
| 10. 构建、测试与发布 | Zig build graph 如何产出 exe、库、WASM 和文档? |
| 11. 源码地图 | 遇到具体问题时应该打开哪些文件? |
| 12. 术语与不变量 | 高频类型、线程边界和不能破坏的约束是什么? |
阅读声明:本文是独立学习笔记,不是 Ghostty 官方文档。对于上游持续变化的内容,以本文记录的本地快照和源码路径为准。