- SlideBoom

破壊的変更

@mono_shoo
 D言語には独自I/Oがない
› C言語のFILE*を使うしか無い
› ポインタェ
› Streamは?
 あるけどdeprecatedなんだってよ
 by Andrei
 ぶっちゃけ一つの解ではあるけど
短いモジュール名!
import std.io, std.stdio;
RAIIによる開放!
void main() {
auto fport = FilePort(“path/to/file”);
foreach (line; fport.byLine) {
writeln(line);
}
Rangeによるアクセス!
}
 独自I/Oの要件
› C言語の資産(FILE*)を使えにゃいかん
 by Walter
› まずインターフェースはRangeに…
 by Andrei
› テンプレート+構造体で…
 by 最近のPhobos
1.
FILE*との互換性はどこまでもつ?
› ノンブロッキングは?
› バッファは?
2.
バッファはどの層が持つべき?
› Handle/Buffer/Port
› Handle⊇Buffer/Port
› Handle/Buffer=Range/Port→Range
3.
Handleのインターフェース
› プリミティブなメソッド/プロパティ
 read/write/seek/end/close/…
4.
Bufferのインターフェース
› プリミティブなメソッド/プロパティ
› Handle⊇Bufferな場合
 seekは? 管理大変…
5.
Portのインターフェース
› byLine/byChunk/byPacket/…
 ノンブロッキングとは?
› 読み込みのある無しにかかわらず、
即座に処理が戻ってくるI/O
import std.stdio;
void main() {
auto src = stdin;
auto buf = new ubyte[](10);
if (fread(buf.ptr, 1, 10, src) < 10)
throw new Exception("I/O error");
}
throw が呼ばれるのはエラーの時だけ。
例)標準入出力で1文字しか入力しなかったら
もう一度入力を求める。
 何が問題?
› FILE*を使う場合、一旦読み込みすると
› 中身をいじれば出来なくもないが、
 DのI/Oにノンブロッキングを含めない
› CのFILE*は普通にHandleだのなんだの
で定義可能
› ⇒Unbufferedの問題
› ⇒Handleのインターフェースの問題
 DのI/Oでノンブロッキングは
オプションにする
› CのFILE*を使うHandleは
ノンブロッキングに出来ない
› ⇒Unbufferedの問題
› ⇒Handleのインターフェースの問題
 CのFILE*を使ってバッファ処理の
冗長性を可能な限り取り除くには?
› CのFILE*はデフォルトでバッファ有効
› Dが独自にバッファを持つと冗長な
場合がある
HandleがFILE*にデータを読み込めと命令
Port
(CStdioPort)
Buffer
Handle
FILE*
メモリ
メモリ
データ
Bufferがバッファリングしろと命令
Port
(CStdioPort)
Buffer
メモリ
Handle
FILE*
メモリ
データ
Portによるバッファからの読み込み
Port
(CStdioPort)
Buffer
Handle
FILE*
データ
メモリ
メモリ
一つにまとめたい!!!
Port
(CStdioPort)
Buffer
Handle
FILE*
メモリ
メモリ
 Buffer=Handleにすれば解決
› Handle・Bufferのインターフェース
の問題
› もちろんオプション
Port
Handle=Buffer
FILE*
メモリ