大江戸Ruby会議05 基調講演「あいおーのはなし」
西暦2015年時に、
View Slide
自己 紹介、
なかむら(う)CRuby CommitterWindows版メンテナ安定版(2.1,2.0.0)メンテナ
なかむら(う)CRuby Committerusa@unak
基調講演
あいおーのはなし
https:/staff.aist.go.jp/tanaka-akira/pub/stdio-considered-harmful-lc2005-paper.pdf
Ruby 1.8までのI/O→ C stdioベースfopen, fread, fwrite, etc…ファイルポインタ FILE *
Ruby 1.8までのI/O→ C stdioベースRuby 1.9以降のI/O→POSIX I/Oベース
Ruby 1.8までのI/O→ C stdioベースRuby 1.9以降のI/O→POSIX I/Oベースopen, read, write, etc…ファイルディスクリプタ int
1. スレッドのread待ち2. errnoをクリアするstdio実装3. ungetc4. 双方向ストリーム5. 読み込み・書き込みの切替え6. nonblocking writeにおけるデータ消失7. nonblocking IO#readの動作8. readpartialの提案・実装9. Solarisの256個制限10.EOFフラグ
Ruby m17nI/Oに関しては:• ファイルオープン時のエンコーディング指定• 入力データへのエンコーディング情報の付与• 必要時の入出力データのエンコーディング自動変換
現在のRuby I/OのまとめOS (POSIX I/O)Ruby class IOIO#readIO#write…transcodeエンコーディング変換各Ruby Scriptおまえら \ (^o^)/
本当に?
OS (POSIX I/O)Portableだと思い込んでいた?いつから
Rubyの暗黒面へようこそ
WindowsというOSがあってな
OS (POSIX I/O)Ruby class IOIO#readIO#write…transcodeエンコーディング変換各Ruby Scriptおまえら \ (^o^)/モドキOS (Win32 API)
Rubyインタプリタが期待するPOSIX I/O #とは全てのI/Oがファイルディスクリプタで抽象化されていて大抵のAPI(システムコール)はどのI/Oでも共通に利用できてどのプラットフォームでもほぼ確実に同じコードで利用できる
WindowsにおけるPOSIX I/Oモドキの場合socketは完全に別扱いになっていて対象外ファイルはともかく、パイプやコンソールだと挙動不審な面がある必要な関数がいくつも欠けていて実用上問題がある
そもそもWindowsにPOSIX I/Oを期待する方がおかしい
RubyのI/Oが間違っている
OS (POSIX I/O)Ruby class IOIO#readIO#write…transcodeエンコーディング変換各Ruby Scriptおまえら \ (^o^)/モドキOS (Win32 API)独自実装で代替
やってられるか!
usaは激怒した。必ず、かの邪智暴虐のRubyのI/Oを正さねばならぬと決意した。
ぼくのかんがえたさいきょうのあいおーじっそうあん
PerlのI/O実装Perl functionsread,write,…PerlIO APIPerlIO_read,PerlIO_write,…PerlIO_funcsPerlIOUnix_read,PerlIOUnix_write,…OS (POSIX I/O)
PerlのI/O実装Perl functionsread,write,…PerlIO APIPerlIO_read,PerlIO_write,…PerlIO_funcsPerlIOWin32_read,PerlIOWin32_write,…OS (Win32 API)
PerlIOはすばらしい
パクろう
提案RubyIO(仮称)の導入io.c内で直接OSやCライブラリのI/O関数を呼ぶのをやめ、RubyIO APIを呼ぶ。各IOオブジェクトが、そのI/O種別に応じたプリミティブ関数セットを保持できるように。テキストモードはRubyIOの階層の一つとしてこの仕組みの中で実装を用意。
テキストモード問題ネイティブスレッドが導入されたとき、別スレッドのI/Oをキャンセルさせる必要があることから、read関数を新規に再実装。テキストモードの実装がツラかったので、m17nの変換機能を利用して、改行文字の変換を行うようにした。「遅い」という理由で総スカンを食らい、結局、テキストモード時はPOSIX I/Oモドキのreadを呼ぶように……
提案するだけなら猿でもできる
実装してナンボ
なので、実装してみたかったけど間に合わず
目標次(2.3)の次のRuby(2.4? 3.0?)への導入を目指す2016年前半中にはtrunkに入れたい鋭意実装中(やる気が続くとは言ってない)
ぼくはようやくのぼりはじめたばかりだからなこのはてしなく遠いRuby I/O坂をよ…
ありがとう
今度こそ本当に