Zig语言发布新版:支持LoongArch及多架构

Zig发布新版,支持LoongArch及多架构。本次更新历时5个月,含206位贡献者925次提交,重点改进ELF链接器并推进增量编译,新增对SPARC、MIPS等平台的深度支持。

Zig 是一种通用编程语言及工具链,旨在支持强大、高效且可复用的软件开发。该项目由 Zig 软件基金会资助,该基金会为 501(c)(3) 非营利组织。

新增LoongArch支持

本次发布涵盖了为期 5 个月的开发工作,包含来自 206 位贡献者的更改,共计 925 次提交。尽管原计划版本周期较短,但最终延长了周期,主要引入了 Build 服务器协议以及 ELF 链接器的改进,目标是实现 x86_64-linux 平台上的增量编译普及。

目标支持体系

Zig 支持广泛的架构和操作系统。以下章节详述了 Zig 可构建程序的目标平台,以及 Zig 编译器自身可轻松交叉编译运行的平台。

值得注意的变化

  • aarch64-openbsd 现已在 Zig 的 CI 中进行原生测试,以确保后续支持质量。
  • aarch64-freebsd 和 aarch64-netbsd 的 CI 任务现在不仅在 master 分支推送时运行,也在 Pull Request 阶段运行。
  • 已规避一个导致大多数 aarch64-windows 二进制文件(包括 Zig 编译器)失效的 LLVM Bug。
  • 针对 aarch64-openbsd 时,Zig 编译器现会应用强制代码加固技术,以确保生成的二进制文件正常运行。
  • Zig 现已在 32 位 ARM 上提供崩溃和断言失败的堆栈跟踪。Thumb-only 目标仍有一些工作待完成。
  • Zig 现已在 SPARC 上提供崩溃和断言失败的堆栈跟踪。
  • Zig 在处理 AArch64 上的堆栈展开时,现已能处理指针认证操作码。
  • 新增了对 loongarch32-linux-gnu[sf] 目标的支持。
  • Zig 对 64 位 SPARC(特别是 sparc64-linux)提供了普遍可用的支持。这主要得益于 Zig 新的 ELF 链接器对该目标的支持优于 LLD。
  • Zig 标准库已移植到 x86-64 上的 x32 ABI 和 64 位 MIPS 上的 N32 ABI。这些是利基 ILP32 ABI,允许使用 64 位指令集同时仅拥有 32 位指针,旨在以牺牲可用地址空间为代价换取更低的内存占用和更好的缓存利用率。
  • 添加了部分游戏控制台的目标信息:aarch64-switch、arm-gba、mipsel-psx 和 powerpc-wiiu。
  • Zig 中添加了非常早期的 xtensa-linux 支持。目前此支持仅可通过 C 后端或实验性 LLVM 后端行使。
  • 在使用 C 后端时,Zig 标准库现已支持 arc[eb]-linux、csky-linux 和 m88k-openbsd。
  • Zig 标准库现已支持无 libc 的 microblaze[el]-linux、sh[eb]-linux 和 sparc-linux。
  • Zig 对所有 PowerPC 目标强制执行 -mabi=ieeelongdouble。这只是对既有事实的形式化;Zig 从未支持 IBM 的“double-double”格式的 long double,且可能永远不会支持。因此,本版本移除了对 powerpc-linux-gnueabi[hf] 的支持,因为 glibc 仅在这些目标上支持“double-double”格式。powerpc-linux-musleabi[hf] 目标因使用 IEEE 格式而继续受支持。
  • 本版本移除了对 powerpc64-linux-gnu 的支持。Zig 仅支持为 64 位 PowerPC 链接 ELFv2 二进制文件,而 glibc 在大端序上不正式支持 ELFv2,也不支持上述的 IEEE long double。
  • Zig 检测原生 CPU 模型和功能的能力在所有平台上得到了极大增强;这影响了几乎所有架构在每个受支持的 OS 上的表现。
  • 部分目标的基准 CPU 模型发生了变更:
    • aarch64-haiku: cortex_a55
    • m68k-*: M68030
    • mips64-openbsd: octeon
    • powerpc-netbsd: 750
    • powerpc64-freebsd: pwr8
    • powerpc64-linux: pwr8
    • powerpc64-openbsd: pwr9
    • s390x-*: arch11
    • sparc-*: generic
    • sparc-linux: v9
    • sparc64-*: ultrasparc
    • xtensa-*: esp32
  • 在 Zig 的目标查询语法中,原生 libc 版本检测现在仅在 triple 实际使用原生 libc 时发生(即省略 ABI 组件)。预计这种新行为能更好地符合人们对目标查询工作方式的心理模型,特别是在考虑 OS 组件的工作方式时。

Tier 系统

Zig 对各种目标的支持程度大致分为四个层级,Tier 1 为最高级别。目标是 Tier 1 目标没有禁用的测试——这将成为 1.0.0 之后 Zig 版本的要求。

Tier 1

  • 所有非实验性语言特性已知正常工作。
  • 编译器可以在不依赖 LLVM 的情况下为此目标生成机器码。
  • 集成模糊测试器在此目标上工作(如果适用)。

Tier 2

  • 标准库跨平台抽象为此目标提供了实现。
  • 失败断言和崩溃在此目标上产生堆栈跟踪。
  • 即使交叉编译,libc 也为此目标可用(如果适用)。
  • 持续集成机器在每次推送时为每个目标构建模块测试。

Tier 3

  • 编译器可以通过依赖外部后端(如 LLVM)为此目标生成机器码。
  • 链接器可以为此目标生成对象文件、库和可执行文件。

Tier 4

  • 编译器可以为此目标生成汇编或 C 源代码。

支持表

在下表中,✅ 表示完全支持,❌ 表示不支持,⚠️ 表示部分支持(例如仅针对某些子目标,或存在一些值得注意的已知问题),❔ 表示状态很大程度上未知,通常是因为该目标很少被使用。悬停在其他图标上可查看详细信息。

标记有 🪦 的目标已过时;Zig 编译器和标准库对其保持尽力而为的支持,但预计最终将移除该支持。

Tier Target Code Gen. Linker Lang. Feat. Std. Lib. Stack Traces Fuzzer libc CI
1 x86_64-linux 🖥️⚡ ✅ ✅ ✅ ✅ ✅ ✅ ✅

2 aarch64-freebsd 🖥️🛠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅
2 aarch64[_be]-linux 🖥️🛠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅
2 aarch64-maccatalyst 🖥️🛠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅
2 aarch64-macos 🖥️🛠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅
2 aarch64[_be]-netbsd 🖥️🛠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅
2 aarch64-openbsd 🖥️🛠️ ✅ ✅ ✅ ✅ ❌ ✅ ✅
2 aarch64-windows 🖥️🛠️ ✅

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读