2 ポイント 投稿者 GN⁺ 2026-02-15 | 1件のコメント | WhatsAppで共有
  • Zig 標準ライブラリの std.Io.Evented モジュールに、io_uringGrand Central Dispatch(GCD) ベースの実装が新たに統合された
  • どちらの実装も ユーザー空間でのスタック切り替え(fibers、stackful coroutines、green threads) 方式で動作する
  • 現在は 実験的段階 であり、エラー処理の改善・ロギング削除・性能低下の原因分析・テスト強化などの後続作業が必要
  • 同一のアプリケーションコードで I/O バックエンドだけを差し替えて、io_uring または GCD へ容易に切り替え可能
  • Zig コンパイラでも両実装が動作しており、今後安定化すれば プラットフォーム別の非同期 I/O を統合する基盤 へ発展する可能性がある

io_uring と GCD ベースの std.Io.Evented 実装

  • Zig 0.16.0 のリリースサイクル終盤に、std.Io.Evented が最新の API 変更を反映して更新された

    • 新たに追加された実装は io_uring(Linux)と Grand Central Dispatch(GCD)(macOS)
    • どちらの実装も ユーザー空間でのスタック切り替え(fibers、stackful coroutines、green threads) 技術を使用
  • 両実装は現在 実験的状態 であり、安定運用には複数の改善課題が残っている

    • エラー処理の改善 が必要
    • ロギングの削除性能低下の原因調査 が必要(IoMode.evented 使用時にコンパイラの性能低下が発生)
    • 一部 未実装の関数 があり、テストカバレッジの拡充 も必要
    • 関数ごとの最大スタックサイズ確認用の組み込み関数 の追加が必要(overcommit 無効時の実用性確保が目的)

I/O 実装の切り替え例

  • 同じアプリケーションコードで I/O バックエンドだけを切り替えて 動作させられる

    • 例のコードで std.Io.Threaded の代わりに std.Io.Evented を使うと、io_uring ベースで実行される
    • app 関数は同一で、出力結果(Hello, World!)も同じ
  • strace の結果比較により、2 つの実行方式の違いを確認できる

    • hello_threaded は通常のスレッドベース I/O 呼び出し
    • hello_eventedio_uring システムコール(io_uring_setup、io_uring_enter など) を使用

Zig コンパイラへの適用と現状

  • Zig コンパイラ自体も std.Io.Evented を使用して正常に動作する

    • io_uring と GCD のどちらでもコンパイラを実行可能
    • ただし、性能低下の原因は未特定 であり、追加分析が必要
  • この変更により、Zig コードは I/O 実装を容易に切り替えられる構造 に近づいた

    • プラットフォームごとの非同期 I/O モデルを統合的に扱える基盤が整いつつある

今後の課題

  • 安定利用に向けた 性能改善とテスト強化 が必要
  • スタックサイズ管理機能 が追加されれば、オーバーコミットが無効な環境でも実用的に利用できる
  • 完成すれば Zig の 非同期 I/O 抽象化レイヤー はさらに強化される見込み

結論

  • 今回の更新は、Zig の 標準 I/O システム拡張 における重要な前進
  • io_uring と GCD を統合することで、プラットフォーム間の非同期処理の一貫性 を確保する基盤が整う
  • 今後の安定化作業が完了すれば、Zig の 高性能で柔軟な I/O モデル 実現の可能性が広がる

