文章摘要
Zig语言将包管理功能从编译器迁移到构建系统,包括zig build、zig fetch等子命令。相关代码以源码形式分发,便于用户修改,且网络操作启用安全检查。
文章总结
好的,这是对Zig编程语言2026年开发日志主要内容的精炼中文重述:
2026年Zig语言开发日志摘要
本文汇总了Zig语言在2026年的主要开发进展,涵盖了编译器、构建系统、标准库和链接器等多个方面的重大改进。
6月30日:包管理功能从编译器移至构建系统
作者Andrew Kelley将zig build、zig fetch等子命令移到了构建系统的“maker”进程中。这使得包获取、HTTP客户端、TLS加密等大量代码以源码形式分发,无需重新编译编译器即可修改,并允许在ReleaseSafe模式下进行网络操作,同时利用宿主机的特殊CPU指令。此举优化了进程结构,为即将到来的构建服务器协议铺平了道路,使配置变更时无需断开客户端连接。主要影响包括:Zig可执行文件体积缩小4%,以及部分命令行标志被环境变量取代。
6月26日:SPIR-V后端取得进展
作者Ali Cheraghi报告了SPIR-V后端的多项改进:
* 引入@SpirvType内建函数,用于表达Zig类型系统中无法直接表示的SPIR-V特有类型(如采样器、图像)。
* 执行模式信息(如工作组大小)现在通过调用约定传递,不再依赖内联汇编。
* 能力和扩展声明现在由CPU特性集驱动,并拒绝手动指令。
* 代码生成支持多线程,并恢复了类型去重和死代码消除等优化。
* .spv文件被识别为目标文件,支持多文件链接。std.gpu已重命名为std.spirv。
6月25日:新的@bitCast语义与LLVM后端改进
作者Matthew Lugg对@bitCast内建函数进行了重新定义。新语义不再基于内存字节的重新解释,而是基于类型的“逻辑位布局”(与字节序无关)。例如,将[2]u8转换为u16时,第一个数组元素始终成为最低有效位,在所有目标上行为一致。此变更修复了LLVM后端因整数类型存储方式改变而引发的问题,并允许了更灵活的操作,如将整数转换为位向量。同时,LLVM后端对非ABI整数类型的优化得到了恢复,使Zig编译器自身性能提升了约5%。
5月30日:ELF链接器改进 作者Matthew Lugg改进了Zig 0.16.0中引入的新ELF链接器。该链接器现已能成功构建包含LLVM和LLD库的自托管Zig编译器。其核心优势在于支持快速增量编译,在x86_64 Linux上,即使链接外部库和C源码,也能实现毫秒级的增量重建。当前主要缺失功能是尚不支持为Zig代码生成DWARF调试信息。
5月26日:构建系统重构
作者Andrew Kelley将构建系统拆分为“configurer”(配置器)和“maker”(执行器)两个独立进程。build.zig逻辑在调试模式下编译为轻量级的configurer,其构建的图被序列化为二进制配置文件。Maker进程则在发布模式下编译,负责执行该配置。此举显著提升了zig build的速度:zig build --help的执行时间从150ms降至14ms,指令数减少95.6%。同时,构建脚本无法再直接观察命令行参数,但换来的是修改参数时无需重新编译构建脚本。
4月8日:LLVM后端支持增量编译
作者Matthew Lugg为LLVM代码生成后端实现了增量编译支持。这能显著缩短编译错误反馈时间(跳过LLVM耗时阶段),并在成功构建时也有轻微加速。用户可通过向zig build传递-fincremental --watch参数来体验。
3月10日:类型解析重新设计 作者Matthew Lugg合并了一个大型PR,重新设计了编译器的类型解析逻辑。主要改进包括: * 编译器对类型字段的分析更加“懒惰”,未初始化的类型不会触发其字段的编译,避免了不必要的代码拉取。 * 依赖循环错误信息得到极大改善,现在会明确指出循环路径。 * 增量编译功能得到显著增强,修复了大量已知错误,特别是减少了“过度分析”问题,使增量编译更快。
2月13日:iouring和Grand Central Dispatch的I/O实现落地
作者Andrew Kelley宣布,基于用户态栈切换(纤程)的std.Io.Evented实现已可用于实验。它支持Linux的iouring和macOS的Grand Central Dispatch。开发者可以轻松地在std.Io.Threaded和std.Io.Evented之间切换I/O实现,而应用逻辑代码无需改动。目前该功能仍处于实验阶段,存在错误处理、性能退化等问题待解决。
2月6日:两项包管理工作流增强
作者Andrew Kelley介绍了两个新特性:
1. 本地包存储:获取的包现在存储在项目根目录的zig-pkg文件夹中,便于直接编辑和探索依赖树。同时,全局缓存中会保留一份基于paths过滤后重新压缩的副本,便于分发和未来支持P2P种子共享。
2. --fork标志:zig build --fork=[路径]允许用户临时用一个本地源码目录覆盖整个依赖树中所有匹配的包。这对于在生态断裂时进行调试和修复非常有用,且该覆盖是临时的,移除标志即可恢复。
2月3日:绕过Kernel32.dll 作者Andrew Kelley阐述了Zig标准库倾向于直接使用Windows原生API(ntdll.dll)而非高层封装(kernel32.dll)的策略。通过两个例子(获取随机数和文件读写)说明,直接调用ntdll可以避免不必要的堆分配、额外的失败模式、CPU开销和代码膨胀,并能实现更优雅的异步操作和任务取消。
1月31日:zig libc进展
作者Andrew Kelley报告了“zig libc”子项目的进展。该项目旨在用Zig标准库包装函数替代供应商提供的C源码文件,已删除了约250个C源文件。这减少了Zig对第三方项目和C语言的依赖,提升了编译速度,并减小了静态链接libc的应用程序体积。一个关键改进是,导出的libc函数现在与Zig代码共享编译单元,实现了跨libc边界的优化(类似LTO)。未来,结合新的I/O系统,甚至可能让第三方C代码的read/write调用无缝参与io_uring事件循环。
评论总结
根据评论内容,主要观点和论据如下:
正面观点(认可度较高): - 开发体验积极:评论1称“Development of Zig feels so wholesome”(Zig的开发感觉非常健康)。 - 长期目标创新:评论2提到“move the build system into a WebAssembly VM”(将构建系统迁移到WebAssembly虚拟机),认为“this is incredible”(这令人难以置信)。 - 关注分离合理:评论4认为“A very well-reasoned separation of concerns”(非常合理的关注点分离)。
负面/谨慎观点: - 包管理系统担忧:评论3指出“Everytime I see a language creating their own package system, all I can think of it how much we've missed here”(每次看到语言创建自己的包系统,我想到的是我们错过了多少),并警告“These choices may create later super-convoluted processes”(这些选择可能造成后来超级复杂的过程),尤其当需要混合多种语言时。
平衡总结:评论对Zig的构建系统创新和开发体验持积极态度,但对其包管理系统可能带来的长期复杂性表示担忧。