forum icon indicating copy to clipboard operation
forum copied to clipboard

【Zig 日报】2024-04-20 另一个 Zig 稳定版 0.12.0 发布了!

Open jiacai2050 opened this issue 1 year ago • 0 comments

https://ziglang.org/download/0.12.0/release-notes.html

今天来介绍 release note 里一个重要的小节。即如何判断命名空间类型是否相等?

在 Zig 中,结构、枚举、联合和不透明类型都很特殊。它们不像元组和数组,可以直接用每一项的 bit 进行比较,它们会创建不同的类型。这些类型具有命名空间,因此可以包含声明。因此,它们可以统称为 "命名空间类型"。

在 0.11.0 版本中,是通过来判断记忆化(memoization)来判断两次调用 std.ArrayList(u8) 是否相等,也就是说,在编译器内部,只会执行一遍 std.ArrayList(u8) ,保存下来这个 type 后,后续的函数调用直接用缓存的值就好了,这样就可以保证两个函数生成的类型一致。

这样其实有些 trick,毕竟记忆化主要是用来加速程序执行的,而这里赋予了一个新的语义。0.12.0 版本就对这点做了改进:

通过函数的位置与捕获的变量来判断两个命名空间类型是否相等

举个例子,

pub fn ArrayList(comptime T: type) type {
    return ArrayListAligned(T, null);
}

对于 ArrayList 这个函数来说,它会捕获 T 这个值,而且由于所有调用 ArrayList 的地方用的都是同一个函数,函数位置自然就是相同的,剩下的就是 T 的值,如果 T 相等,那么两个类型就一致。

记忆化这个提速的技巧编译器内部还会使用,只是没有了上面的特殊语义而已。

jiacai2050 avatar Apr 20 '24 14:04 jiacai2050