例えば、POSIXにおけるread(2)は次の通りの宣言になってる。
int read(int fd, void *buf, int len);
非負整数が返る場合は読み込めたバイト数を表し、エラーの場合はマイナス1が返るとされてる。
しかし本当のカーネル呼びのコールだったらマイナス1に限らず色んな負の値で具体的なエラーを表すもんだという記述を見つけることができた。
これに対し、Zigの@import("std").io.AnyReader.read()は次のとおりである。
pub fn read(self: Self, buffer: []u8) anyerror!usize {
return self.readFn(self.context, buffer);
}
もしもこのコードがコンパイルされたら多分bufferの引数の次にbuffer.lenが続くんだろうなという感じのアセンブリにはなりそうである。
よって、Zigの標準ライブラリの設計はシステムコールのデザインに似てて面白いと思った。