Skip to content

【Zig 日报】Zig devlog:ELF 链接器改进 #338

@jiacai2050

Description

@jiacai2050

作者:Matthew Lugg

在过去的几周里,我一直在致力于改进我们在 Zig 0.16.0 中首次推出的全新 ELF 链接器。在 0.16.0 发布时,该链接器的实现尚处于非常早期的阶段,实际上仅支持链接纯 Zig 代码,甚至无法处理外部库(包括 libc)——这也是它当时(现在仍然)默认处于禁用状态的原因(可以通过 -fnew-linker 启用)。然而,自首次发布以来,我们已经取得了长足的进步!

这是一个不错的里程碑——根据我最新的 PR,全新的 ELF 链接器现在已经能够构建启用了 LLVM 和 LLD 库的 Zig 自托管编译器,这项任务在底层需要相当多的功能支持。

[mlugg@nebula master]$ # 使用新链接器构建 Zig 编译器:
[mlugg@nebula master]$ zig build -Dno-lib -Dnew-linker -Denable-llvm
[mlugg@nebula master]$ # 使用该编译器构建包含 LLVM 和 LLD 的程序:
[mlugg@nebula master]$ ./zig-out/bin/zig build-exe ~/hello.zig -fllvm -flld
[mlugg@nebula master]$ ./hello
Hello, World!
[mlugg@nebula master]$

当然,ELF 链接器本身可能并不是世界上最令人兴奋的东西,这就是为什么这个新链接器的核心亮点在于它对快速增量编译的支持。在最近的增强功能之后,现在(在 x86_64 Linux 上)可以在链接外部库、C 源码等时进行增量重构,且没有任何额外的性能开销!以下是我在 Andrew 的俄罗斯方块克隆版上尝试该功能的片段:

对 Andrew 的俄罗斯方块克隆版进行了一些简单的修改,每次构建耗时约 30 毫秒。
哦,顺便提一下,快速增量重构在 Zig 编译器本身上也表现得非常好:

[mlugg@nebula master]$ zig build -Dno-lib -Denable-llvm -fincremental --watch
构建总结:4/4 步骤成功
安装成功
└─ 安装 zig 成功
   └─ 编译可执行文件 zig Debug native 成功,耗时 36秒

构建总结:4/4 步骤成功
安装成功
└─ 安装 zig 成功
   └─ 编译可执行文件 zig Debug native 成功,耗时 244毫秒

构建总结:4/4 步骤成功
安装成功
└─ 安装 zig 成功
   └─ 编译可执行文件 zig Debug native 成功,耗时 228毫秒

构建总结:4/4 步骤成功
安装成功
└─ 安装 zig 成功
   └─ 编译可执行文件 zig Debug native 成功,耗时 288毫秒

构建总结:4/4 步骤成功
安装成功
└─ 安装 zig 成功
   └─ 编译可执行文件 zig Debug native 成功,耗时 283毫秒

该链接器实现目前最大的缺失功能是尚不支持为 Zig 代码生成 DWARF 调试信息——这绝对是我接下来的首要任务。但即使没有这项支持,能够实现瞬时重构也非常令人惊叹,例如在进行大量打印调试的情况下。

如果您使用的是 Zig 的主分支(master branch)并且运行在 x86_64 Linux 上,如果您的项目之前无法使用新 ELF 链接器进行增量编译,不妨尝试一下!我预计许多代码库已经可以很好地兼容它,从而实现以毫秒级的速度重构您的项目。当然,如果您遇到任何 Bug,请务必提交 Issue。

如果您目前仍在使用 Zig 的标记版本(tagged releases),请不用担心——正如 Andrew 在上一次开发日志中提到的,Zig 0.17.0 即将到来,很快您也可以体验到这一切了!

Devlog ⚡ Zig Programming Language

加入我们

Zig 中文社区是一个开放的组织,我们致力于推广 Zig 在中文群体中的使用,有多种方式可以参与进来:

  1. 供稿,分享自己使用 Zig 的心得
  2. 改进 ZigCC 组织下的开源项目
  3. 加入微信群Telegram 群组

Metadata

Metadata

Assignees

No one assigned

    Labels

    日报daily report

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions