从 Rust 转到 Zig 是什么感觉

Zig 试图成为“现代版 C”的努力,来自 Rust 的开发者对此看法不一:他们在显式内存管理、以分配器为中心的设计和强大的编译期特性之间,与 Rust 更强的安全保证和函数式风格易用性进行权衡。许多人认为 Zig 对于底层、性能关键领域很有吸引力,因为这些场景里对分配和数据布局的控制很重要,但也会质疑这是否值得放弃 Rust 的借用检查器、更丰富的类型系统和成熟的工具链。讨论还涉及对 AI 编辑技术写作日益加剧的不安,以及在 LLM 时代,人们对学习新编程语言的个人热情正在减弱的更广泛感受,不过语言设计和概念对于有效使用这些工具仍然至关重要。

Zig vs. Rust:总体看法

  • 许多人认为 Zig 现代、快速,而且“像 C 但更好用”,拥有很强的 C/C++ 互操作和交叉编译能力,但明显比 Rust 更年轻,也更粗糙。
  • Rust 被描述为“带有浓厚函数式影响的命令式语言”,很适合“重新想象的 C++”这一定位,并且工具链和 IDE 支持成熟得多。
  • 一些评论者强调,Zig 是有意设计得比 Rust 更底层、更显式的,没有隐藏的分配或控制流;另一些人则认为 Rust 也能提供同样细粒度的控制,只是更安全。

函数式风格 vs. 命令式风格

  • Rust 的函数式惯用法(迭代器、map/filter/flat_map、枚举、模式匹配、单子式错误类型)被一些人称赞为优雅且富有表现力,尤其适合 API 设计。
  • 也有人觉得冗长的迭代器链比直接的循环更难读,甚至“疯狂”,认为 Rust 爱好者夸大了可读性收益。
  • 在 Zig 中可以使用函数式风格,但往往感觉不实用,因为你必须显式管理分配器;纯转换可能会变得更耗内存,或者需要更多样板式记录工作。
  • 关于“monads”的争论主要围绕 flat_map 和组合器的普遍使用;一些人认为这只是风格选择,而不是语言的硬性限制。

分配器、Arena 与内存管理

  • 围绕 Zig、Odin、Jai 等语言的“分配器痴迷”出现了一个大分支讨论:
    • 支持方:Arena 和自定义分配器在游戏、内核、数据库,以及严格的实时或按请求/按帧工作负载中至关重要;显式的分配策略能编码重要的性能决策。
    • 怀疑方:大多数现实世界软件并不需要以分配器为中心的设计;对分配器泛型化的 API 可能过度设计;现代通用分配器(或更好的 malloc 实现)通常已经足够。
  • 有几条评论指出,arena 可以简化生命周期管理(整体释放)并减少手动指针追踪,但也可能增加内存占用,并使哈希表之类的数据结构更复杂。
  • Zig 没有全局分配器,这迫使分配策略必须显式化(通常通过参数传递),有些人认为这是优点,也有人觉得很吵。

编译期特性:Zig comptime vs. Rust const

  • Rust ცდილ在编译期求值时与运行时行为保持完全一致(相同的目标语义),这限制了允许的内容(例如 const 中对浮点和 trait 的支持有限)。
  • Zig 的 comptime 更强大、更通用,但其结果可能在编译期和运行时之间不同,尤其是在浮点和平台差异方面。
  • 有些人看重 Rust 更严格的保证,因为它有利于可复现构建;另一些人更喜欢 Zig 的灵活性,并认为它的 comptime 在今天实践中更有效。

工具链与开发体验

  • Rust 的工具链(cargo、IDE 集成、生态系统)普遍被认为领先很多。
  • Zig 的命令行工具和交叉编译受到称赞,但缺乏稳健的 IDE 支持也被指出是一个早期且令人印象深刻的摩擦点。
  • 有些人喜欢在 Zig 中重新发现“CLI 优先”的工作流,以及大型、自包含的文件。

语言热度、LLM 与动机

  • 一些评论者表示,在 LLM 时代,对新语言的兴奋感下降了,因为当 AI 代写大量代码时,细节性的语言知识似乎不那么重要。
  • 也有人认为,概念、抽象和系统设计比以往更重要,因为你必须引导并验证 LLM 的输出。
  • 对文章措辞中明显的“AI 风格”也有不少不满;一些人建议作者现在必须有意识地避免这些习气,才能显得真实。

更广泛的语言哲学

  • 有人认为不可能存在“真正的 C 继任者”,因为 C 缺乏安全特性本就是为了“高级汇编”用途而有意为之;任何护栏都会改变类别。
  • 对于系统语言(C、Rust、Zig)是否应该用于应用程序本身也存在分歧;有人说只适合 OS/底层代码,另一些人则指出数据库、服务器、游戏等性能关键应用也很适合。
  • Zig 被视为吸引那些仍然喜欢 C、并希望得到一个现代而显式版本的开发者;Rust 则更吸引那些想要强安全性和抽象能力的人。