返回

文章详情

Zig: 所有包管理功能已从编译器移至构建系统

Hacker News2026年7月4日 16:30

本页面包含对主分支 Zig 最近更改的精编列表。该页面包含2026年的条目。其他年份可在开发日志存档页面中找到。 2026年6月30日 所有包管理功能已从编译器移至构建系统 作者:Andrew Kelley 现在,用户的 build.zig 脚本和构建系统本身有了一个单独的过程,因此将包管理逻辑放在这里是合理的。我将以下子命令移至制造过程: zig build zig fetch zig init zig libc 这意味着以往包含在编译器可执行文件中的大部分内容现在以源形式交付,包括: 包获取逻辑 HTTP 客户端和网络 TLS(传输层安全性)及相关加密 Git 协议 xz、gzip、zstd、flate、zip 解析、验证和处理 build.zig.zon 文件 因此,此功能现在可以在不重建编译器的情况下进行补丁,这使得用户和贡献者进行修改变得更容易。此外,这意味着在进行网络操作时,Zig 的包管理功能现在启用了安全检查,因为生成的可执行文件是以 ReleaseSafe 模式编译的。此外,所有用于网络和文件哈希的加密现在可以利用主机上可用的特殊 CPU 指令,即使那些在分发软件时通常太罕见而无法依赖的指令。我们可以拥有 AOT 的蛋糕,同时也享用 JIT! 我这样做的最初动机是与公开构建服务器协议有关,以便在制造/configurer 过程分离后解除 ZLS 的阻塞,该分离对 --build-runner 覆盖标志做了重大更改。最初,进程树看起来是这样的: zig build(zig 编译器 + 包管理器) └─ builder(用户的 build.zig 逻辑 + 构建系统实现) 进程分离变更集使它看起来是这样的: zig build(zig 编译器 + 包管理器) ├─ configurer(用户的 build.zig 逻辑) └─ maker(构建系统) 在这一点上,考虑一个长时间运行的 zig build --watch 过程,监视文件并在源代码更改时重建。如果检测到 build.zig 的任何更改,或者执行该逻辑时观察到的任何文件,这意味着需要重新运行配置,这意味着制造进程必须退出,以便给 zig build 一个机会来重复包管理逻辑。现在,在这个开发日志条目中描述的更改之后,它看起来是这样的: zig build(zig 编译器) └─ maker(构建系统 + 包管理器) └─ configurer(用户的 build.zig 逻辑) 因此,当需要重新运行配置时,由于制造进程是父进程而不是兄弟进程,因此制造进程可以继续存在。就即将到来的构建服务器而言,这意味着避免一个尴尬的情况,即服务器必须退出,而客户端必须重新连接,而不是简单地通知客户端配置更改。这几乎完全是一个非破坏性更改,但确实存在一些可观察的差异: Zig 可执行文件大小:从 14.1 MiB 缩小到 13.5 MiB(无 LLVM,ReleaseSmall) --maker-opt 标志被 ZIG_DEBUG_MAKER 环境变量所替代 --zig-lib-dir 标志被 ZIG_LIB_DIR 环境变量所替代 该更改集的后续问题是我们标记 Zig 0.17.0 的主要障碍: 构建服务器协议 MVP(需要解除 ZLS 的阻塞) 引入添加构建脚本自身路径依赖的概念 make zig build --watch 检测对构建脚本的修改并自行重新运行 不同的 cwd 导致构建脚本缓存未命中 我在七月有两个会议,我需要准备我的演讲,因此,现实来看,我不认为我能在八月初之前完成这些工作。当然,欢迎任何贡献。特别感谢来自 ZLS 团队的 Techatrix 与我联系并协助我处理构建服务器协议!顺便说一下,他们正在寻求赞助。 2026年6月26日 SPIR-V 后端进展 作者:Ali Cheraghi 有很多内容需要涵盖。SPIR-V 后端在最近的编译器更改后在多个地方变得老化,因此我花了过去几周将其拖入了更好的状态。@SpirvType SPIR-V 有一 handful 的类型不能在 Zig 的类型系统中表示。新的 @SpirvType 内置已被引入以解决编写着色器的长期障碍。请参阅 #20550,#23326 和 #35461 以追溯背景。 const Sampler = @SpirvType ( . sampler ) ; const Image = @SpirvType ( . { . image = . { . usage = . { . sampled = u32 } , . format = . unknown , . dim = . @ "2d" , . depth = . unknown , . arrayed = false , . multisampled = false , . access = . unknown , } } ) ; const SampledImage = @SpirvType ( . { . sampled_image = Image } ) ; const RuntimeArray = @SpirvType ( . { . runtime_array = u32 } ) ; const sampled_image = @extern ( * addrspace ( . constant ) const SampledImage , . { . name = "sampled_image" , . decoration = . { . descriptor = . { . set = 0 , . binding = 1 } } , } ) ; Execution Mode on the Calli

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