Zig 新的 bitCast 语义与 LLVM 后端改进
对这篇 devlog 和 Zig 的整体评价
- 许多读者称赞这篇 devlog 的深度和清晰度,并将其与其他地方的“低努力”或 AI 生成内容进行对比。
- 不少人说这让他们更想多使用 Zig,并把这些文章看作对这门语言很有效的“广告”。
- 也有人欣赏 Zig 对 AI 的立场,以及它对谨慎、明确设计的重视。
任意宽度整数和 packed structs
- 多位评论者非常喜欢任意宽度整数,原因包括:
- 自定义浮点和 ML 格式。
- FPGA 风格的位切片以及协议/消息解析。
- 模拟器:总线、奇数位宽寄存器/计数器,以及与数据手册匹配的位精确布局。
- 防止错误(例如
u6的移位计数、u12传感器范围)以及编译期范围检查。
- 也有人更偏好显式的打包/解包或 bitset(例如
StaticBitSet),因为性能或清晰度更好,尤其是像u729这样非常宽的整数。 - Zig 的模型(逻辑位、packed structs,以及带检查的算术)被强调为相较 C bitfields 的一大差异化特性。
新的 @bitCast 语义与端序
- 旧行为:重新解释取决于机器端序。
新行为:它基于一种逻辑上的、类似小端的位顺序,在所有目标上都相同。 - 批评者认为:
- 这破坏了“bit cast 会镜像内存布局”的直觉。
- 现有依赖端序的代码(使用字节交换)现在可能出错。
- 如果单独提供一个“逻辑位”内建函数,再加上原始 transmute,会更清晰。
- 支持者认为:
- 它消除了一个重大的可移植性陷阱,并且与 packed structs 已有的行为一致。
- 仍然可以通过
@ptrCast+ 解引用 / memcpy 来实现原始重解释。 - 1.0 之前的破坏性变更是可以接受的,而且这很可能修复了一些此前不可移植的代码。
关于 u24 以及 ABI / 硬件细节的争论
- 一方认为,允许
[3]u8↔u24的 bitcast 在概念上是不对的,除非u24在布局上确实就是 24 位。 - 另一方回应:
- Zig 定义了清晰的 ABI,
u24可以由更大的整数承载,但仍代表 24 位范围。 - 任意宽度类型类似 C23
_BitInt,即使映射到小众硬件也很合适(例如通过 FP 单元做 24 位乘法、专用 GPU 操作等)。 - 它们即使不按字节对齐,也能实现紧凑打包和更安全的领域建模。
- Zig 定义了清晰的 ABI,
真实协议和格式中的端序
- 有评论者声称“大家都同意小端序”,而且很少需要转换;也有人反驳:
- 仍然存在大端文件格式(TIFF、PSD、AIFF)以及标准化的“网络字节序”。
- 低层网络、内核和驱动必须关注端序,并且经常需要在边界处转换。
- 有人建议将线上的 wire types 和内存中的领域类型明确分离,并在边界处做转换。
语言生态、营销以及“社会议题”
- 大家好奇为什么 Zig 比其他“C 替代品”如 Odin 或 C3 获得更多关注。
- 解释包括:
- 强大的 C 互操作性,包括直接导入 C 头文件。
- 使用 Zig 的高可见度项目(例如提到的工具和数据库)。
- 清晰的愿景、会议,以及有意识的社区建设/营销。
- 一位评论者将 Zig 的可见度部分归因于其与某些“社会议题”的感知一致性;也有人明确否认这是主要因素,并表示无论作者的政治立场如何,自己都会使用 Zig。
更广泛的元讨论
- 有人将一丝不苟的低层 Zig 工作(结构体打包、位布局)与“YOLO”式的高层应用开发进行对比,包括大量依赖 LLM 的工作流。
- 还有一些简短的旁支话题:
- LLM 在软件开发中的未来角色与“工艺型”编程。
- 长破折号和 Unicode 标点的使用与输入方式。
- 关于能否用
@bitCast做类似 base64 的转换的玩笑问题;回答指出技术上可行,但对大缓冲区来说生成的代码很可能很差。