写点什么

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

  • 2025-01-16
    北京
  • 本文字数:3851 字

    阅读完需:约 13 分钟

大小:1.79M时长:10:27
薪资天花板语言Zig出神作!HashiCorp大神新作刷屏编程圈,Redis之父直呼真香!

最近,一款用 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

https://mitchellh.com/writing/ghostty-and-useful-zig-patterns

https://news.ycombinator.com/item?id=42517447

https://changelog.com/podcast/622

https://sourcegraph.com/podcast/andrew-kelley

 

2025-01-16 17:349879

评论

发布
暂无评论

设计一个大规模搜索引擎,大概有1000台服务器

linux大本营

搜索引擎 负载均衡 存储 分布式,

linux脚本定义一个二维数组

linux大本营

Linux 脚本 二维数组

我的开源项目与开源经历分享

秦少卫

GitHub 开源 前端 Fabric.js 图片编辑器

什么是前端开发领域的 Cumulative Layout Shift 问题

汪子熙

前端开发 angular web开发 web开发基础 三周年连更

职场进阶必须拥有的4种能力,你掌握了吗?

Jack

Reactive响应式编程系列:解密Lettuce如何实现响应式

大步流星

Reactive lettuce 响应式编程系列 Lettuce如何实现响应式 Redis响应式

Spring 的 IoC(控制反转)

HoneyMoose

挑战 30 天学完 Python:Day12 模块Module

MegaQi

挑战30天学完Python 三周年连更

Mysql主从复制

乌龟哥哥

三周年连更

音视频八股文(3)--ffmpeg常见命令(2)

福大大架构师每日一题

音视频 ffmpeg

一文带你看通透,MySQL事务ACID四大特性实现原理

架构精进之路

MySQL 数据库 后端 事务 三周年连更

Android WebView使用与JS交互

松柏不怕雪

webview js java; Android; JS Bridge

时间管理:不要让时间偷走你的饼干

蔡农曰

程序员 生活 时间管理

在OpenHarmony 开发者大会2023,听见百业同鸣

脑极体

鸿蒙

2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng

福大大架构师每日一题

Go 算法 rust

我的Gopher成长之路

闫同学

三周年连更

让GPT学会使用工具,拓展技能

蔡超

GPT ChatGPT LLM GPT-4 #LangChain

深度学习基础入门篇[七]:常用归一化算法、层次归一化算法、归一化和标准化区别于联系、应用案例场景分析。

汀丶人工智能

人工智能 机器学习 深度学习 归一化算法

ubuntu安装x11 forword,并做好配置

linux大本营

Linux ubuntu

如何在lua中设置计时器

linux大本营

lua 协程 Coroutine 计时器

Django笔记十四之统计总数、最新纪录和空值判断等功能

Hunter熊

Python django like contains startwith

深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,Drop Connect】等

汀丶人工智能

人工智能 机器学习 深度学习 正则化 注意力机制

dpdk l2fwd需要配置哪些参数

linux大本营

DPDK

企业微信接入系列-上传临时素材

六月的雨在InfoQ

企业微信 三周年连更 企业微信接入 上传临时素材

dbtemplate 是什么

weigeonlyyou

mybatis ORM 嵌入式应用 API Gateway 嵌入式设备

测试CLIP zero-shot learning | 深度学习

AIWeker

深度学习 多模态 CLIP 三周年连更

面对当下火爆的AIGC,我们可以做些什么? | 社区征文

AXYZdong

三周年征文

linux脚本执行可变参数任务

linux大本营

Linux 脚本

Java 把 Map 的值(Value)转换为 Array, List 或 Set

HoneyMoose

为什么要理解OpenAI和GPT-4?LexFridman谈对话Sam Altman开场白

B Impact

iOS MachineLearning 系列(3)—— 静态图像分析之区域识别

珲少

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