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