随着 11 月 1 日 Zig v0.10.0 版本的发布,其新的自托管编译器(self-hosted compiler)也将同步推出。“尽管自托管编译器现已实现,但仍有更多的工作要做。与此同时,更多令人兴奋的功能的大门已经打开,比如 Zig 的官方包管理器。”
Zig 项目的下一步计划包括:
性能改进
与旧的 C++ implementation(也称为 bootstrap compiler)相比,新的自托管编译器将内存使用量减少了 3 倍。
例如,构建编译器本身过去需要 9.6GB 的 RAM,而现在只需要2.8GB。现在可以在 32 位系统和资源有限的机器(如 CI 运行器)上构建 Zig。此改进解决了一些用户无法在其设备上构建 Zig 的问题。
而内存效率的提高在很大程度上也要归功于在自托管编译器设计中采用的面向数据的编程技术。
自定义后端
虽然成功的节省了内存,但自托管编译器并没有比旧的编译器快(作为一个 data point,自我构建的速度快 7%)。正如 Zig’s New Relationship with LLVM 中所述,编译时间由 LLVM 主导,因此提高编译速度的唯一方法是 Zig 拥有自己的自定义后端。
公告指出,为最常见的架构构建自定义后端的工作已经开始,感兴趣的可以关注 0.10.0 发行说明中的进度报告。但可以总结一下,即:arm64 的进度约为 40%,x86_64 的进度约为 60%。启用这些后端后,你的程序的调试构建将完全绕过 LLVM。
C 后端
开发团队还在开发一种特殊的后端,它可以生成 C 源代码。而得益于一个惊人的贡献,C 后端的进展最近突飞猛进(87% 并且还在增加) 。
“这个后端的有趣之处在于,它将在我们替换旧的 bootstrap compiler 实现的计划中发挥作用;也许更有趣的是,它将允许 Zig 以 LLVM 不支持的架构为目标, 包括那些迫使你使用特定 C 编译器的架构,如某些游戏机平台。”
编译器开发速度
作为语言的使用者,你不会直接体验到 bootstrap compiler 代码库与新代码库之间的差异,但这种变化也会影响到你,因为它将影响到花费在编译器上的总工作量。
目前 Zig 已经开始有更多的人对编译器做出贡献。“我自己就是一个例子:我已经开始致力于自动化文档系统的新实现”。现在对编译器的贡献已经变得更容易了。
新的 for 循环语法
一个例子是即将实现的新 for 循环语法,它也支持 ranges。不过值得注意的是,这不会包含在 0.10.0 版本中。
const nums = [3]usize {42, 42, 42};
const chars = [3]u8 {'a', 'b', 'c'};
// easy "zip" iteration (all arguments must have the same length)
for (nums, chars) |n, c| { ... }
// easy range loops
for (0..3) |idx| { ... }
// but this won't work anymore (old syntax)
for (chars) |c, idx| { ... }
// now you need a range if you want an index
for (chars, 0..) |elem, idx| { ... }
为 multi-argument for loops 提供 language-level 支持:
- 允许进行 hoist out-of-bounds checks,提高安全构建模式(Debug、ReleaseSafe)下的性能。
- 鼓励与 MultiArrayList 和其他面向数据的设计技术一起使用的内存访问模式。
- 提供简洁的语法来进行 ranges 循环。
阅读有关此语言提案的更多信息。
官方包管理器
一旦自托管编译器与 bootstrap 编译器达到功能对等,开发团队将开始处理官方包管理器的第一次迭代。“我们并不期望首先尝试确定每个设计方面,但我们确实知道我们想要朝着哪个大方向前进”。
第一次迭代的主要目标是启用依赖项的简单使用来开始构建包生态系统,并确保可以轻松打包 C/C++ 项目,而不仅仅是 Zig。Zig 构建系统已经可以构建 C/C++ 项目,“因此我们希望确保我们可以利用 40 多年的开源工作,而不仅仅是 Zig 重写。也就是说,支持 C/C++ 不仅有利于 Zig,因为我们相信 Zig 可以帮助简化仅打算将 Zig 用作编译器和构建系统的项目的获取和构建依赖项的过程。”
有关官方包管理器的特定功能,目前的看法为:
- 包管理器将成为编译器的一部分,而不是单独的可执行文件。Zig 是一种语言和编译器工具链。
- 包管理器不会假定存在中央包索引。不打算创建官方包索引。
- 版本解析将类似于 Go 的最小版本选择,但有一个额外的限制:stable packages 将只能依赖于其他 stable packages(例如,一个
v1.x
包不能依赖于一个v0.y
包)。
“我们对这些决定相当有信心,除了稳定性限制。好消息是,如果它被证明过于苛刻,我们总是可以在不破坏现有包的情况下放松这一限制。”
更多详情可查看官方博客。