概要
システムプログラミング言語Zigの開発チームは10月2日、バージョン0.17.0を正式リリースした。今回のリリースは5ヶ月間の開発成果で、206人のコントリビューターによる925件のコミットが反映されている。最大の変更点はビルドシステムの再設計で、従来は単一のプロセスで行っていた「設定(Configure)」と「実行(Make)」の処理を分離した。これにより、build.zigを編集してもMaker実行ファイル自体は再構築されずに済むようになり、Makerは最適化フラグ付きでコンパイルされる。設定フェーズをスキップできるケースも増え、キャッシュヒット時のビルド速度が5〜10%向上している。キャッシュの保存形式もテキストからバイナリへ移行し、ファイルサイズを約25%削減した。キャッシュの内容を調べるための新コマンドzig cache-catも追加されている。
破壊的変更:C連携とビルトインの刷新
互換性に大きく影響する変更として、C言語からの変換機能@cImportが0.16.0で非推奨化されていたものが本バージョンで完全に削除された。ビルドシステム内のstd.Build.Step.TranslateCも非推奨化され、代わりにZig Software Foundation(ZSF)が独立して開発・リリースするtranslate-cパッケージへの移行が推奨される。利用者はzig fetch --save git+https://codeberg.org/ziglang/translate-cで取得する形になり、コンパイラ本体より多くの設定オプションを備える。
言語仕様の面では、@bitCastの定義が「論理的なビット表現の再解釈」へと変更され、extern structやextern unionからの@bitCastは禁止、代わりに@ptrCastの使用が求められる。また列挙体の変換に使われていた@intFromEnumと@enumFromIntは、型推論に対応した新ビルトイン@backingInt・@fromBackingIntに置き換えられた。加えてarray ** count構文(@splatで代替)、void{}構文、errdefer |err|キャプチャ、i0整数型、internal・link_onceのグローバルリンケージといった機能が削除されており、既存コードの移行には一定の作業が必要になる。
標準ライブラリとコンパイラの改善
標準ライブラリでは、デバッグ用のDebugAllocatorが非推奨化され、スレッドセーフなSafeAllocatorへの移行が推奨されるようになった。メモリリークの追跡・報告、不正なメモリ操作時のパニックやセグメンテーションフォルト、double freeの検出といった保証を備える。標準ライブラリのテストスイートを使ったベンチマークでは、SafeAllocator導入によりウォールタイムが24.7%(29.4秒→22.1秒)、ピークメモリ使用量が50.3%(2.24GB→1.11GB)削減されたと報告されている。StackFallbackAllocatorもコンストラクタでバッファを渡す方式に再設計され、std.fmt.allocPrintはアロケータのメソッドmem.Allocator.printに統合された。
コンパイラ側では、x86_64-linux環境でのインクリメンタルコンパイルが大幅に改善され、zig build -fincremental --watchで多くのプロジェクトで実用的に使えるようになった。新しいELFリンカはx86_64とSPARC64を完全サポートし、GOT生成やコピー・リロケーション、GNUシンボルバージョニング、DWARFデバッグ情報にも対応する。COFFリンカもオブジェクト・アーカイブ出力やTLS、Exportsデータディレクトリへの対応を拡張した。WebAssemblyバックエンドはLLVMバックエンドとの比較で2060件中2054件(100%)のビヘイビアテストに合格している。対応ターゲットもLoongArchや任天堂Switch、ゲームボーイアドバンス、PlayStation、Wii Uなど多岐に広がった。
既知の問題と今後の展望
一方で、x86のソフトフロート環境でのcompiler-rtコンパイル失敗、std.debug.simple_panicのコンパイル失敗、Zig libcにおけるweakシンボルの動作不良、Maker/Configurer分離に起因するレスポンスファイルの破損、SPIR-Vバックエンドのリグレッションなど、いくつかの既知の問題も報告されている。開発チームは今後、Build Server ProtocolのZLS互換性強化、x86_64 Windowsバックエンドの完成、言語仕様の安定化、aarch64バックエンドの既定化、LLD依存の排除とインクリメンタルコンパイルの拡張、ファザーの強化、LLVMからClangプロセスへの依存移行、標準ライブラリの全面監査などをロードマップに掲げている。