世界を動かす技術を、日本語で。

Zig: ビルドシステムの再構築

概要

  • Zig のmainブランチで2026年に導入された主要な変更点のまとめ
  • ビルドシステムの大幅な再設計 とパフォーマンス向上
  • LLVMバックエンドのインクリメンタルコンパイル 対応
  • 型解決ロジックの刷新 とエラーメッセージの改善
  • io_uring・Grand Central Dispatch 実装の追加

2026年 Zig mainブランチの主な変更点

  • Devlogアーカイブページ にて他の年の変更履歴も参照可能
  • 本ページ は2026年分の主要なアップデートを抜粋

ビルドシステムの再設計(2026年5月26日)

  • 作者: Andrew Kelley
  • makerプロセスconfigurerプロセス の分離によるビルドシステムの大規模変更
  • 従来は build.zigファイル とビルドシステム全体をデバッグモードで1つの大きなプロセスとしてコンパイル
  • 新方式では build.zig は小型プロセス(configurer)としてデバッグモードでコンパイル
  • ビルドグラフ をバイナリ設定ファイルにシリアライズし、親のzig buildプロセスがキャッシュ
  • 並行して makerプロセス をリリースモードでコンパイルし、設定ファイルを受け取って実行
  • makerプロセス はZigバージョンごとに1度だけコンパイル、グローバルキャッシュ利用
  • パフォーマンス向上 の主な理由
    • ユーザーの build.zig だけを変更時に再コンパイル
    • --watch, --fuzz, --webui などの新機能追加時にもビルド時間が増加しない
    • 不要な再実行 を回避し、同じ設定時はbuild.zigをスキップ
    • ビルドグラフ実行プロセス が最適化付きで高速化
  • ベンチマーク結果
    • zig build -h 実行時の 壁時計時間が90%以上短縮
    • メモリ消費量・CPUサイクル・命令数 も大幅削減
  • サードパーティツール (例: ZLS)がシリアライズ済み設定ファイルを活用可能に
  • API互換性 は概ね維持、主な破壊的変更点はビルドスクリプト内の引数の扱い
    • run_cmd.addPassthruArgs(); への変更
  • 0.17.0リリース 前のテスト・フィードバックの呼びかけ
  • 0.17.1 での修正受付も案内

LLVMバックエンドのインクリメンタルコンパイル対応(2026年4月8日)

  • 作者: Matthew Lugg
  • LLVMコード生成バックエンド でインクリメンタルコンパイル対応
  • LLVM Emit Object の高速化は不可だが、Zigコンパイラ本体の処理時間を短縮
  • コンパイルエラー発生時 はエラー検出がミリ秒単位で高速化
  • masterブランチ で利用可能、0.16.0リリースに含まれる予定
  • -fincremental --watch オプションで体験可能
  • Zigコアチーム も1年以上ワークフローで活用
  • CIのインクリメンタルテスト もLLVMバックエンドで有効化済み
  • バグ報告 の呼びかけ

型解決ロジックの刷新とエラーメッセージ改善(2026年3月10日)

  • 作者: Matthew Lugg
  • コンパイラ内部の型解決ロジック をより論理的・直感的な設計へ大規模リファクタリング
  • 型が初期化されない場合 はフィールド解析を省略し、名前空間としての利用を最適化
  • 依存ループエラー のメッセージを大幅改善
    • どの型がどこで依存しているか、詳細な情報を表示
  • インクリメンタルコンパイル のバグ修正と高速化
    • 過剰解析問題 の解消、不要な再解析を削減
  • 数多くのバグ修正・小規模な言語仕様変更・パフォーマンス向上 も同時に実施
  • 詳細はPR参照、バグ報告の呼びかけ

io_uring・Grand Central Dispatch 実装の追加(2026年2月13日)

  • 作者: Andrew Kelley
  • std.Io.Evented のAPI更新に対応し、io_uring・Grand Central Dispatch実装を追加
  • ユーザースペーススタックスイッチング (fibers/stackful coroutines/green threads)を利用
  • 実験的機能 として利用可能
    • エラーハンドリング強化
    • ロギング削除
    • IoMode.evented利用時のパフォーマンス劣化診断
    • 未実装関数の実装
    • テストカバレッジ拡大
    • スタックサイズ取得用組み込み関数 の追加予定
  • Io実装の切り替え が容易なZigコードの実現を目指す
  • 利用例コード も紹介

まとめ

  • Zig mainブランチ は2026年に多数の大規模アップデートを導入
  • ビルド速度・型システム・I/O・エラーメッセージ 等、開発体験が大幅に向上
  • 新機能テスト・バグ報告 への協力の呼びかけ

Hackerたちの意見

これは素晴らしいニュースだね!Zigのコンパイル時間はすでに素晴らしいから、これでさらに良くなるね。

Zigのコンパイル時間はすでに素晴らしい 私の経験では、今のところこれはほとんど理想論だね。明らかに大きな目標で、達成するための明確なマイルストーンもあるけど、実際には空のプロジェクトを初めてコンパイルする時や、direnv allowを実行してZLSを(再)構築する時の長い待ち時間は「素晴らしい」とは言えないよ。

90年代のコンパイル速度が徐々に戻ってきてるのはありがたいね。

