Upgrade to Pro — share decks privately, control downloads, hide ads and more …

talk about IO

usa
November 08, 2015

talk about IO

大江戸Ruby会議05 基調講演「あいおーのはなし」

usa

November 08, 2015
Tweet

More Decks by usa

Other Decks in Programming

Transcript

  1. 西暦2015年
    時に、

    View full-size slide


  2. 己 紹介

    View full-size slide

  3. なかむら(う)
    CRuby Committer
    Windows版メンテナ
    安定版(2.1,2.0.0)メンテナ

    View full-size slide

  4. なかむら(う)
    CRuby Committer
    usa
    @unak

    View full-size slide

  5. 基調講演

    View full-size slide

  6. あいおーの



    View full-size slide

  7. https:/staff.aist.go.jp/tanaka-
    akira/pub/stdio-considered-harmful-lc2005-
    paper.pdf

    View full-size slide

  8. Ruby 1.8までのI/O
    → C stdioベース
    fopen, fread, fwrite, etc…
    ファイルポインタ FILE *

    View full-size slide

  9. Ruby 1.8までのI/O
    → C stdioベース
    Ruby 1.9以降のI/O
    →POSIX I/Oベース

    View full-size slide

  10. Ruby 1.8までのI/O
    → C stdioベース
    Ruby 1.9以降のI/O
    →POSIX I/Oベース
    open, read, write, etc…
    ファイルディスクリプタ int

    View full-size slide

  11. 1. スレッドのread待ち
    2. errnoをクリアするstdio実装
    3. ungetc
    4. 双方向ストリーム
    5. 読み込み・書き込みの切替え
    6. nonblocking writeにおけるデータ消失
    7. nonblocking IO#readの動作
    8. readpartialの提案・実装
    9. Solarisの256個制限
    10.EOFフラグ

    View full-size slide

  12. Ruby m17n
    I/Oに関しては:
    • ファイルオープン時のエンコーディング
    指定
    • 入力データへのエンコーディング情報の
    付与
    • 必要時の入出力データのエンコーディン
    グ自動変換

    View full-size slide

  13. 現在のRuby I/Oのまとめ
    OS (POSIX I/O)
    Ruby class IO
    IO#read
    IO#write

    transcode
    エンコーディング変換
    各Ruby Script
    おまえら \ (^o^)/

    View full-size slide

  14. 本当に?

    View full-size slide

  15. OS (POSIX I/O)
    Portableだと
    思い込んでいた?
    いつから

    View full-size slide

  16. Rubyの
    暗黒面へ
    ようこそ

    View full-size slide








  17. という

    Sがあってな

    View full-size slide

  18. OS (POSIX I/O)
    Ruby class IO
    IO#read
    IO#write

    transcode
    エンコーディング変換
    各Ruby Script
    おまえら \ (^o^)/
    モドキ
    OS (Win32 API)

    View full-size slide

  19. Rubyインタプリタが期待する
    POSIX I/O #とは
    全てのI/Oがファイルディスクリプタで
    抽象化されていて
    大抵のAPI(システムコール)はどのI/O
    でも共通に利用できて
    どのプラットフォームでもほぼ確実に
    同じコードで利用できる

    View full-size slide

  20. Windowsにおける
    POSIX I/Oモドキの場合
    socketは完全に別扱いになっていて
    対象外
    ファイルはともかく、パイプや
    コンソールだと挙動不審な面がある
    必要な関数がいくつも欠けていて
    実用上問題がある

    View full-size slide

  21. そもそも
    Windowsに
    POSIX I/Oを
    期待する方が
    おかしい

    View full-size slide

  22. RubyのI/O

    間違っている

    View full-size slide

  23. OS (POSIX I/O)
    Ruby class IO
    IO#read
    IO#write

    transcode
    エンコーディング変換
    各Ruby Script
    おまえら \ (^o^)/
    モドキ
    OS (Win32 API)
    独自実装で代替

    View full-size slide

  24. やってられ



    View full-size slide

  25. usaは激怒した。
    必ず、かの邪智暴虐の
    RubyのI/Oを
    正さねばならぬと
    決意した。

    View full-size slide

  26. ぼくのかんがえた
    さいきょうの
    あいおー
    じっそうあん

    View full-size slide

  27. PerlのI/O実装
    Perl functions
    read,write,…
    PerlIO API
    PerlIO_read,PerlIO_write,…
    PerlIO_funcs
    PerlIOUnix_read,PerlIOUnix_write,…
    OS (POSIX I/O)

    View full-size slide

  28. PerlのI/O実装
    Perl functions
    read,write,…
    PerlIO API
    PerlIO_read,PerlIO_write,…
    PerlIO_funcs
    PerlIOWin32_read,PerlIOWin32_write,…
    OS (Win32 API)

    View full-size slide

  29. PerlIO

    すばらしい

    View full-size slide

  30. パクろう

    View full-size slide

  31. 提案
    RubyIO(仮称)の導入
    io.c内で直接OSやCライブラリのI/O関数を
    呼ぶのをやめ、RubyIO APIを呼ぶ。
    各IOオブジェクトが、そのI/O種別に応じた
    プリミティブ関数セットを保持できるように。
    テキストモードはRubyIOの階層の一つとして
    この仕組みの中で実装を用意。

    View full-size slide

  32. テキストモード


    ネイティブスレッドが導入されたとき、
    別スレッドのI/Oをキャンセルさせる必要が
    あることから、read関数を新規に再実装。
    テキストモードの実装がツラかったので、
    m17nの変換機能を利用して、改行文字の
    変換を行うようにした。
    「遅い」という理由で総スカンを食らい、
    結局、テキストモード時はPOSIX I/Oモドキのreadを
    呼ぶように……

    View full-size slide

  33. 提案するだけなら

    でもできる

    View full-size slide

  34. 実装して
    ナンボ

    View full-size slide

  35. なので、
    実装してみた
    かったけど
    間に合わず

    View full-size slide

  36. 目標
    次(2.3)の次のRuby(2.4? 3.0?)への
    導入を目指す
    2016年前半中にはtrunkに入れたい
    鋭意実装中(やる気が続くとは
    言ってない)

    View full-size slide































  37. Ruby I/O




    View full-size slide

  38. ありがとう

    View full-size slide

  39. 今度こそ本当に

    View full-size slide