大主张 — 怎么学、为什么 Zig 站在 C 旁边而不是取代 C
大主张 — 怎么学、为什么 Zig 站在 C 旁边而不是取代 C
这一章讲两件事: 这本书打算怎么教你(以及它不适合谁), 和 Zig 在整个编程语言世界里的位置——它经常被拿去和 C 比,但作者说这不是一场接班, 而是一场合作。 读完你会明白这本书为什么用「解剖」而不是「教程」的写法, 以及「Zig 是 C 的协作者」这句话在工程上具体是什么意思。
1. 这一章讲什么
第 1 章是全书的主张章,前两节先把两件事钉死:
- 教法的承诺(1.1 节):作者说他尽量不说「你该怎么做」,而是把代码「拆到 你能把每一行讲回给他听,直到 syscall 那一层为止」1。syscall(系统调用)是 程序向操作系统请求服务的入口——读文件、要内存、写网络,最后都是 syscall。 这句话的意思是:这本书不允许你「会用但不懂」。
- 定位的声明(1.2 节):Zig 不是来杀 C 的。它明确定位为与 C/C++ 无缝协作的 语言——新书Rare有生态荒,而 Zig 的答案是直接继承 C 那 50 年的生态存量。
这两节合起来回答一个前置问题:你该不该花时间学 Zig? 作者的筛选标准很直白,下一节展开。
2. 顶层全景:一条「筛人」的推理链
你想要「性能 + 可靠」的软件(原生库、数据处理、后端、嵌入式 OS……)
│
├─ 你愿意为理解底层花时间吗?── 不愿意 → 这本书明说劝退
│
├─ 你常被迫拿「长期质量」换「短期交付」吗?── 是 → 也会觉得 Zig 烦
│
└─ 愿意 → Zig 的社区文化(务实、显式、深学)对你是匹配项
│
└─ 那 Zig 的存量从哪来?── 不自建,直接继承 C 生态(1.2 节)
图说:前两节表面在介绍,实际在筛读者——先确认你是对的人,再给你讲东西。3. 核心原理
3.1 教法:拆到 syscall 为止
作者介绍学法的原话重心是两句:
这个顺序不能倒。先拆解(把别人写好的代码逐层剥开,看清每一行在干什么), 再动手(自己写时会犯的错,都能在拆解时认出来)。 拆解的单位不是「语法点」而是「一行代码为什么存在」: 这句为什么在这里?它最终会变成哪条机器指令、哪个系统调用?
3.2 作者的诚实:关于 AI 写代码
1.1 节里有一段在 2026 年的编程书里相当少见——作者正面回答 「我都能让 AI 写了,为什么还学 Zig」。
他的回答是三层:
-
先反问三个问题——你享受编程本身吗?你享受给用户和同行最好的体验吗? 你写的软件把性能和可靠放第一位吗?三个全否,「你说得对,学 Zig 对你没什么收益」2。
-
再讲 LLM 的现状。 LLM(大语言模型)就是 ChatGPT 那一类系统。
作者的判断是:「LLM 对系统编程并不擅长,不管什么语言」。 他猜一半原因是训练样本少——喂给 AI 学着生成代码的材料少; 一半原因是系统编程本身的特质3。
-
最后交代自己的实践——「尽我最大的努力,在写作此书时我没有发现 AI 工具对写 Zig 程序有帮助」;但他不堵死:你乐观的话,自己去试, 试出好办法告诉他4。
判断(我们的,不是书里的): 这段话值得注意的不是结论(2026 年的个人经验, 保质期很短),而是它的论证形状——作者没有说「AI 不行所以你要学」, 而是先问「你享受这件事吗」,把「学不学」从效率问题换成价值问题。 这是整本书的基调:它永远先谈价值,再谈机制。 如果错,会错在: 如果读者的目标纯粹是「尽快交付软件」, 这三个反问就不构成理由——它们只对「把编程当手艺」的人有效。
3.3 定位:C 的协作者,不是继任者
这是全书最硬的一个立场。作者的论证分四步:
第一步:承认 C 的存量就是它的资格。 C 代表「几十亿行经过实战检验的系统代码和编程经验」, Zig 社区「满怀感情地看着 C」5。所以 Zig 不把 C 当对手—— 「虽然 Zig 优先解决 C 也解决得好的那类问题,但它不是真正的竞争者」5。
第二步:指出 50 年里两边都变了。
软件这边,C 设计之后的几十年,我们对类型系统、内存、元编程的理解都加深了。
硬件这边,书里点了三个变化,头一个是向量指令:一条指令同时算一组数。
另外两个是 CPU 从「提高单核速度」转向「堆核」, 和硬件缓存的普及——CPU 与内存之间那层小而快的暂存。
书里由此得出结论:「在 2020 年代写优化软件的样子,和 90 年代很不一样」6 ——这里的「优化」是日常意思:让软件跑得更快。 Zig 的设计优先级就是从「这个新现实」里推出来的。
第三步:给出合作的工程细节——Zig「真的会讲 C 的话」。 这一节的标题就是宣言:「ZIG truly FLUENT IN C」7。具体能力列了四条:
| 能力 | 它解决什么 |
|---|---|
| 空指针必须处理,且「烘进了类型系统,有编译器强检」8 | C 里把 NULL 传给没预期的代码,一整类 bug 直接消失 |
| 指针类型区分「指向单个」和「指向多个」,还有内建的胖指针类型 | C 里 char* 到底指一个还是一串,全靠注释和约定 |
| 构建脚本可复用,每次都能从源码静态链接出优化过的程序 | 告别「在我机器上能编过」 |
| libc 直接捆在 Zig 编译器里 | 不用担心版本不兼容 |
还不止「能链接 C/C++」——Zig 的构建系统本身就是 C/C++ 的完整构建系统, 与 Clang(最广泛使用的 C/C++ 编译器之一)即插即用兼容9; Zig 代码甚至「可以像任何 C 程序一样 import C 兼容的头文件」9。
第四步:收尾金句。 「正如 C 支撑了过去 50 年的技术,Zig 是为了面对接下来的 50 年而生—— C 就在它身边」10。
3.4 三个真实项目:这条定位的物证
作者没让「会讲 C 的话」停在口头,点了三个用 Zig 的项目, 每个都证明一件具体的事。这一章的「主线例子」就是这三个项目—— 每个项目在这个论证里占一步:
主张:Zig 在工业级 C/C++ 依赖堆里能挑大梁
│
├─ 第 ① 步 Zig 编译器本身 —— 建在 LLVM/Clang 之上(两个主要是 C++ 的项目)
│ 证明:Zig 团队自己就是最大的 C++ 用户之一
│
├─ 第 ② 步 Bun —— JS/TS 工具集,用 Zig 驾驭 JavaScriptCore、
│ WebKit、TigerBeetle 这些工业规模的 C/C++ 依赖[^11]
│ 证明:从零开始的新项目,选 Zig 当「依赖堆的管理者」
│
└─ 第 ③ 步 Lightpanda —— 为自动化而生的浏览器,
用 Zig 管理 Chrome 里用的 V8 JS 引擎等一堆 C/C++ 库[^12]
证明:连「浏览器 + JS 引擎」这种最重型的 C 依赖,Zig 也接得住
图说:三个项目一个比一个重——从编译器到工具集到浏览器,
全部把 Zig 当「C/C++ 生态的驾驶舱」用。注意这三个例子的共同结构:Zig 不是项目里的唯一语言,而是管 C/C++ 依赖的那层。 这正是「协作者」定位的工程含义——不是「取代你的 C 代码」, 而是「让你的 C 代码有个更好的驾驶员」。
3.5 Zig 从 C 那里继承了什么
作者列了 C 最受爱戴的三条,说 Zig 全部接住11:
| C 的遗产 | Zig 的接法 |
|---|---|
| 语法不该是理解的障碍(C「用简单达到深厚」) | 沿用简明的 C 风语法,更强调可读性、消灭隐式行为 |
| 编译出的二进制应当和代码对应紧密(C 被称「高级汇编」) | 在现代计算环境里复刻这个性质 |
| 程序员应有最终决定权(C 没什么护栏,但学会负责就能写出极快极妙的代码) | 提供大量安全特性,但也给你在必要时关掉所有检查的权力 |
第三条值得停一下:它解释了后面章节里反复出现的 @intCast、+%、
undefined 这些「危险但显式」的工具——它们就是「最终决定权」的具体形状。
4. 作者的判断与证据
| 判断 | 是书里给的证据,还是作者的推测 |
|---|---|
| LLM 不擅长系统编程 | 作者观察 + 个人猜测(「样本量」和「系统编程的特质」各占一半,他明说 I can speculate)3 |
| AI 工具对写 Zig 没帮助 | 作者的个人实践(「尽我最大的努力……没有发现」),且限定了时间4 |
| Zig 与 C 协作比 C 与 C 协作还顺手 | 书里的断言 + 四条机制支撑(空指针进类型系统等),但缺第三方数据 |
| Bun、Lightpanda 证明 Zig 管得住 C 依赖 | 事实陈述(项目真实存在),但「管得住」的程度书里没有量化 |
| Zig 面向「接下来的 50 年」 | 愿景修辞,不是论证 |
5. 边界与局限
- 「AI 写不了系统代码」是全书过期最快的一句话。 它写于 2026 年, 是这个领域变得最快的部分;读者今天拿它当现状就是误用。
- 三个物证都是「新项目选 Zig」,没有一个「存量 C 项目迁移到 Zig」。 「协作者」的最难场景——把 Zig 渐进引入一个几十年的老 C 代码库—— 书里还没有案例。
- 「空指针进类型系统」这类改进,C 社区并非不知道 (Clang 静态分析、MISRA 规范都在做类似的事),书里没提这条对照, 读者容易把「C 做不到」理解过头。
- 这一节大量内容是社区自我叙事,引用它时最好说「Zig 社区这样看自己」, 而不是「Zig 客观上就是这样」。
6. 可带走的
- 教法的承诺:拆到 syscall 为止——本书的单位是「一行代码为什么存在」, 不是「语法点」;
- 作者的筛人标准:享受编程、在乎用户、在乎性能可靠,三者缺一, 这本书明说你不合适——这个诚实比多数入门书强;
- AI 与系统编程的关系:书里的结论(2026 年,个人经验)保质期极短, 但「先问价值、再谈机制」的论证形状值得学;
- 「协作者」的工程含义:链接 C、编译 C、import C 头文件、构建系统兼容 Clang、 libc 内捆——五条全齐了才叫 fluency;
- 三个物证的结构:Zig 编译器 / Bun / Lightpanda, 一个比一个重,共同点是 Zig 当「C 依赖的驾驶舱」,不是当替代品;
- 从 C 继承的三条:语法不挡路、二进制对应代码、程序员有最终决定权—— 后文所有「危险但显式」的工具都出自第三条。
7. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| 拆到 syscall 为止的教法 | 1.1 How are we going to learn Zig? | text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:31(搜「down to the syscall」) |
| 项目类型:原生库、数据处理、后端、嵌入式 | 1.1 How are we going to learn Zig? | text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:5(搜「native library」) · text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:8(搜「zero to robust code」) |
| 对 AI 的三个反问 | 1.1 How are we going to learn Zig? | text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:52(搜「perfect your craft」) |
| LLM 不擅长系统编程 | 1.1 How are we going to learn Zig? | text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:65(搜「LLMs aren」) · text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:67(搜「sample size」) |
| 写作时 AI 工具对 Zig 没帮助 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:5(搜「best efforts」) |
| 协作者而非继任者 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:12(搜「own approach to making systems」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:16(搜「battle-tested」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:18(搜「with affection」) |
| 硬件变迁改变优化样貌 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:21(搜「innovations like vector」) |
| 面向未来 50 年,C 在身边 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:27(搜「next 50」) |
| 会讲 C 的话:四条能力 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:38(搜「TRULY FLUENT IN C」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:44(搜「baked into the type system」) |
| 构建系统兼容 Clang、import C 头文件 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:35(搜「drop」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:36(搜「header files」) |
| 三个物证项目 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:58(搜「cornerstones」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:60(搜「Bun」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:63(搜「Lightpanda」) |
| 从 C 继承的三条 | 1.2 Zig is C’s collaborator, not C’s successor | text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:77(搜「high-level assembly」) · text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:80(搜「final say」) |
Footnotes
-
出处:「1.1 How are we going to learn Zig?」第 31 段(
text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:31,搜「down to the syscall」)。原文:「I will pull on every relevant thread until you, the reader, can explain every line back to me, down to the syscall. After that, I'll provide ample opportunities for you to take the reins and start hacking.」 ↩ ↩2 ↩3 -
出处:「1.1 How are we going to learn Zig?」第 51–58 段(
text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:52,搜「perfect your craft」;:57,搜「resounding」)。三个问题原文依次是:「Do you enjoy the act of programming…」「Do you enjoy providing the best possible experience…」「Do you write software where performance and reliability are paramount?」第 58 段:「If your answer to all of these questions is a resounding 'No', you have a good point.」 ↩ -
出处:「1.1 How are we going to learn Zig?」第 65–67 段(
text/04-ch01-01-1-1-how-are-we-going-to-learn-zig.txt:65,搜「LLMs aren」;:67,搜「sample size」)。原文:「Unfortunately, LLMs aren't particularly good at doing systems programming regardless of the language.」「I can speculate that some of this has to do with sample size, and some of it has to do with inherent qualities of systems programming.」 ↩ ↩2 -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 5–7 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:5,搜「best efforts」)。原文:「at the time of writing I have not found AI tools to be helpful in writing Zig programs. However, if you are interested and optimistic, I would challenge you to try it yourself.」 ↩ ↩2 -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 15–18 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:16,搜「battle-tested」;:18,搜「with affection」)。原文:「C represents decades of battle-tested systems code and programming experience」「The Zig community looks upon C with affection.」 ↩ ↩2 -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 21–25 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:21,搜「innovations like vector」)。原文:「innovations like vector instructions, a switch from speeding up CPU cores to adding them, and the widespread implementation of CPU hardware caches means that writing optimized software looks very different in the 2020s than it did in the '90s.」 ↩ -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 38 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:38,搜「TRULY FLUENT IN C」)。原文标题即「ZIG IS TRULY FLUENT IN C」。 ↩ -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 44–53 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:44,搜「baked into the type system」)。四条能力在该栏中逐条列出:空指针进类型系统、指针分型与胖指针、可复用构建脚本 + 静态链接、libc 内捆。 ↩ -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 34–36 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:35,搜「drop」与「header files」)。原文:「Zig's build system is also a complete build system for C and C++ – drop–in compatible with Clang」「Zig code can even import C-compatible header files just like any C program.」 ↩ ↩2 -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 26–28 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:27,搜「next 50」)。原文:「Just as C has underpinned the last 50 years of technology, Zig is built to face the next 50 - with C right by its side.」 ↩ -
出处:「1.2 Zig is C’s collaborator, not C’s successor」第 68–86 段(
text/05-ch01-02-1-2-zig-is-c-s-collaborator-not-c-s-successor.txt:77,搜「high-level assembly」;:80,搜「final say」;:85,搜「off all of the checks when the situation demands」)。三条遗产逐条对应「Zig's inheritance」栏下的三个加粗标题:「Syntax should not be a barrier to understanding」「Your compiled binary should map closely to your code」「The programmer should have the final say」。 ↩