D I/O
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

D I/O

on

  • 1,113 views

D言語のI/Oのお話し

D言語のI/Oのお話し

Statistics

Views

Total Views
1,113
Views on SlideShare
1,113
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

D I/O Presentation Transcript

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