1件のコメント

 
GN⁺ 2026-02-15
Hacker Newsのコメント
  • 私はZigのファンというわけではないが、小さなチームが着実に進歩していく姿は見ていて気持ちがいい
    完成よりも実験と漸進的な改善を重視する姿勢が印象的だ
    1.0を急いで出すより、長期的な目標に向かって進むほうが重要だと思う
    一人を中心としたプロジェクトとしては驚くべき成果であり、努力する人たちには正当な評価が必要だ

    • 新しい言語を学ぶたびにTCP/UDPマルチプレイヤーサーバー付きのゲームエンジンを作ってみるのだが、最近はZigで試してみた
      これまでで最も楽しく、生産的な経験だった
      Rustの厳格なメモリ管理よりも、Zigのシンプルさのほうがずっと自分に合っている
      人生は短いし、私はただ速くてよく整理されたソフトウェアを作りたいだけだ
  • Zigに関する記事は毎回批判が多いが、なぜそこまで気にするのか分からない
    Andrewとチームが信じるものを実現しようとするエンジニアリング精神のほうが、むしろ刺激を与えてくれる
    Zigが主流になるかどうかを心配する必要はなく、問題解決に役立つならそれで十分だ
    言語をアイデンティティのように扱う必要はない

    • こうした現象をなくすには、プログラマーが受ける経済的インセンティブを変える必要がある
      言語やライブラリは結局「売れるスキル」なので、人は自分の使う道具の市場価値を意識する
      さらに、意思決定者がエンジニアを交換可能な資産として見る傾向があるのも問題だ
    • こうした言語論争はZigだけの話ではない
      Lisp、Ruby、Rustなどでも繰り返されてきたことで、アイデンティティ争いは業界の慢性的な問題だ
    • 新しい言語スタックはLinuxディストリビューションにおける保守負担を増やす
      セキュリティやアーキテクチャ対応など長期的な管理が必要なのに、開発者はそのコストを見落としがちだ
      Zigはまだ安定しておらず、特定のバージョンでしかパッケージがコンパイルできない
      他の言語の改善でも解決できる問題を、わざわざ新しい言語で解く必要があるのか疑問だ
    • 主流言語になるには、大半のユースケースをカバーできる予測可能なライブラリエコシステムが必要だ
  • Zigが1.0になるまでは追いかけても意味がないように感じる
    今の構造は何度も作り直される可能性が高い
    私もかつて関心はあったが、自分が生きているうちに1.0を見られるか分からない

    • 実際には、Zigの互換性破壊の大半は標準ライブラリ(stdlib)で起きている
      ファイル入出力のような基本機能はほぼ同じで、名前空間が変わる程度だ
      私は「生きている言語」のほうがよいと思う
      1.x以降もstdlibをスリムに保つために、バージョンごとのインターフェース管理戦略があるとよい
    • Zigという言語自体は好きだが、stdlibの品質には疑問を感じる
      I/Oフレームワークを自作していたところ、テスト不足や誤ったアセンブリコードを見つけた
      何度も指摘したのに修正されず、信頼が落ちた
    • 大規模プロジェクトではためらいがあるかもしれないが、Zigはすでにビジネス上の価値がある
      特にクラウド環境では、性能最適化によってサーバーコストを90%以上削減できる
      PythonやNodeでは限界があり、結局C、C++、Rust、Zigのいずれかに降りていく必要がある
      その中でZigは学びやすく、読みやすく、テストもしやすい
    • ちなみにBunもZigで書かれている
      すでに実務レベルで使われている言語だ
    • 私たちのチーム(ZML)はstd.Io導入以降、Zig masterブランチを継続して追っている
      変更の大半は実際に言語の改善だと感じられる
  • Rustのio_uringサポートがまだ完成していない状況で、Zigが先に実装を試みているのは興味深い
    Rustでは安全かつゼロコストな抽象化を設計するのが難しい

  • 今回の話はまだ未完成の実装についてのものだ
    たとえばGCD版にはネットワーキングがない
    インターフェースがどんどん大きくなっていて、完成形というより現時点のスナップショットに近い

    • ただ、記事の冒頭ですでに実験段階だと明記しており、
      今後取り組むべき6つの主要課題も具体的に列挙していた
  • スタックメモリ最適化に関するissueがある
    異なるブロックで[500]u8を使っても、スタックフレーム上では500バイトしか占有しないようにする機能が必要だ
    これはグリーンスレッドのコルーチンスタックに関連して特に重要だ

  • 私はZigの継続的な改善努力を前向きに見ている
    現在、io_uringをきちんと扱える言語はない
    Zigがこの部分をうまく解決すれば、大きな優位を得るだろう
    安定性よりも学習と実験を重視する姿勢のほうが価値があると思う

    • 低レベル言語にまでasyncを求めるのは興味深い
      私はZigではlibxevを使ってio_uringを直接制御するやり方のほうが好みだ
    • 私も前向きだが、ZigがCのような**長期安定版(LTS)**を出す時期がいつになるのか気になる
      Cが成功した理由は、安定性と一貫した開発文化にあった
  • Zigがfreestandingターゲットを真剣に扱っている点がいい
    0.16ではコード再利用性がさらに高まることを期待している

  • 久しぶりにmacOSの内部を見たが、GCDが維持されているのはうれしい
    並列化へのバランスの取れたアプローチだと思う

  • 他の言語が議論ばかりしている間に、Zigは実際に試し、必要なら戻す
    実戦で検証されたAPIこそが最高の設計だと信じている
    古いバージョンを維持してもいいし、最新バージョンに進めばよりクリーンで高速なツールを得られる

    • Jaiはゲーム開発中心なので、汎用性や安全性の面で不足している
      C++のように複雑だが、ZigはCレベルのシンプルさを保っている
      Carbonはまだ実体がない状態だ
    • Zigが1.0ではないと批判するのはおかしい
      Jaiは11年間クローズドベータなのに、Zigはすでに多くの実際のプロジェクトで使われている
    • 言語は20年かかっても、きちんと完成するほうがよいと思う
      Python 2→3、Rust async、Go generics、C++などで見てきた無秩序な変化のほうがむしろ有害だ