202209 | 锋芒毕露
Zig VS Rust 火花
在 9/10 号左右,在 Twitter 上牵起了一小波关于 Zig VS Rust 的小火花,以至于最后 Zig 创始人 Andrew Kelley 发推表示 Let us exist。这里稍微整理下这件事情的过程: 本次事件主要涉及两个人:
- Rust 核心贡献者: Patrick Walton
- Zig 社区 VP: Loris Cro
时间线
- 8/26 号,一篇关于 wasm 2 Game Jam 的分析报告中,使用 Zig 的人数最多
- 9/9 号,这篇报告在 HackerNews 上引起了热烈讨论,其中 Walton 在多处回复中表示 Zig 语言的劣势,并称
It’s perfectly reasonable to take the position that it’s deeply problematic for a language aiming for wide use in 2022 to not be memory safe. There’s no requirement that you “focus on tradeoffs”, especially since real people get hurt by memory safety problems.
- Loris 回复到:
I think you’re actively hurting the project that you care about in your ineffective crusade, but hey, don’t let me stop you.
- 9/10 号,有人发推对 tigerbeetle 内存分配方式表示好奇:所有内存必须在启动时静态分配好
- Walton 回复到:
The weird thing is that this is used as an example of why you supposedly don’t need language-enforced memory safety.
But that literally is language-enforced memory safety! Just way more restrictive than what Rust has: if you hate the borrow check, try the “no heap” check…
This is wrong because you can still have UAF from freed stack frames.
- Loris 针对 Walton 的回复说了句“What a boring, useless take.(原推的回复已经被 Loris 删除了,可以在这里看到历史):
- Walton 发推表示在 2022 年,所有语言都应该是内存安全,应该算是『编程语言界的共识』,并称 Zig 是行业的一大退步 😅
- Loris 专门发了一个 Twitter thread 来阐述『软件的目标不仅仅是内存安全,更重要的是正确』。比如 tigerbeetle 这里提到的。而且即便内存安全,也可能发生 OOM
总结
上面的链接比较多,这里稍微总结下这次争论的问题:
Rust 用户觉得 Zig 不是内存安全的语言,Zig 认为 Rust 的语言过度复杂,这反而会导致程序复杂度挺升,导致程序产生错误行为
使用 Zig 的人大概率也是 Rust 用户,之所以有了安全的 Rust,还来选 Zig,笔者觉得大概率就是本次争论的观点,Rust 过于复杂,导致程序员不仅仅要考虑业务行为,还需要按照 Rust 的风格来编程,这加剧了程序出错的可能性。
观点/教程
- How (memory) safe is zig? 作者重点介绍了在内存安全方面,Zig 的优劣势。尽管 Zig 相比 C 有了明显的改进,但相比 Rust 这种在编译期就能发现程序问题来说,显得有些鸡肋,但在一些可控的环境下,比如 WASM、嵌入式环境中,Zig 还是有发挥的空间
- Hacked std.PriorityQueue for constant time update
- Flutter/Dart + FFI + Zig: Flutter 使用 FFI 调用 Zig 示例
- Building a Tiny Mutex
- Perfecting WebGPU/Dawn native graphics for Zig
- Cross-Compiling and packaging C, Go and Zig projects with Nix 介绍如何基于 Nix 来进行交叉编译
- Revisiting the design approach to the Zig programming language Sourcegraph 的一档播客,对 Zig 创始人的采访,介绍了 Zig 的由来,其中提到一个性能优化点是:untagged union,这里有它的一些介绍:Andrew Kelley claims Zig is faster than Rust in perfomance
- Zig ⚡ Improving the User Experience for Unused Variables
项目/工具
- Zig 开发常用类库,如果读者的 Zig 项目托管在 GitHub,推荐加上 zig-package 这个标签,这样可以自动被 https://zig.pm/ 收录
- https://zig.run/ - 在线运行 zig 代码
- Zig Support plugin for IntelliJ and CLion version 0.0.7 released
- zig-napigen Automatic N-API bindings for your Zig project.
- Dart 通过 FFI 调用 Zig 库示例
- zig-gamedev
- loc in Zig 代码行数统计工具
- Grep in Zig
- randomutils Generate 64-bit random numbers
- zig-pico 树莓派 Pico SDK 的 Zig 绑定库
- stm32f4.zig STM32F4(ARM Cortex M4 的高性能 32 位微控制器) 固件抽象层