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 Slide


  2. 己 紹介

    View Slide

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

    View Slide

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

    View Slide

  5. View Slide

  6. 基調講演

    View Slide

  7. あいおーの



    View Slide

  8. View Slide

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

    View Slide

  10. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

  17. 本当に?

    View Slide

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

    View Slide

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

    View Slide








  20. という

    Sがあってな

    View Slide

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. RubyのI/O

    間違っている

    View Slide

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

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

    View Slide

  27. やってられ



    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  32. PerlIO

    すばらしい

    View Slide

  33. パクろう

    View Slide

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

    View Slide

  35. テキストモード


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

    View Slide

  36. 提案するだけなら

    でもできる

    View Slide

  37. 実装して
    ナンボ

    View Slide

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

    View Slide

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

    View Slide































  40. Ruby I/O




    View Slide

  41. ありがとう

    View Slide

  42. 今度こそ本当に

    View Slide