O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

D I/O

1.269 visualizações

Publicada em

D言語のI/Oのお話し

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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 />

×