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

Zig ELFリンカーの改善開発ログ

2026年5月31日原文(ziglang.org)

概要

  • Zigのmainブランチの2026年の主な変更点を解説
  • 新しいELFリンカやビルドシステムの大幅な改良
  • LLVMバックエンドでのインクリメンタルコンパイル対応
  • 型解決ロジックの抜本的な見直し
  • 各機能の実用的なメリットや移行時の注意点も記載

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

  • ELFリンカの改良

    • 新ELFリンカがZig 0.16.0で初登場
    • 当初はZig単体コードのみ対応、外部ライブラリ非対応
    • -fnew-linkerオプションで有効化可能
    • 最新のPRでLLVM・LLDライブラリ連携が可能に
    • Zigコンパイラ自身のビルドにも対応
  • 高速インクリメンタルビルドの実現

    • 新リンカの目玉機能は高速なインクリメンタルコンパイル
    • x86_64 Linux環境で外部ライブラリやCソースを含めても遅延なし
    • 例:Tetrisクローンのビルドが1回約30ms
    • Zigコンパイラ自身の再ビルドもミリ秒単位に短縮
  • 現時点の制約と今後の予定

    • DWARFデバッグ情報生成は未対応(今後の最優先課題)
    • x86_64 Linuxのmasterブランチ利用者は新リンカ+インクリメンタルビルドを推奨
    • 不具合報告も歓迎
    • 0.17.0リリースも間近

ビルドシステムの大幅な刷新

  • ビルドシステムの分離構造

    • これまでbuild.zigとビルドシステム実装が1つの巨大プロセスで動作
    • 新方式では「configurer」と「maker」に分離
      • configurer:build.zigをコンパイルし、ビルドグラフをバイナリ設定ファイルにシリアライズ
      • maker:Releaseモードでコンパイル、設定ファイルを受け取りビルドグラフを実行
    • makerはZigバージョンごとに1回だけコンパイル(グローバルキャッシュ利用)
  • 主なメリット

    • ビルド速度の大幅向上
    • build.zigのロジックのみ変更時に再コンパイル
    • 設定ファイルのキャッシュ利用で無駄な再実行を回避
    • ビルドグラフ実行プロセスは最適化済みで動作
  • ベンチマーク比較

    • 従来:zig build -h 実行に約150ms
    • 新方式:約14ms(90%以上短縮)
    • メモリ・CPU・キャッシュ効率も大幅改善
  • API互換性と移行時の注意点

    • ほぼ非破壊的だが、一部ビルドスクリプトAPIが変更
    • 例:run_cmd.addArgs(args) → run_cmd.addPassthruArgs()に変更
    • 引数変更時のビルドスクリプト再ビルドが不要に
  • 開発版の利用推奨

    • 0.17.0リリース前に新機能のテストやフィードバック募集
    • もし0.17.0でビルドが壊れても0.17.1で修正可能

LLVMバックエンドでのインクリメンタルコンパイル

  • LLVMバックエンドの改善点

    • LLVMコード生成バックエンドでインクリメンタルコンパイル対応
    • LLVM Emit Object自体の高速化は不可
    • Zigコンパイラ内の処理時間を最小化
    • コンパイルエラー時はエラー表示が即時化
    • 成功時もわずかにビルド時間短縮
  • 利用方法と安定性

    • masterブランチで利用可能、0.16.0にも搭載予定
    • -fincremental --watchオプションで有効化
    • コアチームは1年以上実運用し、ユーザーからも好評
    • バグ報告も歓迎

型解決ロジックの抜本的見直し

  • 主な変更点

    • Zigコンパイラ内部の型解決(type resolution)ロジックを大幅刷新
    • 型のフィールド解析を遅延実行
      • 実際に初期化されない型は詳細解析をスキップ
      • std.Io.Writerのような名前空間兼用型に有効
    • 例:
      const Foo = struct { bad_field: @compileError("i am an evil field, muahaha"), const something = 123; };
      comptime { _ = Foo.something; }
      
      • 以前はコンパイルエラー、現在は正常コンパイル
  • 依存ループ時のエラー改善

    • 依存ループ発生時のエラーメッセージが詳細化
    • どの型・フィールドがループしているか明確に表示
    • 問題箇所の特定が容易に
  • 今後の展望

    • 型解決ロジックの整理により、今後の言語仕様拡張や最適化が容易に
    • ユーザー体験の向上

