2024-07-01
在这篇文章里,作者引用 Stackoverflow 2024 年的调查报告,指出 Zig 语言是最热门的编程语言之一,并且 Zig 开发者的薪水都很高,平均年收入为75,332美元!
Zig 的魅力在于它的简洁性、现代设计以及在底层控制和运行时安全性之间取得的平衡。
Zig 开发者的一些观点:
Loris Cro 的最新文章,介绍了一个改进 Zig 编码体验的小技巧,十分推荐大家使用。具体来说是这样的: 通过配置 zls,达到保存文件时,自动进行源码检查,而且速度非常快!
{
"enable_build_on_save": true,
"build_on_save_step": "check"
}
将上述内存保存到 zls 的配置文件中,(路径可以通过 zls --show-config-path
查看 ),zls 就会在保存时,自动执行 zig build check
,这个 check
一般来说是这样的:
const exe_check = b.addExecutable(.{
.name = "foo",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const check = b.step("check", "Check if foo compiles");
check.dependOn(&exe_check.step);
由于 Zig 目前的一个 bug(#18877),这个 exe_check
不能作为 install、run 的依赖,否则在编译时,就不会增加 -fno-emit-bin
选项。 而这个选项的作用就是让 Zig 来分析我们的代码,但是不会调用 LLVM 来生成最终的二进制文件,因此速度会比较快。
这个配置有个缺点,就是它是个全局配置,在 zigtools/zls#1687 有讨论如何改成项目级别的,本质上就是定制 zls 的启动参数。
zls --config-path zls.json
这样不同的项目就可以用不同的检查步骤了。
作者对这次会议的一个回顾总结,议题主要有如下几个方向:
该作者分享了利用 typeInfo 来在编译时获取字段名的能力,要知道,在 C 里面是没有这个功能的。
pub export fn WindowProc(hwnd: win32.HWND, uMsg: c_uint, wParam: win32.WPARAM, lParam: win32.LPARAM) callconv(windows.WINAPI) win32.LRESULT {
// Handle each type of window message we care about
_ = switch (uMsg) {
win32.WM_CLOSE => win32.DestroyWindow(hwnd),
win32.WM_DESTROY => win32.PostQuitMessage(0),
else => {
stdout.print("Unknown window message: 0x{x:0>4}\n", .{uMsg}) catch undefined;
},
};
return win32.DefWindowProcA(hwnd, uMsg, wParam, lParam);
}
上面这个函数是 Window 编写窗口应用时用到的回调函数,Window 操作系统会把用户触发的事件通过 uMsg
传递过来,为了能够从一个数字,找对对应的名字,在 Zig 里面可以用如下函数实现:
// The WM_* macros have values less than 65536, so an array of that size can
// represent all of them
fn get_window_messages() [65536][:0]const u8 {
var result: [65536][:0]const u8 = undefined;
@setEvalBranchQuota(1000000);
// Loop over all struct fields and match against the expected prefix
for (@typeInfo(win32).Struct.decls) |field| {
if (field.name.len >= 3 and std.mem.eql(u8, field.name[0..3], "WM_")) {
const value = @field(win32, field.name);
result[value] = field.name;
}
}
// We return by value here, not by reference, so this is safe to do
return result;
}
以下该作者的一些心得体会:
min..(max + 1)
,而不是 min..max
。std.SinglyLinkedList
替代=
array [start..][0..length]
18alantom/fex
A command-line file explorer prioritizing quick navigation.
griush/zm
SIMD Math library fully cross-platform