engineers_blogこんにちは。ruby-coreというRuby本体の開発の議論がされているメーリングリストがあります。新機能やバグ報告などがだいたいここに集約されてくるので購読しておくとRubyの動きが分かります。間が開いてしまいましたが、最近興味深かったトピックを紹介します。VM.いま、Rubyのプロセスが立ち上がったときに初期化が走っているわけですけれども、そのあともう一回初期化しようとしてもできないという問題があります。これができずに困る代表的な例としてmod_rubyや類似のシステムがあります。なんでかというとソースコード中にさまざまなグローバル変数が綺羅星のように散りばめられているため、それらを一旦リセットするというのが難しい。してそうなったかというと、なにもかもが二十年以上前の設計だからというよりなく、設計が現代的ではない点に関しては今更しょうがないです。いうものの実需に応えられないのは問題でありまして、なんとかしたく思ってはいる。思ってはいるんだけどどうしようかな、という感じです。libraryしばらくこの連載の間が開いていたうちに標準添付ライブラリのgem化がだいぶ進んできました。マイナーなトラブルはポツポツとはありますが、一応いまのところブロッカーになるような大きなものは出ていないので、このまま行けば多くのライブラリがgemになった状態で2.5が出るかもしれませんね。libraryみなさんも日々お使いかと思うDate標準ライブラリですが、現在、実は、メンテナンスされていません。それでもさほど困らず使えているのは、もともとの完成度の高さを示しているという事はできると思います。いうものの、細かいバグなどは存在するが、放置されているし、仕様の議論などは行うべくもない状況なので、今のままだと不幸でしかないですね。そこで、どうしようかという議論になっています。argumentsキーワード引数は顕著に便利な機能なので使いたいのですが、文字列をキーとして使う、ようは普通のハッシュを渡そうとするときに、いちいち変換を(手で)書かねばならず、面倒です。その問題意識はよく理解できるのだけれど、そこでじゃあハッシュが直接渡せるようにしてほしいというこのリクエストはちょっと筋が悪かった。文字列とシンボルを同じように扱いたいかどうかはプログラマの側の意図なのであって、言語でそれを決めつけるのはやっぱりよくないわけです。キーワード引数で対処するんじゃなくて、ハッシュをうまく変換できるメソッドがあればいいんじゃないかという方向で提案してください、となりました。last)だれも大騒ぎしてなくてたぶんみんな気づいてないんだと思うんですが、バックトレースの表示順が逆になったんですよね。もとの動機はというと、(昔と違って)最近のプログラムは大規模なので、全般的に言ってスタックトレースが長いという問題があります。Railsでいうと、まずUnicornがあって、Rackがあって、その上にRailsが乗ってて、みたいな。そこで、バックトレースを表示すると、ばーっと表示されて画面から流れていくわけだけれど、あまりに長すぎて核心の部分が遥か上空にある。スクロールして戻さないといけなくて、これは不便なわけですよ。スクロールしなくても最後の方に核心部分がきてほしい。これがリクエストです。そのまま実装してしまうと、これは当然、これまでの順序で受け取ることを期待している他のアプリが動かなくなってしまうという重大な問題があり、これを回避しないといけません。もとの提案はオプションで、とあるけれど、これもNGで、他のプログラムがバックトレースを読むという前提でいうと、オプションなんて他のプログラムがコントロールできないじゃないですか。読む側としてはどっち順で流れてくるか判定不能になってしまうので、オプションはよくない。そこで、今回は他のプログラムが読んでいるかどうかの判定として「TTYかどうか」で見るようになりました。人間が読んでるときはTTYがあるだろうということですね。標準出力がTTYのときは人間がいるとみなしてこれまでと逆順、そうでなければ後方互換性の為これまで通りという挙動に変更になっています。移行期間中で、今のままだと面倒が増えただけかなー。test-unitとの相性がよくないですね。test-unitのような、自分で例外を捕捉した上できれいに整形して表示するようなものが間に入ってくると、バックトレースがどっち順に表示されているかが結局二種類あるので、目で見たときに面倒の種類が増えただけになっているのが現状という気がします。Socket.gethostbynameこれらの関数はもともとPOSIXに規定されていたものですが、近年の改定でPOSIXからは削除されました。Rubyもやめていいんじゃないかという提案です。POSIXの古いAPIを使わないようにしようというのは筋が通っているので良いかと思うのですが、とはいえRubyが外に見せるAPIが低レイヤのライブラリ関数をそのまま呼ぶ必要はないということに関しては注意が必要で、gethostbyaddrという名前でその実態はgetaddrinfoで作られているとかは可能なわけです(可能だと思う)。Rubyが外に見せるAPIとしてまでこれらを削除していくべきかに関しては、やや疑問という感じになっています。"あ"という正規表現マッチを行うことで、文字列にひらがなが含まれているか判定することはできます。なくて、何かの謎な文字列が来たときに、それに含まれてる文字が一体どういう文字かというのを、知る方法がありません。既知の文字クラスを含むかを判定できるが、文字列からその含む文字クラスを得るなどということができない。これはちょっと対称性が悪いので、今できない方の文字クラスを得る機能を付けようというのは、まあ、わからなくもない提案かと思います。Unicodeで、文字についてくるプロパティというのは、それだけじゃないわけですよ。大文字小文字の別とか、右書き左書きとか、そういうものがある。珍しいのでいうとUnicodeのどのバージョンで追加された文字かの情報とか。思うと、これは、あんまりなさそうなんですよね。やるとすればUnicodeのプロパティを取得するようなAPI、ということになるかと思うのですが。それって、やるとすればUnicodeのプロパティのテーブルを全持ちする必要があるってことですよね...対称性が、っていう理由で入れるにはあまりに巨大すぎるような...どうなんでしょうね、この機能誰が使うんでしょうか。いう名前になったのですけれど、今回入った新機能で、文字列のdedupができるようになりました。問題意識としては、プログラムによっては同じ内容の文字列が大量に出現することがある。Webアプリなら、WebクライアントからWebリクエストが飛んでくるわけですけれども、これなんかは非常に高い蓋然性で"Host:"という文字列を含んでいますね。Webリクエストオブジェクトは当然これをハンドリングすると思うんですけども、ネットワーク由来の文字列だから、これは毎回全然別のメモリ領域に同じ内容のヘッダが都度生成されてくるわけです。いうものは確かにすぐ処理が終わってゴミとして処分されるのかもしれないが、それでも既知の内容の文字列が何個も何個もメモリ上に出現しているというのは、無駄と言えるでしょう。そこで今回から文字列に単項のマイナスが付けれるようになりました。これをすると、その文字列と同じ内容の文字列がどんどん追加されてきても、-さえついてれば同じ文字列オブジェクトが返ってくるようになります。String#-@というメソッド自体は2.3からあったようですね。そこにdedupの機能が追加されている形でした。