
2026/08/30 23:41
Zig:配列リストのポインタ安定性
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026 年における Zig の進化は、アーキテクチャの再設計、メモリ安全性の向上、およびパフォーマンス最適化に駆動される画期的な転換を示しています。主要な突破は 2026 年 5 月~6 月に起こり、ビルドシステムが特殊化した
configurer と maker プロセスに分割されました。このシリアライズされたビルドロジックにより、zig build の実行時間は約 90% 削減され、バイナリサイズは約 4% 減少しました。同時に、LLVM バックエンドへの統合により高速な増分コンパイルが実現可能となり(数ミリ秒対数秒)、新しい ELF リンカーによって Zig + LLVM + LLD プロジェクトの結合をサポートするようになりました。
安全性の改善も同等に重大でした。2026 年 8 月には、
std.ArrayList に lockPointers() と unlockPointers() のコールが追加され、リスト操作中の不整合ポインタなどのメモリ安全性違反を防止できるようになりました。さらに、論理的なビットレイアウトに基づいた新しい @bitCast セマンティクスによってエンドアンアグノスティックなキャストが可能となり、「Pointer Stability Locks」という機能も導入されました。
パフォーマンスと機能の拡大には、適切な整数ローディング化による LLVM バックエンド効率の約 5% の向上、SPIR-V バックエンドでのパッセージ行為テスト合格率の 10% の増加(現在はマルチスレッドコード生成および spv オブジェクトファイル結合をサポート)が含まれます。また、io_uring および Grand Central Dispatch 向けの実験的な I/O ストラテジーである
std.Io.Evented などが含まれます。今後の作業には、動的配列に対する普遍的な安全性保証の最終化、ならびにサードパーティライブラリ向けの高度な I/O ストラテジーの完全な統合が含まれますが、一部の側面はまだ調査中です。本文
Zig メインブランチ 2026 年最新変更まとめ
このページは、Zig メインブランチへの 2026 年の修正内容が精選された一覧です。他の年は Devlog Archive ページ を参照してください。
2026 年 8 月:メモリ安全性とパッケージ管理の進化
8 月 27 日:ArrayList のポインタ安定化機能実装
- 執筆者: ロビー・ライマン (Robbie Lyman)
- 背景: 2024 年に
のハッシュマップコンテナに追加された「ポインタ安定化ロック」機能を、リオ・エマー=カル氏により提出された PR がstd
に移植されました。_ArrayList_ - 機能概要:
- メモリ安全性を保証する技術です。
- 利用手順:
- ArrayList が管理する要素またはスライスのポインタを初めて格納する際に、
を呼び出します。lockPointers() - そのポインタが不要になったタイミングで、
を呼び出します。unlockPointers()
- ArrayList が管理する要素またはスライスのポインタを初めて格納する際に、
6 月 30 日:パッケージ管理機能のコンパイラからビルドシステムへ移行
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- 理由: ユーザーの
スクリプトとビルドシステムのプロセスを分離する観点から、パッケージ管理ロジックをビルドシステム内に再配置しました。build.zig - 移行されたサブコマンド:
zig buildzig fetchzig initzig libc
- ソースコード形式への移行: 以前コンパイラ実行ファイルに含まれていた機能が多く、現在ではソースコードとして配送されています。
- パッケージ取得ロジック
- HTTP クライアントおよびネットワーク機能
- TLS(トランスポート層セキュリティ)および暗号化処理
- Git プロトコル
解析機能(xz, gzip, zstd, flate, zip など)build.zig.zon
- セキュリティ強化:
- パッケージ管理時、安全性チェックが有効化されます(メーカー実行ファイルが ReleaseSafe モードでコンパイルされているため)。
- 暗号化処理において、ホスト機器の特別 CPU インストラクションを活用できるようになりました。
2026 年 6 月:コンパイラバックエンドと型システム
6 月 26 日:SPIR-V バックエンドの修復と拡張
- 執筆者: アリ・チェラヒ (Ali Cheraghi)
- 改善点: 劣化していた SPIR-V バックエンドを数週間で再構築しました。
- @SpirvType の導入: Zig の型システムで表現できないタイプの問題に対応(Issue #20550, #23326, #35461)。
- コール規約上の実行モード: インラインアセンブリではなく、コール規約によって保持されるようになりました。メッシュシェーディング用に
およびspirv_task
が追加されました。spirv_mesh - CPU 機能制御: Capabilities と Extensions が、他ターゲットと同様に CPU の機能セットで完全に制御されます(外部ベンダーは暫定的に除外)。
- マルチスレッドコード生成: コード生成ジョブが Mir 値を生成し、コンパイラのスレッドプールでスケジュールされるようになりました。
およびdedup_types
の ISel パスが復活しました。prune_unused - オブジェクトファイルリンク:
ファイルがオブジェクトファイルとして認識され、複数の.spv
または外部.zig
を単一のモジュールに結合できるようになりました。.spv
6 月 25 日:@bitCast のセマンティクス変更と LLVM バックエンド改良
- 執筆者: マシュー・ラグ (Matthew Lugg)
- LLVM 整数型低下処理:
- メモリ格納時に任意のビット幅の整数型を、ABI サイズの型へ低下させます(Clang の C
と動作一致)。_BitInt(N)
- メモリ格納時に任意のビット幅の整数型を、ABI サイズの型へ低下させます(Clang の C
- @bitCast の再定義:
- バイト解釈書き換えではなく、論理的ビットに基づいた実装に改めました。
- エンディアン非依存動作が可能になります。
- サポート例:
→[2]u3
の変換。@Vector(3, u2) - 制限/許可: ポインタベクトルへの転送は禁止、enum に対する転送は許可。
- パフォーマンス向上: 見逃されていた最適化が回復し、コンパイラ自体のパフォーマンスが約 5% 向上。
6 月 24 日:LLVM による増分コンパイル実装
- 執筆者: マシュー・ラグ (Matthew Lugg)
- 概要: LLVM コード生成バックエンドへの改善に加え、増分コンパイルサポートを実装しました。
- 「LLVM Emit Object」の加速には寄与しませんが、Zig コンパイラコード内の消費時間を最小限に抑えます。
- master ブランチおよび 0.16.0 リリースに含まれています。
2026 年 5 月:リンカーとビルドシステムの大規模改組
5 月 30 日:新しい ELF リンカーの採用
- 執筆者: マシュー・ラグ (Matthew Lugg)
- 概要: Zig 0.16.0 でデビューした新しい ELF リンカーにより大きな進展を遂げました。
- 自己ホスト化: LLVM と LLD ライブラリを有効化し、自己ホスト化されたコンパイラの構築が可能に。
- 高速増分コンパイル: x86_64 Linux 上で外部ライブラリおよび C ソースをリンクしながらも、追加パフォーマンスオーバーヘッドなしで増分再構築可能。
5 月 26 日:ビルドシステムの改組(Maker/Configurer セパレーション)
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- 概要: メーカー(maker)プロセスと設定器(configurer)プロセスを分離する大規模ブランチがマージされました。
ロジックは小型のデバッグモードプロセス「設定器」でコンパイルされます。build.zig- 親プロセスである
は、ビルドグラフ実行プロセス「メーカー」をリリースモード(非同期)で実行します。zig build
- 動機:
- ユーザーロジック変更時のみコンパイルするため、
が大幅に高速化。zig build - 変化がない場合、ビルドシステムは
の再実行をスキップできます。build.zig - グラフ実行器は最適化付きでコンパイルできるようになります。
- ユーザーロジック変更時のみコンパイルするため、
- 互換性のない変更:
はrun_cmd.addArgs(args)
に置き換えられました。run_cmd.addPassthruArgs()- ビルドスクリプトが特定の引数を観測する能力は削除されました。
2026 年 4 月:型解決の再設計
4 月 8 日(および随時):型解決ロジックの大規模再構築
- 執筆者: マシュー・ラグ (Matthew Lugg)
- 概要: 大規模な PR(約 30,000 ライン)により、内部型解決ロジックが再構築されました。
- 楽観的な解析: 型が初期化されない場合、Zig はそのフィールドを分析しません。これにより型は名前空間として機能しつつ、不要なコードを避けて動作します。
- 依存ループの改善: エラーメッセージがループ存在場所の正確な詳細情報を示すように強化されました。
- 増分コンパイル: 多数の既知バグ(特に「過剰解析」)が修正され、増分コンパイルが著しく高速化。
2026 年 2 月:I/O、パッケージ管理と OS API の最適化
2 月 13 日:io_uring と Grand Central Dispatch の std.Io 実装マージ
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- 概要:
向けのstd.Io.Evented
および Grand Central Dispatch 実装がマージされました。io_uring- ユーザースペーススタックスイッチング(ファイバー)に基づいています。
- 注意: 現状は実験的なものです。
- 改善事項: より良いエラーハンドリング、ログ出力の削減、パフォーマンス診断機能の追加、欠落機能の実装、テストカバレッジの増加など。
2 月 6 日:パッケージ管理ワークフローの改良
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- 1. ローカルストレージ: 取得されたパッケージはプロジェクトルートディレクトリの
(zig-pkg
の隣)にローカル保存されます。build.zig- 自己完結型ソースタールの配布が可能に。
外の依存関係変更が容易になり、圧縮ファイルのグローバルキャッシュも維持。.zig-cache
- 2. --fork フラグ:
フラグにより、依存ツリー全体で特定のソースチェックアウトと一致するパッケージを上書きできます。--fork=[パス]- 再ビルドなしでフォークされた依存関係の反復テストが可能。
- 永続的に
を変更せずに済みます。build.zig.zon
- 1. ローカルストレージ: 取得されたパッケージはプロジェクトルートディレクトリの
2 月 3 日:Win32 API からの脱却(Kernel32.dll バイパス)
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- ポリシー: Win32 API よりもネイティブ API を優先。
- エントロピーの増加:
から直接advapi32.dll
を使用し、SystemFunction036
ウラッパーの不具合(ヘッパ配列、失敗モード、肥大化)を回避。kernel32.dll - ファイル I/O の効率化: 直接
およびNtReadFile
を使用し、より優れたエラー報告と、NtWriteFile
フィクスタイプのオーバーヘッドを回避。OVERLAPPED
- エントロピーの増加:
1 月 31 日:zig libc と C ソースファイルの削減
- 執筆者: アンドリュー・ケリー (Andrew Kelley)
- 概要: C ソースファイル(バインド)ではなく、Zig 標準ライブラリラッパーとして
関数を提供し、冗長なコードを段階的に削除しています。libc- 削減成果: 約 250 の C ソースファイルを削除済み(残存 2,032 ファイル)。
- 共有機能: 他の Zig コードや ZCU を共有可能に。冗長コード排除、フロントエンドレベルのリンク時間最適化(LTO)を可能に。
- I/O 制御:
の変更と組み合わせることで、ユーザーが I/O 実行方法(例:すべての I/O をstd.Io
イベントループに参加させる強制)をシームレスに制御可能に。io_uring