开发日志 ★ Zig 编程语言

主要观点:作者 David Rubin 近期在 C 互操作性方面工作,发现 Zig 的 zig cc 在编译 C 时默认启用 -fsanitize=undefined虽能捕捉细微错误,但因缺乏 UBSan 运行时,之前所有未定义行为都用 trap 指令捕获,导致错误信息不清晰,如一个简单 C 程序运行 zig cc 会出现无帮助的 SIGILL 错误,而新合并的 UBSan 运行时能提供更有用的错误信息,包括指出错误类型和发生位置;作者 Andrew Kelley 本周因 Zig 的调试分配器创建过多内存映射导致 CI 失败,于是重构调试分配器,使其可检测运行时页面大小,不再进行不必要的操作且性能显著提升,重新设计后不仅适用于运行时已知页面大小,避免创建过多内存映射,还优于之前的版本,并且通过创建测试用例进一步测试,最终在真实世界的 Zig 编译器自身使用案例中也表现出色,标志着 Zig 项目在语言和标准库方面已超越 C 和 libc。

关键信息

  • Zig 编译 C 时默认启用 -fsanitize=undefined
  • 缺乏 UBSan 运行时时未定义行为用 trap 指令捕获,错误信息不清晰。
  • 新 UBSan 运行时能提供更有用的错误信息。
  • Zig 调试分配器重构,可检测运行时页面大小,性能提升。
  • 通过测试用例验证新分配器在 Zig 编译器中的性能。

重要细节

  • 如示例 C 程序运行 zig cc 出现 fish: Job 1, 'zig run test.c -lc' terminated by signal SIGILL (Illegal instruction) 错误。
  • 新 UBSan 运行时的错误信息能指出 signed integer overflow 及发生位置。
  • 重构的调试分配器基于 contributor archbirdplus 的补丁,存储分配元数据 inline 等。
  • 测试用例中不同情况下 Zig 与 Glibc 的性能对比,如 ast-check 任务和整个编译器构建。
阅读 13
0 条评论