このように、2026年のZig mainブランチは、ビルド速度・開発体験・内部設計の全方位で大きな進化を遂げています。今後のリリースにも注目。

Hackerたちの意見

これが、数年前にZigのことを初めて聞いたときに衝撃を受けた約束なんだ。これが現実になって本当に嬉しい!

今進められているこの作業が、Bunのドラマに対する反応なのか気になるな。

まったく関係ないよ。これに関してはずっと前から取り組んでたし、開発ログをさかのぼればその話題についてのエントリーがたくさん見つかるよ。逆に、今は「ドラマ」があるからこそ、みんなこの作業についてのコミュニケーションに対してオープンになってるんだ。この投稿はアンドリューと共同執筆したもので、2020年のものだよ。そこで、デバッグビルドパイプラインからLLVMを取り除くアイデアを発表して、それ以来着実に進んでるんだ。ただ、全ての主要ターゲットのためにフルコンパイラーパイプラインを立ち上げるのは簡単じゃないけど、ようやくそこに近づいてきたよ。https://kristoff.it/blog/zig-new-relationship-llvm/

ほんとに、無駄なドラマをかき立てないと動けない人もいるよね。それが本当かどうか、気になるところだな。

ないよ。これらのことはしばらく前から進行中だったし、Zigの反AIの姿勢を考えると、買収以来Bunは見限られたんじゃないかな。

「Bunドラマ」なんて全然ないよ。ただ目標や方法論が違う2つのプロジェクトがあって、相互に相容れないだけ。結局、退屈な人たちがちょっと騒いでるだけだよね… とにかく、このマイルストーンにはめっちゃ嬉しいし、感動してる!

ZigやRustみたいなのは、Cが使えるニッチな場所でしか通用しないと思ってたけど、もうそうじゃないね。リンクや他のターゲットでのインクリメンタルコンパイルが実現すれば、ZigはCの代替になるし、CやRustのパフォーマンスでJSやPythonの速度でイテレーションできるようになるんだ。アンドリューの初期の夢、妥協のないUXを持つDAWを作ることも、ずっと作りやすくなるはずだよ。誰かがZigネイティブのイミディエイトモードやリアクティブUIフレームワークを作ればだけどね。とはいえ、@cImportの削除にはちょっとモヤモヤしてるけど!これがないと、「Cのコトリン」とは自信を持って言えなくなっちゃうな。

Zigネイティブのイミディエイトモードdvui?

もうある程度は可能だよ。ここに僕のZig DAWがあるよ。音声エンジンには素晴らしいけど、UIは今のところimguiを使ってる。

Kotlin of C それは紙の上では良さそうだね。でも、Kotlinだけを学ぼうとした僕から言わせてもらうと、Javaのライブラリを使うためにJavaを学ばなきゃいけないのが面倒なんだよね… あれはシームレスに連携するからさ。結局、新しい学習者には逆に難しくなるかもしれない。ここでZigやCの話はしてないけど、Kotlinの経験からちょっと愚痴ってるだけ。

わからないけど、@cImportを単に"@import"にするのは改善だと思う。

それによって、JSやPythonの速度で、CやRustのパフォーマンスが得られる。Goはもうそれを実現してるんじゃない? > ZigやRustみたいなのは、Cが使えるニッチなところでしか通用しないと思ってたけど、もうそうじゃないね。このリンカーと他のターゲットでのインクリメンタルコンパイルが実現すれば、ZigはCの代替になるよ。そうだけど、Zigの哲学自体がCに似てるから、結局Cが使えるニッチでしか役に立たないと思う。ZigでJSやPythonの速度で開発するのは無理だし、メモリのライフサイクルやオブジェクトのライフサイクルにいつも悩まされるからね… Rustはかなり違うよ。

Hacker Newsで議論の続きを見る