Zigを数ヶ月使ってみて、これは素晴らしいツール言語だと確信したよ。アイデアを自由にハックするために使えるし、壁にぶつかるたびに、クリエイターたちがすでに考えてくれていることに気づいて安心するんだ。でも、プログラミング言語を「正しく」使う方法が押し付けられることはないから、今では「ガレージでいじる」言語として一番使ってるよ。

本当にそんなにいいの?私の「ガレージでいじる」言語はPythonなんだけど、軽量な構文で邪魔にならないし、バッテリーも含まれてるし、含まれてないもののためのパッケージもある。Zigの強みは何なの?

確かに素晴らしいいじり言語だけど…うーん、Zigのチームとコミュニティは言語の正しい使い方についてかなり意見が強いよね。

これに関して一番の問題は、Mojoが私の tinkering 言語になることを期待してるってことだね。

でも、プログラミング言語を「正しく」使う方法が明示的に示されてるわけじゃない。未使用の変数は許されないし、マルチラインコメントのサポートもない。これは私にとってかなり大きな生産性の問題だよ。

このプロジェクトのライセンスを確認したんだけど、MITライセンスの後にある(Expat)って何か誰か教えてくれない?

MITライセンスにはいくつかのバリエーションがあって、似てるけど完全に同じじゃないんだよね。ここで言う「Expat」はMITライセンスの一種で、最初にこのライセンスを使ったExpat XMLパーシングライブラリを指してる。最近のプロジェクトがMITライセンスを使うときは、だいたいこのバージョンを使ってるよ。

「MIT」と呼ばれていたライセンスはいくつかあって、「Expat」と明記することでどのバージョンを指しているのかがわかる(この場合は「標準」のやつね)。ほとんどのMITライセンスの言及はこのバージョンを指してるから、あまり必要ないけどね。

最近、コードをZig 0.16.0にアップグレードしたんだけど、結果に本当に満足してるよ。影響を受けたことはたくさんあったけど、変更は実際にとても良くて、特に新しいIOメカニズムのおかげで、シングルスレッドでもマルチスレッドでも、イベントループを使っても見栄えの良い効率的なコードが書けるようになった!0.16.0がリリースされてからZigを試してないなら、ぜひ見てみてほしい。今回のリリースノートはすごかったよ! https://ziglang.org/download/0.16.0/release-notes.html

“(超)効率的”なものはまだ実現してないね。Ioはまだ動的ディスパッチで、いくつかの間接層がある状態。私の知る限りでは、前より遅くなってる。次のリリースでは、「ディスパッチはコンパイル時にわかるけど、まだ動的」という問題を解決して、効率の損失をなくすことが期待されてるよ。

いつか新しい機能が使えるようになるかもしれないけど、安定性とテストが少ないターゲットのために、Zigのビルドでは.use_llvm = trueを使ってるよ。

Zigには魅力的な機能がたくさんあって、場合によってはRustのほぼ完璧なメモリ安全性を手放してもいいと思ってる。でも、唯一気に入らないのは文字列の扱い。ほんとに面倒くさいんだよね。個々の文字列のメモリアロケーションを細かく管理できるのは好きだけど、いつもそれをやりたくはない。RAIIは素晴らしいけど、文字列やコンテナに軽い(オプションの)RAIIを使ってくれたらいいな。

私にとっては文字列処理かな。プライベートで使われていない変数がコンパイルエラーにならないし、自分でインターフェースを実装しなきゃいけないのが面倒だよね。

アリーナアロケータを使ってみたらどう?

安定版のリリース予定ってあるのかな?最近のasync IOみたいな大きな機能は、今のところ言語がすごく不安定だってことを示してるよね。

アンドリューの考えは「準備が整ったときに整ってるけど、完全に準備ができる前に使いたいと思えるくらい良いものになってほしい」ってこと。違ってて、私は好きだな。やるからには、できるだけ多くの分野でうまくいくようにしたいよね。

1.0のリリース時期はまだわからないけど、アップグレードはそんなに難しくないみたい。バージョンリリースノートにしっかりとドキュメントがあるからね。

ちょっとした指摘だけど、言語自体はかなり安定してる。変わるのは標準ライブラリだね。

アンドリュー・ケリーのインタビュー動画を見たら、Zigを始めたくなったよね:https://www.youtube.com/watch?v=iqddnwKF8HQ

なんでNode.jsやTypeScriptの代わりにこれを使いたいの?

ちょっとGhostty(Zigで書かれてる)を使ってみて、Hyper(JavaScriptで書かれてる)と比べてみるのをおすすめするよ。

もしあなたの仕事がNodeやTSに合ってるなら、Zigを使う理由はないと思うよ(学習や好奇心以外はね)。パフォーマンスやメモリレイアウト、制御をすべて必要としないなら、Zigを使うデメリットの方が多いかも。CRUDや「エンタープライズ」系のもの、ウェブサイトにはZigはあまり恩恵がないと思う。

誰か、RustユーザーにZigを試すべき理由と試さないべき理由を教えてあげて。

メモリやIO操作を完全にコントロールしたいなら試してみて。あと「drop」もね。もし「goto-definition」を使うと、最終的にはOSのスイッチ文やシステムコールが見えるよ。特に魔法みたいなことはないから、メモリ管理やメモリリークが怖いならやらない方がいいよ。