Zig – io_uring と Grand Central Dispatch の std.Io 実装を追加
(ziglang.org)- Zig 標準ライブラリの
std.Io.Eventedモジュールに、io_uring と Grand 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_eventedは io_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件のコメント
Hacker Newsのコメント
私はZigのファンというわけではないが、小さなチームが着実に進歩していく姿は見ていて気持ちがいい
完成よりも実験と漸進的な改善を重視する姿勢が印象的だ
1.0を急いで出すより、長期的な目標に向かって進むほうが重要だと思う
一人を中心としたプロジェクトとしては驚くべき成果であり、努力する人たちには正当な評価が必要だ
これまでで最も楽しく、生産的な経験だった
Rustの厳格なメモリ管理よりも、Zigのシンプルさのほうがずっと自分に合っている
人生は短いし、私はただ速くてよく整理されたソフトウェアを作りたいだけだ
Zigに関する記事は毎回批判が多いが、なぜそこまで気にするのか分からない
Andrewとチームが信じるものを実現しようとするエンジニアリング精神のほうが、むしろ刺激を与えてくれる
Zigが主流になるかどうかを心配する必要はなく、問題解決に役立つならそれで十分だ
言語をアイデンティティのように扱う必要はない
言語やライブラリは結局「売れるスキル」なので、人は自分の使う道具の市場価値を意識する
さらに、意思決定者がエンジニアを交換可能な資産として見る傾向があるのも問題だ
Lisp、Ruby、Rustなどでも繰り返されてきたことで、アイデンティティ争いは業界の慢性的な問題だ
セキュリティやアーキテクチャ対応など長期的な管理が必要なのに、開発者はそのコストを見落としがちだ
Zigはまだ安定しておらず、特定のバージョンでしかパッケージがコンパイルできない
他の言語の改善でも解決できる問題を、わざわざ新しい言語で解く必要があるのか疑問だ
Zigが1.0になるまでは追いかけても意味がないように感じる
今の構造は何度も作り直される可能性が高い
私もかつて関心はあったが、自分が生きているうちに1.0を見られるか分からない
ファイル入出力のような基本機能はほぼ同じで、名前空間が変わる程度だ
私は「生きている言語」のほうがよいと思う
1.x以降もstdlibをスリムに保つために、バージョンごとのインターフェース管理戦略があるとよい
I/Oフレームワークを自作していたところ、テスト不足や誤ったアセンブリコードを見つけた
何度も指摘したのに修正されず、信頼が落ちた
特にクラウド環境では、性能最適化によってサーバーコストを90%以上削減できる
PythonやNodeでは限界があり、結局C、C++、Rust、Zigのいずれかに降りていく必要がある
その中でZigは学びやすく、読みやすく、テストもしやすい
すでに実務レベルで使われている言語だ
変更の大半は実際に言語の改善だと感じられる
Rustのio_uringサポートがまだ完成していない状況で、Zigが先に実装を試みているのは興味深い
Rustでは安全かつゼロコストな抽象化を設計するのが難しい
今回の話はまだ未完成の実装についてのものだ
たとえばGCD版にはネットワーキングがない
インターフェースがどんどん大きくなっていて、完成形というより現時点のスナップショットに近い
今後取り組むべき6つの主要課題も具体的に列挙していた
スタックメモリ最適化に関するissueがある
異なるブロックで
[500]u8を使っても、スタックフレーム上では500バイトしか占有しないようにする機能が必要だこれはグリーンスレッドのコルーチンスタックに関連して特に重要だ
私はZigの継続的な改善努力を前向きに見ている
現在、io_uringをきちんと扱える言語はない
Zigがこの部分をうまく解決すれば、大きな優位を得るだろう
安定性よりも学習と実験を重視する姿勢のほうが価値があると思う
私はZigではlibxevを使ってio_uringを直接制御するやり方のほうが好みだ
Cが成功した理由は、安定性と一貫した開発文化にあった
Zigがfreestandingターゲットを真剣に扱っている点がいい
0.16ではコード再利用性がさらに高まることを期待している
久しぶりにmacOSの内部を見たが、GCDが維持されているのはうれしい
並列化へのバランスの取れたアプローチだと思う
他の言語が議論ばかりしている間に、Zigは実際に試し、必要なら戻す
実戦で検証されたAPIこそが最高の設計だと信じている
古いバージョンを維持してもいいし、最新バージョンに進めばよりクリーンで高速なツールを得られる
C++のように複雑だが、ZigはCレベルのシンプルさを保っている
Carbonはまだ実体がない状態だ
Jaiは11年間クローズドベータなのに、Zigはすでに多くの実際のプロジェクトで使われている
Python 2→3、Rust async、Go generics、C++などで見てきた無秩序な変化のほうがむしろ有害だ