forum
forum copied to clipboard
Zig 语言中文社区论坛
> 地址:https://devtools.fm/episode/37 Bun 是最近流行的另一个 JavaScript 运行时,创始人 Jarred Sumner 在 2012 年 16 岁的他高中辍学(竟然还不到 30岁!),加入创业公司,后来用 JS 写了一个 10W 行代码的游戏,发现构建太慢,于是开始折腾 JS 工具链,于是有了 Bun...... 下面是他的 Linkedin 地址: - https://www.linkedin.com/in/jarred-sumner-a8772425/details/experience/
> 原文地址:[Have a variable in a struct only in debug builds?](https://ziggit.dev/t/have-a-variable-in-a-struct-only-in-debug-builds/4185) 这个帖子主要讨论如何在 Zig 中实现 C 中 `#ifdef` 的效果,比如下面 C++ 代码: ```c class Foo { #ifndef NDEBUG bool initialized; #endif void...
> 原文地址:[I'm sold on Zig's simplicity : r/Zig](https://www.reddit.com/r/Zig/comments/1ckstjv/im_sold_on_zigs_simplicity/) 一个具有资深经验开发者(开发过多个大型项目),在这里描述了自己选择业余项目语言的经历: - Rust 越来越复杂,有种发展成 C++ 的趋势 - C++ 新版本的特性(比如 module)LSP 支持的不够好,而且历史包袱严重 - C 缺少元编程,并且没有命名空间 最后从 Andrew 的一个播客了解到 Zig,经过自己尝试,发现了 Zig 没有辜负他的期望,尽管是第一次写 Zig,但基本上没有什么难度,每次遇到问题,仔细想几分钟就差不多有答案了。下面是他罗列的 Zig...
社区内一个有意思的讨论 [Software dependencies in Zig Projects](https://ziggit.dev/t/software-dependencies-in-zig-projects/4186),主题就是一个 Zig 项目,依赖多了好还是少了好。 一些观点: - Zig 自带 C/C++ 编译器。因此,如果你的依赖项完全由 Zig 管理(即获取和构建),那么它们是否也用 Zig 编写就没什么区别了。不过,我认为这只适用于不值得用 Zig 重写的大型依赖项。比如 Lua 语言虚拟机。或者是 tree-sitter 或 ffmpeg。我认为一般来说 Zig 项目应该尽可能地完全独立于主机操作系统构建,不管它们是否有 C/C++ 依赖关系。这并不总是可能的(例如,Linux 上的...
这可能是 0.12 版本中,构建系统带来的另一大改进,即支持 zon 引入非 zig build 的项目。这是对于 Zig 中包裹 C 项目来说非常有用。 一般说来,构建系统主要有两个功能: 1. 下载依赖,确保没有被篡改 2. 按照不同的依赖顺序,依次对包进行编译,直到产生最终的构建产物(binary/library) 之前 Zig 的构建系统重点在第二部分,现在对第一部分也进行了增强。下面是引入的 PR: - [Add ability to construct a LazyPath out of...
> https://ziglang.org/download/0.12.0/release-notes.html 今天来介绍 release note 里一个重要的小节。即如何判断命名空间类型是否相等? 在 Zig 中,结构、枚举、联合和不透明类型都很特殊。它们不像元组和数组,可以直接用每一项的 bit 进行比较,它们会创建不同的类型。这些类型具有命名空间,因此可以包含声明。因此,它们可以统称为 "[命名空间类型](https://ziglang.org/download/0.12.0/release-notes.html#Namespace-Type-Equivalence)"。 在 0.11.0 版本中,是通过来判断记忆化(memoization)来判断两次调用 `std.ArrayList(u8)` 是否相等,也就是说,在编译器内部,只会执行一遍 `std.ArrayList(u8)` ,保存下来这个 type 后,后续的函数调用直接用缓存的值就好了,这样就可以保证两个函数生成的类型一致。 这样其实有些 trick,毕竟记忆化主要是用来加速程序执行的,而这里赋予了一个新的语义。0.12.0 版本就对这点做了改进: > 通过函数的位置与捕获的变量来判断两个命名空间类型是否相等 举个例子, ```zig pub fn...
[KVcache](https://github.com/cleanbaja/kvcache) 是社区的一个新项目,用 Zig 来重新实现一个 Redis 协议兼容的 KV 数据库,目前看这个项目还刚开始起步,但基本架子已经搭好了,感兴趣的朋友可以参与进去一起共建。 这是已经支持的命令 ```zig switch (packet) { .simple_string => { if (std.mem.startsWith(u8, packet.simple_string, "PING")) { try stream.writeAll("+PONG\r\n"); } }, .array => { const command...
众所周知,Zig 的一大特色就是支持任意精度的整数,比如 u1,u2,u3 等,这种整数的一个典型场景就是在进行协议解析时用,比如在 protobuf 的[编码方式](https://protobuf.dev/programming-guides/encoding/#structure)中,一个 message 的字段,会对应一个 Tag,低三位表示字段类型,高位表示 field number,在 Zig 中就可以用下面结构表示: ```zig const Tag = packed struct { field_type: u3, field_number: u5 } ``` packed 的结构体会保证内存紧凑,虽然 `@sizeOf(u3)` 会返回...
如果你是一个开发者,或多或少会需要写配置文件,比如 JSON、Toml、Yaml 等等,手写这些配置不仅仅繁琐,还容易出错,因此一般会有对应的辅助工具,比如苹果前不久开源的 [pkl](https://github.com/apple/pkl) 就是个很好的例子。 > 剩下内容,请移步微信公众号,付费后阅读。https://mp.weixin.qq.com/s/trLJpUoIvEZp4foUtcGf-g
在 Zig 中,每种类型都有一个对齐方式,当从内存加载或向内存存储该类型的值时,内存地址必须能被这个数平均整除。可以使用 `@alignOf` 查找任何类型的对齐方式。比如 `@alignOf(u32)` 会返回 4。 对齐取决于 CPU 架构,但始终是 2 的幂次,且小于 `1