Zig 语言中文社区

202407 | Zig 成为最热门的编程语言

2024-07-01

ZigCC

TOC

重大事件

这篇文章里,作者引用 Stackoverflow 2024 年的调查报告,指出 Zig 语言是最热门的编程语言之一,并且 Zig 开发者的薪水都很高,平均年收入为75,332美元!

Zig 受欢迎程度

Zig 薪水对比
尽管使用 Zig 语言的开发者仅占调查人数的1%,但上升趋势明显。Zig 语言的倡导者、自由和开放源码软件开发者 Ali Cheragi 说:

Zig 的魅力在于它的简洁性、现代设计以及在底层控制和运行时安全性之间取得的平衡。

Zig 开发者的一些观点:

观点/教程

Improving Your Zig Language Server Experience

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

这样不同的项目就可以用不同的检查步骤了。

Systems Distributed ’24

作者对这次会议的一个回顾总结,议题主要有如下几个方向:

C Macro Reflection in Zig – Zig Has Better C Interop Than C Itself

该作者分享了利用 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;
}

A TypeScripter’s Take on Zig (Advent of Code 2023)

以下该作者的一些心得体会:

项目/工具

18alantom/fex
A command-line file explorer prioritizing quick navigation.

griush/zm
SIMD Math library fully cross-platform

Zig 语言更新

202406 | 0.13 来了
202410 | 向 Zig 软件基金会认捐 30 万美元