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

今度こそ本当に