202307 | 异步缺席 0.11
重大事件
Andrewk 在最新的文章 The Upcoming Release Postponed Two More Weeks and Lacks Async Functions 中指出,即将发布的 0.11 中将不会包含对异步的支持,现在异步是在 stage2-async 这个分支上来开发,但是在开发过程中,总是有其他事情出现,然后 Andrewk 就先去搞这些事情了。因此,把对异步的支持放到 0.12 上了。
另一件事是 Jacob Young Joins the Core Zig Team,Core Team 迎来了另一位全职开发者,常用 ID jacobly0,下面是他最近的提交记录:
恭喜 Core Team,又添一虎将!
观点/教程
- Copy Hunting | TigerBeetle
- 比较有意思的文章,通过分析 LLVM 的 IR,来避免程序中不必要的 memcpy 以及如何减少 binary 体积
- Taking off with Zig: Putting the Z in Benchmark
- Zig 入门文章,作者使用 Zig 来实现了一个 benchmark 库,里面有作者的感受,语言小巧,主要的语言特点:独特的错误处理、显式的内存控制、comptime 执行
- The New Wave of Programming Languages: Pony, Zig, Crystal, Vlang, and Julia
- 多种语言的对比,Zig 部分的对比:
Pros | Cons |
---|---|
Excellent low-level control over code | Relatively new and evolving |
Emphasis on safety and reliability | Limited library support |
Good interoperability with other languages | Steep learning curve |
- Parsing timestamps and generating RFC3339 dates in Zig
Zig 标准库里有返回 unixtime 时间戳的函数,但是没有格式化函数,作者这里给出了一种实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
pub const DateTime = struct { year: u16, month: u8, day: u8, hour: u8, minute: u8, second: u8, }; pub fn fromTimestamp(ts: u64) DateTime { const SECONDS_PER_DAY = 86400; const DAYS_PER_YEAR = 365; const DAYS_IN_4YEARS = 1461; const DAYS_IN_100YEARS = 36524; const DAYS_IN_400YEARS = 146097; const DAYS_BEFORE_EPOCH = 719468; const seconds_since_midnight: u64 = @rem(ts, SECONDS_PER_DAY); var day_n: u64 = DAYS_BEFORE_EPOCH + ts / SECONDS_PER_DAY; var temp: u64 = 0; temp = 4 * (day_n + DAYS_IN_100YEARS + 1) / DAYS_IN_400YEARS - 1; var year: u16 = @intCast(100 * temp); day_n -= DAYS_IN_100YEARS * temp + temp / 4; temp = 4 * (day_n + DAYS_PER_YEAR + 1) / DAYS_IN_4YEARS - 1; year += @intCast(temp); day_n -= DAYS_PER_YEAR * temp + temp / 4; var month: u8 = @intCast((5 * day_n + 2) / 153); const day: u8 = @intCast(day_n - (@as(u64, @intCast(month)) * 153 + 2) / 5 + 1); month += 3; if (month > 12) { month -= 12; year += 1; } return DateTime{ .year = year, .month = month, .day = day, .hour = @intCast(seconds_since_midnight / 3600), .minute = @intCast(seconds_since_midnight % 3600 / 60), .second = @intCast(seconds_since_midnight % 60) }; }
- Custom JSON serialization in Zig
Zig 里面虽然有很好的 JSON 序列化支持,但是有些时候我们需要自定义某个字段的解析,与 Go
json.Marshaller
类似,Zig 会在序列化时查找类型的jsonStringify
函数,通过实现这个函数就可以达到目的,文中给出了个示例:1 2 3 4 5 6 7 8
const NumericBoolean = struct { value: bool, pub fn jsonStringify(self: NumericBoolean, out: anytype) !void { const json = if (self.value) "1" else "0"; return out.print("{s}", .{json}); } };
- Three Different Cuts
- matklad 的文章,介绍了 Rust、Go、Zig 三种语言的 Cut 实现
- Zig Bits 0x4: Building an HTTP client/server from scratch
- 介绍了 std.http 这个模块的使用
- We Put a Distributed Database In the Browser – And Made a Game of It
- TigerBeetle 的新花样,把数据库搬到了 Web 上。HN 讨论
- Zig: great design for great optimizations
- 比较有意思的文章,作者比较了 Clang、Zig 对相同逻辑代码生产的 LLVM IR,Zig 生成的 IR 更加精简
项目/工具
- Zig helped us move data to the Edge. Here are our impressions
- Turso 公司的官博,它们公司的产品时边缘数据库,自动同步 PG 的表到 Edge 端,减少访问的时延。在这篇文章里他们介绍了使用 Zig 编写 PostgreSQL 插件的经历,得益于
translate-c
,他们可以直接从已有的 C 代码开始构建他们的产品。插件地址:pg_turso - tensorush/meduza
- 🦎 🧜♀️ Zig codebase graph generator that emits a Mermaid class diagram
- AndreaOrru/zen
- Experimental operating system written in Zig
- EugenHotaj/zig_gpt2
- GPT-2 inference engine written in Zig