薪资天花板语言 Zig 出神作!HashiCorp 大神新作刷屏编程圈,Redis 之父直呼真香!

图片

编译 | Tina、核子可乐

最近,一款用 Zig 编写的终端模拟器正式发布了 1.0 版本。

Ghostty 自上线以来便迅速引发广泛关注,不仅因为其创始人 Mitchell Hashimoto 的背景,更因其卓越的品质让长期沉寂的终端模拟器领域焕发新机。作为 HashiCorp 的联合创始人,Hashimoto 在打造公司标志性产品(如 Terraform、Vagrant、Packer 和 Nomad)中发挥了至关重要的作用。这些工具已成为全球 DevOps 专业人士的核心利器。

图片

这款应用是免费开源软件,基于 MIT 许可证发布,旨在为大多数用户提供开箱即用的体验,无需额外配置。Ghostty 采用 Zig 编写,支持 GPU 加速,支持跨平台运行,发布时即可在 Mac 和 Linux 系统上使用。

在支持跨平台时,Ghostty 在 Linux 和 macOS 上都使用了各自平台的 GUI 构建,macOS 是基于 SwiftUI,而 Linux 是基于 Zig 和 GTK。

图片

图片

Redis 之父 antirez 也对 Ghostty 1.0 赞不绝口:“这将是一款改变游戏规则的工具。我刚在处理 Redis 的一些工作,输出了大量的调试信息和结果。通常情况下,终端会成为瓶颈,但这个工具却能在瞬间打印出 50 万条结果。而且,我还能在历史记录中快速回溯,性能丝毫没有下降。我太喜欢这个了!对于系统开发来说,这真的是一个巨大的提升。”

图片

试用了 Ghostty 10 分钟,感觉 Emacs 可以退休了。
为什么选择 Zig 编程语言?

至于为什么选择 Zig 语言来编写,Mitchell Hashimoto 非常简单直接地说:“选择 Zig 就是因为我喜欢它!它的语言特性非常适合这个终端项目。”

Mitchell Hashimoto 早在 2021 年底或 2022 年初就对 Zig 表现出了浓厚的兴趣。当时,他在推特上分享了自己对这门语言的好奇,但由于繁忙的工作,一直未能深入研究。然而,Zig 一直在他的脑海中挥之不去。

“背景上来说,我曾是一名专业的 C 程序员,大概干了一到两年的时间。我喜欢底层系统开发,其实我也喜欢 C。实际上,HashiCorp 的所有软件差点就用 C 写了,当时是在 C 和 Go 之间抉择,最终 Go 赢了,但我们非常接近选用 C。我想重回系统编程领域,但我也清楚 C 的各种缺陷,所以一直在寻找一种‘更好的 C’。对我来说,Zig 从一开始就像是这样的语言。在使用 Zig 几年后,我的感受依然如初,甚至更好了。写 Zig 代码每天都让我感到愉悦…… 这就是关键。”

关于为何未选择 Rust,Mitchell Hashimoto 明确表示:“我对 Rust 的使用已有足够经验,也因此知道自己不想每天都写 Rust。从哲学和技术成就的角度而言,我对 Rust 非常敬佩,认为它极其出色。然而,从个人体验来看,这种感受却显得较为表面化。当我在编写或阅读 Rust 代码时,并未感受到乐趣。而对我来说,开发的过程应该是有趣的,写代码本身就是一种快乐……这完全是一种风格上的选择。”

与大多数其他编程语言不同,Zig 实现了与现有 C 代码的真正无缝互操作性。这样的兼容性极为重要。正如 Zig 软件基金会社区副总裁 Loris Cro 所解释的那样:“Zig 基本上对传统编程基础设施进行了彻底革新,打破了过去 40 年间无人敢触碰的诸多惯例。C 和 C++ 是久负盛名的编程语言,也是开发工作的核心语言,它们能够完全控制硬件。然而,这些语言的工具链却问题重重。”Zig 则允许用户继承这些核心语言的功能,同时提供与之兼容、更强大的工具链和完善的功能集。

