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
的代码都需要重写,建议采用显式导入方式替代,以提高代码可读性和可维护性。
移除异步关键字
async
和 await
关键字已被移除,当前异步编程模型也随之取消,为未来新的异步方案做准备。这预示着 Zig 协程 的重生。
增强对非穷尽枚举的 switch
支持
新增对非穷尽枚举使用 switch
语句的支持,提高了枚举处理的灵活性,能够更好地处理未知枚举值,增强代码的健壮性。
扩展布尔向量运算符支持
布尔向量现在支持更多运算符,包括逻辑运算和比较运算。
内联汇编:类型化的破坏描述符
内联汇编现在支持类型化的 clobber
列表,提供了更好的类型安全保证。
指针转换能力增强
@ptrCast
现在允许从单项指针转换为切片,提供了更大的灵活性。
调整 undefined
运算规则
对 undefined
值的算术运算规则有所调整,任何与 undefined
的运算结果都将返回 undefined
。
加强有损转换检测
对于可能导致精度损失的整数到浮点数转换,编译器会视为错误。
标准库重大变更
Writergate:I/O 接口完全重构
这是本次更新中最重大的破坏性更改,被社区称为 "Writergate":
std.io.Reader
和std.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 libc
和 zig cc
命令的功能得到了增强:
- 更好的 GCC 兼容性
- 支持更多编译选项
- 更清晰的错误报告
版本跳跃说明
Zig 官方团队选择直接从 0.14.0
跳跃到 0.15.1
,这一决策反映了:
- 本次更新包含的重大变更数量之多
- 对编译器性能的重要改进
- 标准库接口的重大重构
- 为未来版本奠定更坚实的基础
升级挑战与机遇
主要挑战
- Writergate:I/O 接口的完全重构需要重写大量相关代码
- 移除
usingnamespace
:需要调整导入方式 - 异步代码调整:需要移除 async/await 使用
- ArrayList 变更:需要调整容器使用方式
主要机遇
- 编译速度提升:5 倍的调试编译速度改进
- 更清晰的代码:移除隐式行为,提高代码可读性
- 更好的性能:新的 I/O 接口设计更高效
- 开发效率:文件系统监视功能和模糊测试器
社区影响
这次更新对 Zig 社区产生了重要影响:
- 学习曲线:新用户需要适应新的接口设计
- 迁移工作:现有项目需要进行大量调整
- 性能收益:编译速度的显著提升改善开发体验
- 生态系统:库作者需要更新以适配新接口
技术债务清理
本次更新体现了 Zig 团队对技术债务的积极清理:
- 移除了有争议的
usingnamespace
特性 - 重构了性能不佳的 I/O 接口
- 统一了容器类型的设计理念
- 为未来的语言演进奠定坚实基础
未来展望
0.15.1
为 Zig 的未来发展奠定了重要基础:
- 编译性能:为大型项目开发提供更好支持
- 接口设计:更一致、更高效的标准库
- 开发体验:更快的编译和更好的工具支持
- 语言稳定性:移除不稳定特性,为 1.0 做准备
路线图
I/O 作为接口
I/O 系统将继续作为接口进行发展和完善,为未来的异步编程模型做准备。
建议
对于 Zig 开发者:
- 谨慎升级:在测试环境中充分验证
- 分步迁移:逐步调整代码以适配新接口
- 充分利用性能优势:积极采用有关编译速度的改进
- 关注社区动态:参与社区讨论,分享迁移经验和最佳实践
0.15.1
是 Zig 发展历程中的一个重要里程碑,虽然带来了较多的破坏性变更,但为语言的长期发展和性能提升奠定了坚实的基础。这标志着语言稳定化的最后阶段,为 1.0 版本的正式发布做好了充分准备。