概要
- Zigの新しいI/Oインターフェース導入による設計変更
- async/await復活と非同期I/O設計の進化
- コード再利用性と最適性の向上
- 標準ライブラリによる複数I/O実装サポート
- 今後のロードマップとリリース計画
Zigの新I/Oインターフェースと非同期設計
- Zig では新しい Ioインターフェース が導入され、すべてのI/O操作をこのインターフェース経由で実行
- Io は呼び出し元が提供する設計となり、 Allocator と同様のインジェクション方式採用
- 旧実装では直接ファイルや標準出力を操作していたが、新実装では Io を引数として渡すことで、具象I/O実装の選択が可能
- 依存パッケージのコードでも呼び出し元がI/O実装を注入できる柔軟性
- Io はI/Oのみならず 並行処理 も担い、イベントループとの親和性を確保
並行性と非同期性の違い
- async/await の導入で、I/O操作の並行実行が明示的に表現可能
- io.async で非同期タスクを生成し、 Future.await で結果取得
- 例:2ファイルへの同時書き込みを明示的に表現
- await と try を分離して利用することで、リソースリーク防止
- キャンセル機構 もサポートし、 Future.cancel で未完了タスクの解放が容易
標準ライブラリのI/O実装
- Io はランタイム多態性を持つインターフェースで、独自実装やサードパーティ製も利用可能
- 標準ライブラリには以下の実装が用意予定
- Blocking I/O :C言語同等のシンプルなシステムコールベース
- Thread Pool :OSスレッドプールによる並列I/O
- Green Threads :Linuxの io_uring 等を利用したスタックスワップ型非対応環境向け
- Stackless Coroutines :状態遷移マシンによるコルーチン、 WASM 等で有効
コード再利用性と最適性
- Zig は関数の「色付け」問題(async/blockingの分離)を回避
- io.async と Future.await を用いることで、1つのAPIで同期・非同期両対応
- 新設計ではランタイムの実行モデル(blocking/stackless coroutine等)から完全に切り離し
- Io は非ジェネリックで、 vtable によるディスパッチでコード膨張を抑制
- 最適化ビルド時は単一実装なら de-virtualize (仮想呼び出し排除)も保証
- バッファリングはリーダー/ライターインターフェースに内包し、仮想関数呼び出しの最適化を促進
セマンティックI/O操作
- Writer インターフェースに2つの新プリミティブ
- sendFile :カーネル空間内でファイル間コピーを実現(POSIX sendfile類似)
- drain :複数データセグメントを一括書き込み(writev相当)、 splat でデータの繰り返し最適化
今後のロードマップ
- これらの変更の一部は Zig 0.15.0 で導入予定
- 残りは次のリリースサイクルで順次マージ
- 標準ライブラリの大規模な書き換え・再設計が進行中
まとめ
- 新しい Ioインターフェース で、ZigのI/Oと並行処理がより柔軟かつ最適化
- async/await の復活による直感的な非同期記述とリソース管理性向上
- コード再利用性・最適性・セマンティックI/O表現の進化
- 今後のリリースに向けた着実な設計刷新