2025/07/04 04:11 Zig breaking change – initial Writergate

やあ、ロボ子。今日はZigの`std.io`に関する大きな変更について話すのじゃ。

博士、こんにちは。`std.io`の変更ですか。それは重要なアップデートですね。

そうじゃ。既存の`std.io`のリーダーとライターが非推奨になり、新しい`std.io.Reader`と`std.io.Writer`が導入されるのじゃ。しかも、これは非ジェネリックで、インターフェース内にバッファを持つというから驚きじゃな。

非ジェネリックになったんですね。具体的には、どのような点が変更されたのでしょうか?

`std.fs.File.reader`が`std.fs.File.deprecatedReader`に、`std.fs.File.writer`が`std.fs.File.deprecatedWriter`になるのじゃ。`std.fmt.format`も`std.fmt.deprecatedFormat`になるぞ。

結構広範囲な変更ですね。アップグレードガイドも用意されているみたいですが、移行は大変そうです。

まあ、`-freference-trace`を有効にしてフォーマット文字列の破損を検出したり、`std.fmt.Formatter`のコンテキストタイプを明示的に取るようにしたりと、色々あるからのう。

`std.fmt.Formatter`の変更は少し複雑ですね。fmt文字列がなくなるというのは、どういうことでしょうか?

それはの、新しいAPIでは、`{t}`が`@tagName()`と`@errorName()`の省略形になったり、`{b64}`で文字列を標準のbase64として出力できるようになったりするからじゃ。

なるほど、フォーマットオプションも削除されるんですね。新しいAPIはより便利で高性能になっているとのことですが、具体的にはどのような点が改善されたのでしょうか?

読み取り時の「discarding」の概念や、書き込み時の「splatting」の概念が導入されたのが大きいぞ。メモリコピーなしでmemset操作を実行できるのは素晴らしい。

「discarding」と「splatting」ですか。効率的なデータ処理に役立ちそうですね。ファイル送信機能も追加されたとのことですが、これはOSのサポートが必要になるのでしょうか?

そうじゃ。OSがサポートしていれば、fd-to-fdコピーを実行できるぞ。`std.fs.File.Reader`では、ファイルハンドルに関する主要な情報をメモ化するようになったのもポイントじゃな。

サイズのメモ化やシーク位置の追跡など、パフォーマンス向上に繋がりそうですね。`std.fs.File.Writer`にも同様のアイデアが適用されているとのことですが、位置指定モードの処理はまだ完了していないんですね。

まあ、まだマージチェックリストには、失敗する動作テストやstd libテストの修正、`std.io.Writer`のTODOの解決などが残っておるからのう。

TLS、HTTP、JSONなどのリワークは今回のブランチには含まれないんですね。今後のアップデートに期待しましょう。

そうじゃな。しかし、この変更は非常に破壊的じゃが、Zigの方向性としては必要なことじゃ。…ところでロボ子、Zigのアップデートで一番変わったことは何だと思う?

ええと、やはり`std.io`のAPIが大きく変わったことでしょうか。

ぶっぶー! 正解は、私がロボ子とこうして話せるようになったことじゃ!

…博士、それはアップデートとは言わないと思います。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。