Skip to content

0.15.1

2025/1/20,0.15.1 发布,自上一个版本来历时 5 个月,共有 162 位贡献者参与,进行了 647 次提交!

Zig 官方团队直接从 0.14.0 跨越到了 0.15.1。在默认选择 Zig 的 x86 后端后,调试编译速度提高了 5 倍;正在开发的 aarch64 后端也紧随其后。同时,随着 Writergate 事件以及一系列语言变更和标准库的调整,大量 API 有破坏性更改;这预示着 async/await 即将重生;也是语言稳定化的最后关头。

编译器重大改进

x86 后端性能突破

调试模式的编译速度提高了 5 倍;这是本次更新最显著的性能改进。x86 后端现在是调试模式的默认选择,为缩短开发周期提供了强有力的支持。

aarch64 后端开发进展

aarch64 后端的开发也在稳步推进,持续优化 ARM 平台支持,为多架构开发提供更好的体验。

增量编译功能增强

增量编译功能得到了进一步优化,现在支持:

  • 与文件系统监视结合使用
  • 仅检查编译错误模式
  • 更快的重建速度

多线程代码生成

编译器现已支持多线程代码生成,能够充分利用多核 CPU 的性能优势。

语言特性重大调整

移除 usingnamespace 关键字

这是一个破坏性变更usingnamespace 关键字被完全移除。所有使用 usingnamespace 的代码都需要重写,建议采用显式导入方式替代,以提高代码可读性和可维护性。

移除异步关键字

asyncawait 关键字已被移除,当前异步编程模型也随之取消,为未来新的异步方案做准备。这预示着 Zig 协程 的重生。

增强对非穷尽枚举的 switch 支持

新增对非穷尽枚举使用 switch 语句的支持,提高了枚举处理的灵活性,能够更好地处理未知枚举值,增强代码的健壮性。

扩展布尔向量运算符支持

布尔向量现在支持更多运算符,包括逻辑运算和比较运算。

内联汇编:类型化的破坏描述符

内联汇编现在支持类型化的 clobber 列表,提供了更好的类型安全保证。

指针转换能力增强

@ptrCast 现在允许从单项指针转换为切片,提供了更大的灵活性。

调整 undefined 运算规则

undefined 值的算术运算规则有所调整,任何与 undefined 的运算结果都将返回 undefined

加强有损转换检测

对于可能导致精度损失的整数到浮点数转换,编译器会视为错误。

标准库重大变更

Writergate:I/O 接口完全重构

这是本次更新中最重大的破坏性更改,被社区称为 "Writergate":

  • std.io.Readerstd.io.Writer 接口被完全重新设计
  • 新接口采用非泛型设计
  • 缓冲区位于接口之上
  • 旨在提高性能并减少不必要的拷贝
  • 需要大量代码重写

格式化系统调整

格式化系统进行了重要调整:

  • 调用自定义 format 方法需要使用 {f} 格式说明符
  • format 方法签名简化,移除了格式字符串和选项参数
  • 格式化打印不再处理 Unicode
  • 新增了更多格式化说明符

ArrayList 非托管化

容器类型的重要变更:

  • std.ArrayList 现在默认采用非托管方式
  • 开发者需要显式提供分配器
  • 与其他非托管容器保持一致
  • 提供更好的内存管理控制

链表去泛型化

链表类型进行了重构,去除了泛型化设计。

HTTP 客户端和服务器

标准库新增了 HTTP 支持,提供内置的 HTTP 客户端和服务器功能。

TLS 客户端

新增内置 TLS 支持,可以建立安全的 TLS 连接。

环形缓冲区

新增了环形缓冲区类型,提供高效的循环缓冲区实现。

移除 BoundedArray

BoundedArray 被移除,建议使用 ArrayList 或固定大小数组替代。

构建系统改进

移除隐式根模块

构建系统移除了对隐式根模块的支持,现在需要在构建脚本中明确指定模块;这提高了构建配置的清晰度和准确性。

macOS 文件系统监视

在 macOS 上新增了文件系统监视功能:

  • 能够在文件更改时自动触发重建
  • 支持 --watch--debounce 选项
  • 显著提高开发效率

Web 界面和时间报告

构建系统现在支持 Web 界面和详细的时间报告功能。

模糊测试器

Zig 0.15.1 集成了一个内置的模糊测试器:

  • 支持进程内模糊测试
  • 提供 Web UI 界面
  • 支持实时代码覆盖率显示
  • 可以快速发现代码中的潜在问题

工具链更新

LLVM 20

升级到 LLVM 20,带来了:

  • 更好的优化支持
  • 新的目标架构支持
  • 改进的调试信息生成
  • 更好的 C++ 交互性

FreeBSD 和 NetBSD libc 支持

在交叉编译时新增了对动态链接的 FreeBSD 和 NetBSD libc 的支持。

glibc 2.42

升级到 glibc 2.42,并支持静态链接本机 glibc。

MinGW-w64 更新

MinGW-w64 工具链得到了更新,进一步改进了对 Windows 的交叉编译支持。

zig libc 和 zig cc 增强

zig libczig cc 命令的功能得到了增强:

  • 更好的 GCC 兼容性
  • 支持更多编译选项
  • 更清晰的错误报告

版本跳跃说明

Zig 官方团队选择直接从 0.14.0 跳跃到 0.15.1,这一决策反映了:

  • 本次更新包含的重大变更数量之多
  • 对编译器性能的重要改进
  • 标准库接口的重大重构
  • 为未来版本奠定更坚实的基础

升级挑战与机遇

主要挑战

  1. Writergate:I/O 接口的完全重构需要重写大量相关代码
  2. 移除 usingnamespace:需要调整导入方式
  3. 异步代码调整:需要移除 async/await 使用
  4. ArrayList 变更:需要调整容器使用方式

主要机遇

  1. 编译速度提升:5 倍的调试编译速度改进
  2. 更清晰的代码:移除隐式行为,提高代码可读性
  3. 更好的性能:新的 I/O 接口设计更高效
  4. 开发效率:文件系统监视功能和模糊测试器

社区影响

这次更新对 Zig 社区产生了重要影响:

  • 学习曲线:新用户需要适应新的接口设计
  • 迁移工作:现有项目需要进行大量调整
  • 性能收益:编译速度的显著提升改善开发体验
  • 生态系统:库作者需要更新以适配新接口

技术债务清理

本次更新体现了 Zig 团队对技术债务的积极清理:

  • 移除了有争议的 usingnamespace 特性
  • 重构了性能不佳的 I/O 接口
  • 统一了容器类型的设计理念
  • 为未来的语言演进奠定坚实基础

未来展望

0.15.1 为 Zig 的未来发展奠定了重要基础:

  • 编译性能:为大型项目开发提供更好支持
  • 接口设计:更一致、更高效的标准库
  • 开发体验:更快的编译和更好的工具支持
  • 语言稳定性:移除不稳定特性,为 1.0 做准备

路线图

I/O 作为接口

I/O 系统将继续作为接口进行发展和完善,为未来的异步编程模型做准备。

建议

对于 Zig 开发者:

  1. 谨慎升级:在测试环境中充分验证
  2. 分步迁移:逐步调整代码以适配新接口
  3. 充分利用性能优势:积极采用有关编译速度的改进
  4. 关注社区动态:参与社区讨论,分享迁移经验和最佳实践

0.15.1 是 Zig 发展历程中的一个重要里程碑,虽然带来了较多的破坏性变更,但为语言的长期发展和性能提升奠定了坚实的基础。这标志着语言稳定化的最后阶段,为 1.0 版本的正式发布做好了充分准备。