同时,他还指出,Zig 也解决了传统 C/C++ 开发中面临的一个核心问题:跨平台编译的难题。举个例子,如果我们正在开发一款小型独立游戏,并希望将成果交付给 Mac 平台的用户,问题就来了。将游戏代码从 Windows 编译到 Mac 一直是个非常棘手的过程。但有了 Zig,无论是 Zig、C 还是 C++ 编写的代码,甚至是混合编写的代码,Zig 都能确保顺利进行跨平台编译,支持 macOS 或 Linux 平台,并且效果十分优秀。

Zig 是一门新兴编程语言,而 Ghostty 的爆火,也让它成为了 Zig 编程语言的代言人之一。

图片

除 Ghostty 外,还有两家采用 Zig 的初创公司——Bun 与 Tiger Beetle,它们都对 Zig 寄予厚望。Bun 正在开发 Node.js 的同类竞争方案;而 Tiger Beetle 则希望构建一套分布式金融数据库,其高度依赖于对资源的精确控制。另外,Uber 也使用 Zig(并非作为主要语言)为 C 和 C++ 代码构建工具链,希望借此发挥 Zig 卓越的编译功能优势。

从设计理念上超越 C 和 Rust?

还值得一提的事情是,根据 2024 年的 Stack Overflow 调查,Zig 是该年度薪资最高的编程语言。这项调查涵盖了来自 185 个国家的 89,184 名软件开发人员,结果显示 Zig 开发人员的平均年薪达到 103,000 美元。Zig 因此也一炮而红、迅速吸引到更多开发者关注。

图片

接受调查的开发人员中,只有 0.83% 表示他们精通 Zig,这凸显了它在人才库中相对不为人知和稀缺性。

也许也正是因为这种稀缺性,再加上对高性能系统编程的不断增长的需求,可能导致了 Zig 开发人员的薪酬数字相当可观。

创始人 Andrew Kelley 对 Zig 的未来有着清晰的愿景:他希望 Zig 能成为 C 语言的接班人。

Andrew 深入研究了 C 语言的底层设计,发现许多我们习以为常的语言特性背后,其设计初衷并不总是最合理的。这种洞察促使他从根源上重新审视编程语言的设计。他认为,Zig 不应该仅仅是 C 语言的升级版,而应该是一门从底层逻辑上就与众不同的语言。

Andrew 提出了“全局最大化”的概念,即在设计语言时,要着眼于整体的最佳状态,而不是仅仅追求局部的优化。他认为,C 语言的一些设计选择虽然在当时看来是合理的,但从长远来看却限制了语言的发展。Zig 的目标是打破这些限制,构建一个更具可扩展性和适应性的编程语言。

为了实现这一目标,Zig 团队对 C 语言的许多传统概念进行了重新审视。例如,他们彻底摒弃了预处理器和宏,这些在 C 语言中被广泛使用的特性。这种看似激进的决定,实际上是为了让语言的设计更加简洁、一致。事实证明,它的内存分配机制不仅比 C 更加直观,甚至在性能上也有所超越。

Zig 的设计理念,无疑是对 C 语言的一场根本性变革。

Zig 设计方法的实际效果

Andrew 总是对编程语言背后的原理刨根问底。他不断挑战着 C 语言的一些根深蒂固的惯例,比如“为什么用 #define 而不用常量?”。许多程序员可能习惯了这么做,但很少有人去思考其中的缘由。Andrew 指出,这种设计其实是有问题的,因为在某些情况下,使用常量会触发编译错误,而这本不该发生。

在 Zig 中,他纠正了这些问题,“我们只是修复了问题,让该用常量的地方可以使用常量。就这么简单,这也是 Zig 的特色所在。”通过这样的设计理念,Andrew 发现通过修复 C 中不合逻辑的种种细节,预处理器完全可以被直接跳过。相反,Zig 选择使用条件编译。这也是 Zig 和 C 之间的关键差别:对于 Zig 来说,if 语句的条件在编译过程中是否已知才是重点。如果 if 语句的死分支中存在编译错误,则不会对其进行评估。

