概要
- Zigの std.ioリーダー/ライターAPI が大幅に刷新
- 非ジェネリック化 と バッファ位置の変更 による最適化
- フォーマット印刷やAPI呼び出しに 破壊的変更
- 旧APIは非推奨、新APIへの適応方法も案内
- 今後も段階的に関連変更を 順次マージ予定
Zig 標準I/Oリーダー・ライターAPI大刷新の概要
- 既存の std.ioリーダー/ライター全廃止、新しい std.io.Reader/Writer へ統一
- 非ジェネリック型 採用、バッファを インターフェース側 に配置
- 最適化の透明性 確保、バッファ操作はホットパスで直接処理
- vtable呼び出し はバッファが一杯の時のみ発生
- 破壊的変更 となるため、移行には注意が必要
主なAPI変更点と移行ガイド
- フォーマット関連のAPIが 大幅変更、既存コードは -freference-trace で修正箇所特定推奨
- 主なリネーム例
- std.fs.File.reader → std.fs.File.deprecatedReader
- std.fs.File.writer → std.fs.File.deprecatedWriter
- std.fmt.format → std.fmt.deprecatedFormat
- std.fmt.fmtSliceEscapeLower/Upper → std.ascii.hexEscape
- std.fmt.fmtSliceHexLower/Upper → {x}/{X}
- std.fmt.fmtIntSizeDec/Bin → {B}/{Bi}
- std.fmt.fmtDuration/DurationSigned → {D}
- フォーマットメソッドのシグネチャ変更
- *anytype → std.io.Writer
- FormatOptions削除
- std.fmt.Formatter は コンテキスト型を明示的に
- 旧APIは非推奨 (削除はまだ)
- GenericReader/Writer, AnyReader/Writer → Reader/Writer
- adaptToNewApi() による旧APIから新APIへの アダプタ利用例 あり
新APIの特徴と利点
- 便利な新API を多数追加、パフォーマンス向上、非ジェネリック化
- デリミタまでの読み込み が簡単に
- 他言語にはない独自概念
- discard (読み込み時の無視):不要データの効率的スキップ
- splat (書き込み時のmemset的操作):O(M*N)→O(M)の効率化
- ファイル送信 :OSがサポートすればfd-to-fdコピー可能
- バッファ管理 :ユーザー側でバッファ提供、必要サイズは実装が決定
std.fs.File.Reader/Writerの新機能
- Reader :ファイルハンドルに関する情報の メモ化
- statによるサイズやエラー
- 現在のシーク位置
- シーク時のエラー
- 位置指定/ストリーミング読み込み の判定
- fd-to-fdシステムコール 利用可否
- Writer :書き込み時にも同様のメモ化
今回の変更に含まれない内容
- I/O as an Interface や Async/Await復活 は含まず
- 以下のリワークや削除も未着手
- tls, http, json, zon, zstd, flate, zip, パッケージ取得
- fifo.LinearFifo削除
- 非推奨APIの完全削除
- これらは 別ブランチで順次PR予定
今後のマージ計画とTODO
- テスト失敗の修正
- std libのテスト修正
- std.io.WriterのTODO解決
- std.fs.File.Writerの実装完了 (特に位置指定モード対応)
- count: usizeとcount: u64の扱い検討
- manifestのキャッシュ処理の互換性確認
まとめと今後の展望
- 大規模なAPI刷新 により、ZigのI/Oはより 最適化・便利化
- 既存コードの修正は必須、移行ガイドを参考に対応推奨
- 今後も 段階的な変更 を予定、開発者は継続的なキャッチアップが重要