D言語でI/O<br />~I/Oの新次元~<br />@mono_shoo<br />破壊的変更<br />
はじめに<br />D言語には独自I/Oがない<br />C言語のFILE*を使うしか無い<br />ポインタェ<br />Streamは?<br />あるけどdeprecatedなんだってよ<br />by Andrei<br />ぶっちゃけ...
イメージ<br />import std.io, std.stdio;<br />void main() {<br />autofport = FilePort(“path/to/file”);<br />foreach (line; fpor...
難しい点<br />独自I/Oの要件<br />C言語の資産(FILE*)を使えにゃいかん<br />by Walter<br />まずインターフェースはRangeに…<br />by Andrei<br />テンプレート+構造体で…<br /...
何が問題? (1)<br />FILE*との互換性はどこまでもつ?<br />ノンブロッキングは?<br />バッファは?<br />バッファはどの層が持つべき?<br />Handle/Buffer/Port<br />Handle⊇Buff...
何が問題? (2)<br />Handleのインターフェース<br />プリミティブなメソッド/プロパティ<br />read/write/seek/end/close/…<br />Bufferのインターフェース<br />プリミティブなメソ...
1.FILE*との互換性(ノンブロッキング)<br />ノンブロッキングとは?<br />読み込みのある無しにかかわらず、即座に処理が戻ってくるI/O<br />
具体的なコード<br />importstd.stdio;<br />void main() {autosrc = stdin;autobuf = newubyte[](10);if (fread(buf.ptr, 1, 10, src) < ...
ノンブロッキングの問題点<br />何が問題?<br />FILE*を使う場合、一旦読み込みすると改行コードが現れるまで処理が戻らない!<br />中身をいじれば出来なくもないが、中身をいじれない処理系がある!<br />DのI/Oをデフォルト...
どうやって解決する?<br />DのI/Oにノンブロッキングを含めない<br />CのFILE*は普通にHandleだのなんだので定義可能<br />⇒Unbufferedの問題<br />⇒Handleのインターフェースの問題<br />Dの...
バッファの問題<br />CのFILE*を使ってバッファ処理の冗長性を可能な限り取り除くには?<br />CのFILE*はデフォルトでバッファ有効<br />Dが独自にバッファを持つと冗長な場合がある<br />
何が問題?<br />HandleがFILE*にデータを読み込めと命令<br />Buffer<br />Port(CStdioPort)<br />メモリ<br />Handle<br />FILE*<br />メモリ<br />メモリ<br...
何が問題?<br />Bufferがバッファリングしろと命令<br />Buffer<br />Port(CStdioPort)<br />メモリ<br />Handle<br />FILE*<br />データ<br />メモリ<br />メモ...
何が問題?<br />Portによるバッファからの読み込み<br />Buffer<br />Port(CStdioPort)<br />メモリ<br />Handle<br />FILE*<br />データ<br />メモリ<br />メモリ...
冗長!<br />一つにまとめたい!!!<br />Buffer<br />Port(CStdioPort)<br />メモリ<br />Handle<br />FILE*<br />メモリ<br />
どうやって解決する?<br />Buffer=Handleにすれば解決<br />Handle・Bufferのインターフェースの問題<br />もちろんオプション<br />Port<br />Handle=Buffer<br />FILE*<...
Upcoming SlideShare
Loading in …5
×

D I/O

1,059 views
1,012 views

Published on

D言語のI/Oのお話し

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,059
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

D I/O

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

×