talk about IO

8cbb39dadafaf2287a83a13ee4981ec9?s=47 usa
November 08, 2015

talk about IO

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

8cbb39dadafaf2287a83a13ee4981ec9?s=128

usa

November 08, 2015
Tweet

Transcript

  1. 西暦2015年 時に、

  2. 自 己 紹介 、

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

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

  5. None
  6. 基調講演

  7. あいおーの は な し

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

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

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

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

    read, write, etc… ファイルディスクリプタ int
  14. 1. スレッドのread待ち 2. errnoをクリアするstdio実装 3. ungetc 4. 双方向ストリーム 5. 読み込み・書き込みの切替え

    6. nonblocking writeにおけるデータ消失 7. nonblocking IO#readの動作 8. readpartialの提案・実装 9. Solarisの256個制限 10.EOFフラグ
  15. Ruby m17n I/Oに関しては: • ファイルオープン時のエンコーディング 指定 • 入力データへのエンコーディング情報の 付与 •

    必要時の入出力データのエンコーディン グ自動変換
  16. 現在のRuby I/Oのまとめ OS (POSIX I/O) Ruby class IO IO#read IO#write

    … transcode エンコーディング変換 各Ruby Script おまえら \ (^o^)/
  17. 本当に?

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

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

  20. W i n d o w s という O Sがあってな

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

    エンコーディング変換 各Ruby Script おまえら \ (^o^)/ モドキ OS (Win32 API)
  22. Rubyインタプリタが期待する POSIX I/O #とは 全てのI/Oがファイルディスクリプタで 抽象化されていて 大抵のAPI(システムコール)はどのI/O でも共通に利用できて どのプラットフォームでもほぼ確実に 同じコードで利用できる

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

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

  25. RubyのI/O が 間違っている

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

    エンコーディング変換 各Ruby Script おまえら \ (^o^)/ モドキ OS (Win32 API) 独自実装で代替
  27. やってられ る か !

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

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

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

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

    (Win32 API)
  32. PerlIO は すばらしい

  33. パクろう

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

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

    結局、テキストモード時はPOSIX I/Oモドキのreadを 呼ぶように……
  36. 提案するだけなら 猿 でもできる

  37. 実装して ナンボ

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

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

  40. ぼ く は よ う や く の ぼ り

    は じ め た ば か り だ か ら な こ の は て し な く 遠 い Ruby I/O 坂 を よ …
  41. ありがとう

  42. 今度こそ本当に