正因为如此,Zig 才能够放弃一部分 C 语言特性,但同时继续保持(甚至优化)可用性、安全性和运行速度。正是由于依托不同于以往的设计理念,Zig 的调整也带来了新的开发思路。

Zig 最初的诞生是为了“填补 C 语言的空白”,但随着项目的深入,它逐渐成长为一个功能更加强大、灵活的编程工具。尤其在内存管理方面,Zig 展现出了独特的优势。

这门语言采用不同于以往的内存分配方法:Zig 中没有全局分配器;相反,如果需要内存,则会传递自定义分配器,因此其能够在无法使用标准库的环境下正常起效,例如内核或者 arduino。

Zig 中的这种内存分配方法,旨在消除隐藏的内存分配机制。隐藏分配会以破坏直观性的方式干扰控制流与函数调用,导致开发人员很难在不加干预的前提下顺利复用现有代码。

Zig 内存分配器属于可选的标准库功能,而不再内置于语言本体当中。这些分配器可以定制,因此在桌面运行时使用可以 malloc(),而在内核上运行时则可使用标准库中的内核分配器,避免开发者重写 HashMap 数据结构。按照惯例,Zig 也拥有一个全局分配器。Andrew 呼吁开发者在所有单元测试中使用该分配器,这样如果存在内存漏洞,单元测试就能在代码发生实际内存泄漏之前及时报警。

速度与安全全都要

Zig 的性能比 C 还要强。这在一定程度上源自其面向数据设计方法,使得 Zig 编程性能得以增强,最终达成了在其他语言中无法实现的出色运行速度。

Zig 的创始人关于 CPU 缓存系统工作方式的模型非常直观:占用的内存越少,则 CPU 的处理压力就越小。根据这一观察,他专注于减少在 Zig 自托管编译器中创建对象时使用的内存量。如此一来编译器占用的内存更少,CPU 缓存的压力也随之下降,从而加快了代码运行速度——测试发现,Zig 的速度优势最高可达 35%。

Andrew 解释称,这样的优化程度在 Rust 等语言中根本不可能实现。Zig 性能提升的核心组件之一是其 untagged union。通过将标签存放在单独的数组之内,这样可以减少缓存压力。然而在 Rust 当中,如果不使用 untagged union,则会影响到代码安全性。

所以 Rust 的权衡在于:要编写速度更快的安全代码,就要牺牲掉充分利用计算机硬件的能力;而要想发挥硬件的全部性能,则须放弃一部分代码安全。Zig 与 Rust 的不同之处,就在于它全都要:用户既可以编写出运行速度更快的代码,也能通过对 untagged union 进行安全检查以保障安全。

Zig 在安全性方面采取了更加渐进的方法,由此回避必须符合“整体通用模式”所带来的安全设计陷阱。所以 Zig 创始人在创建 Zig 时做出的设计决策,使得该语言具备更高的性能与功能完备表现。

参考链接:

https://survey.stackoverflow.co/2023/#section-top-paying-technologies-top-paying-technologies

声明:本文为 InfoQ 翻译整理,未经许可禁止转载。

会议推荐

在 AI 大模型技术如汹涌浪潮席卷软件开发领域的当下,变革与机遇交织,挑战与突破共生。2025 年 4 月 10 - 12 日,QCon 全球软件开发大会将在北京召开,以 “智能融合,引领未来” 为年度主题,汇聚各领域的技术先行者以及创新实践者,为行业发展拨云见日。「更智能的企业 AI 搜索实践」、「反卷 “大” 模型」、「多模态大模型及应用」等热点专题,直击行业痛点,解锁可复制的经验与模式。现在报名可以享受 8 折优惠,单张门票立省 1360 元,详情可联系票务经理 18514549229 咨询。