该页面总结了2026年Zig编程语言主分支的最新变更,重点介绍了为ArrayList添加指针稳定性锁功能,通过lockPointers()和unlockPointers()方法确保内存安全,并提供了使用示例。
正文
好的,作为一名专业的中文编辑,我将对您提供的英文内容进行中文重述,保留核心细节,并删减与文章主题无关的内容。
Zig 编程语言 2026 年开发日志摘要
本文汇总了 2026 年 Zig 语言主分支的主要更新。
2026年8月27日:为 ArrayList 添加指针稳定性锁
std 库的 ArrayList 现在支持指针稳定性锁。在存储指向 ArrayList 内部元素的指针后,调用 lockPointers() 可以防止因列表扩容导致的内存地址变动,从而避免悬挂指针。当指针不再需要时,调用 unlockPointers() 解锁。需要注意的是,orderedRemove() 和 pop() 等操作即使不分配内存,也会在锁定状态下触发断言,因为它们会移动元素。
2026年6月30日:包管理功能从编译器移至构建系统
zig build、zig fetch、zig init 和 zig libc 等子命令已移至构建系统进程(maker)。这意味着包获取逻辑、HTTP 客户端、TLS、Git 协议、压缩库等大量代码现在以源码形式分发,无需重新编译编译器即可修改。此举还使网络操作能启用安全检查和利用主机 CPU 特性。进程结构从 zig build -> builder 变为 zig build -> maker -> configurer,使得 zig build --watch 在配置变更时无需退出进程。主要影响包括:Zig 可执行文件体积缩小 4%,--maker-opt 和 --zig-lib-dir 标志被环境变量替代。
2026年6月26日:SPIR-V 后端进展
SPIR-V 后端经过修复,取得了多项进展:
- @SpirvType 内置函数:用于创建 Zig 类型系统无法直接表达的 SPIR-V 类型(如采样器、图像)。
- 执行模式移至调用约定:工作组大小、片段原点等信息现在通过调用约定指定,不再使用内联汇编。
- 能力和扩展由 CPU 特性驱动:不再通过代码生成或内联汇编临时处理。
- 多线程代码生成:SPIR-V 后端现在像其他后端一样,将代码生成任务调度到线程池。
- 目标文件链接:.spv 文件现被识别为目标文件,可进行多文件链接。
- std.gpu 重命名为 std.spirv。总体行为测试通过率提升至 49%。
2026年6月25日:新的 @bitCast 语义与 LLVM 后端改进
- LLVM 后端整数优化:非标准位宽整数(如
u4)在内存中存储时,会零扩展或符号扩展到 ABI 标准大小(如i8),以利用 LLVM 更成熟的优化路径,修复了此前因使用 LLVM 位整数类型导致的优化缺失和误编译问题。 @bitCast语义重定义:@bitCast现在基于类型的“逻辑位布局”进行 reinterpret,而非内存字节。新语义与目标端序无关,例如,[2]u8转换为u16时,第一个数组元素始终成为最低有效位。此变更也允许了更灵活的操作,如将[2]u3转换为@Vector(3, u2)。同时,禁止了@bitCast与指针向量的互转,并允许对枚举使用@bitCast。
2026年5月30日:ELF 链接器改进
新的 ELF 链接器(通过 -fnew-linker 启用)取得了重大进展,现已能构建包含 LLVM 和 LLD 库的自托管 Zig 编译器。其核心优势在于支持快速增量编译,在 x86_64 Linux 上,即使链接外部库和 C 源码,也能实现毫秒级的增量重建。当前主要缺失功能是尚不支持为 Zig 代码生成 DWARF 调试信息。
2026年5月26日:构建系统重构
构建系统被拆分为“配置器”(configurer,运行用户 build.zig 逻辑)和“制造器”(maker,执行构建图)两个独立进程。主要改进:
- 速度提升:仅用户逻辑需要随变更重新编译;构建系统可跳过重复运行 build.zig;制造器进程以优化模式编译。zig build --help 的执行时间从 150ms 降至 14.3ms。
- API 变更:b.args 被移除,改为 run_cmd.addPassthruArgs(),使得更改参数时无需重新编译构建脚本。
2026年4月8日:LLVM 后端的增量编译
LLVM 后端现已支持增量编译。虽然无法加速 LLVM 自身的代码生成,但能显著减少 Zig 编译器分析代码的时间,尤其在代码存在编译错误时,能快速报告错误。
2026年3月10日:类型解析重新设计
编译器内部类型解析逻辑被重写,主要变化包括: - 惰性分析:如果类型从未被初始化,编译器不再分析其字段,避免了不必要的代码引入。 - 更好的依赖循环错误:当出现类型依赖循环时,会提供详细的错误信息,明确指出循环路径。 - 增量编译改进:修复了大量已知错误,特别是消除了“过度分析”问题,使增量编译更快。
2026年2月13日:std.Io.Evented 的 io_uring 和 GCD 实现
std.Io.Evented 接口新增了基于 Linux io_uring 和 Apple Grand Central Dispatch 的实现。它们基于用户态栈切换(纤程/绿色线程),允许开发者通过切换 I/O 实现(如从 std.Io.Threaded 切换到 std.Io.Evented)而无需修改应用逻辑。目前仍处于实验阶段。
2026年2月6日:两项包管理工作流增强
- 本地包存储:获取的包现在存储在项目根目录的
zig-pkg文件夹中,便于编辑和分发自包含的源码包。全局缓存则存储压缩后的规范格式。 --fork标志:zig build --fork=[路径]允许临时用本地源码目录覆盖整个依赖树中的匹配包,方便在依赖项目上迭代和测试补丁。
2026年2月3日:绕过 Kernel32.dll
Zig 标准库开始优先使用 Windows 原生 API(ntdll.dll)而非高层封装(kernel32.dll),以减少不必要的堆分配、故障模式和性能开销。例如,获取随机数时直接与 CNG 设备通信,文件 I/O 时使用 APC 例程而非事件对象,以实现更好的集成和取消支持。
2026年1月31日:zig libc 项目
Zig 正逐步用 Zig 标准库包装函数替代从 musl、mingw-w64 等项目中复制的 C 源码文件,已删除约 250 个 C 源文件。这些 libc 函数现在与用户代码共享 Zig 编译单元,可实现跨 libc 边界的优化(类似 LTO),并有望让用户控制 libc 的 I/O 行为。
评论
根据评论内容,总结如下:
主要观点与论据:
功能必要性争议(评分:None)
- 支持方认为这是对C++
std::vector迭代器失效问题的有效改进(评论8、9) - 反对方质疑:若需稳定指针,ArrayList本身可能是错误的数据结构,建议改用索引或Unrolled Linked List(评论1)
- 支持方认为这是对C++
实现机制评价(评分:None)
- 批评方指出:该API依赖程序员手动锁定指针,缺乏编译器自动保障,且示例中锁定范围超出必要函数(评论2)
- 支持方认为:这与Zig语言一贯的显式风格一致,类似断言机制,可帮助捕获编程错误(评论7)
性能与安全性权衡(评分:None)
- 指出该检查仅在Debug/ReleaseSafe模式下生效,ReleaseFast模式会跳过,削弱了保障(评论4)
- 有观点认为:将段错误转为带堆栈的panic虽改善开发体验,但不如GC或静态分析从根本上解决内存安全问题(评论5)
替代方案讨论(评分:None)
- 建议使用索引+容器引用的方式实现迭代器,避免指针失效问题(评论6)
- 提及Zig已移除的SegmentedList数据结构(评论1)
关键引用保留:
- "Constant headache in C++ with std::vector element references. Zig's explicit stability here is a welcome relief"(评论8)
- "This API requires the programmer to remember to lock the pointers... Even the type system can't help"(评论2)
- "Changing a segfault to a panic... does not make better software"(评论5)