K.Sasada's Home Page

Diary - 2011 October

研究日記

神無月

_31(Mon)

Ruby 1.9.3 がリリースされました([ruby-dev:44712] [ANN] Ruby 1.9.3-p0 is out).

yugui さんをはじめ,関係者の方々は本当にお疲れ様でした&ありがとうございました.

これから,Ruby 2.0 へ加速していくことになると思います.すでに,Ruby 2.0 のリリースプランも発表されており([ruby-dev:44691] A rough release schedule for 2.0.0),議論が活発になっていくと思います.ちなみに,このプランで特筆すべきは 2012 年 8 月までに議論が収束しない仕様は,2.0 から入らない,という決定です.否応にも,新仕様について,議論が深まろうというものです.

期限を過ぎても「入れちゃえー」,というノリだった Ruby 開発陣ですが,ここはリリースマネージャに就任された遠藤さんの手腕が問われるところではないかと思います.


世の中には blog というものがあるらしいのだけど,さて何を使うのがいいのかなぁ.hatena にできるらしいサービスを待ってみる? でも hatena の id はいいの取れなかったんだよな.


2.0 でやりたいリスト.書かないと忘れちゃう.

  • VM スタックの伸張(縮小?)
  • Fiber の ensure 対応(予想以上に難しい)
  • VM スタック(とくに control frame)の刷新
    • とにかく,もっと小さく,速くしたい
    • klass を置く,けど,なんとか高速にやりたい
    • 変数の nil 初期化をやめたい(遅延したい)
    • control frame の設置を(可能なら)遅延したい(Cメソッド)
    • stack overflow のコードをもっと速くしたい
    • backtrace 作成のコスト削減(文字列生成の遅延)
  • send 命令の刷新
    • 上記 method frame 回りとの兼ね合い
    • method cache 回りをもっと賢くしたい
  • いい加減 instruction unification を有効にしたい
  • いい加減 TODO と書いてあるところをなんとかする
  • Proc#call の高速化(殆どできてるんだけどバグがあるので放置している)
  • tail call elimination の有効化? これはどうだろうなぁ
  • 簡単な escape 解析による temporary object の縮小
  • profiler の整備
    • sampling profiler
    • deterministic profiler
    • dtrace サポート(これは,仕様を決めるのが大変)
    • メモリダンプ&トレース
    • 型情報 profiling(CastOff がやってること)
    • profiling 情報の dump
  • debugger の整備
    • debugger 用 API の整備
    • ruby-debug にどこまで対応するか?
  • compiling サポート
    • JVM でいう .class,.jar の対応(gem と連携させて,起動・ロードを速くしたい)
    • それに伴って $: の拡張の話もなんとかしたい
    • JIT みたいなことができるフレームワークのサポート
    • ricsin をまともにサポートしたい
  • リテラルで生成するインスタンスのクラスを変更できるようにしたい
    • 主に,Bignum の実装を念頭において居ます.GMP 実装に簡単に切り替えられるようにしたい
  • RBasic の,Object 一般のフラグを増やしたい
  • アプリケーション組込みのサポート
    • MVM は入れないけど,せめて re-init できるようにしたい
    • 今の API はキモイのでなんとかしたい.とくに引数回り

これ1人でやるのはしんどいなぁ.これは,8 月じゃなくて 10 月くらいまでの課題だろうか.全部はできないんだろうなあ.


Ruby の仕様レベルでは,ClassLoader というか,そういうのをやりたいんだけど,これを決めるのは経験と時間が足りないから無理だろうなぁ.

load の toplevel module を無名モジュールにする(load の第2引数),ってのは前からあるわけですが,それだと monkey patch に対応できないわけです(monkey patch は original の名前空間に影響してしまう).

そこで,新しい定数空間を作って,class/module は dup してしまう(dup じゃなくて,継承的なものでもいいかもしれないが),というのはどうかと思ったわけです.で,require して定義された feature(クラス定義,メソッド定義等)は,その空間の中でしか定義されないわけです.

新しい定義は新しい定数空間でしか有効にならない,monkey patch,例えば String クラスのメソッドを書き換えても,それはその定数空間の String にしか有効にならないわけです.

定数空間は動的に切り替えることができるようにします.最初は FeatureSpace という名前で考えていたけど,NameSpace とか ConstantSpace とか,適切な名前があるような気もするんだけど,よくわからない.

とまぁ,考えてはみたのですが,あまり練れてないので,多分 8 月には間に合わないだろうし,反対意見も沢山出てくるだろうしなぁ.


これがあると,綺麗に load した feature を消せるんですよね.つまり,reload みたいな処理が綺麗に書けるわけです.

C = FeatureSpace.new{
  class Integer
    def /(o)
      Ratioanl(self, o)
    end
  end

  class C
    def foo
      1/2
    end
  end
  1/2 #=> 1/2
  C
}

C.new.foo #=> 1/2
1/2 #=> 0
FS1 = FeatureSpace.new{
  class String
    def hello
      "Hello #{self}!"
    end
  end
}

FS1.eval{
  "ko1"
}.hello #=> "Hello ko1!"
"nurse".hello #=> NoMethodError

こんな感じ.

聞きかじりの知識ですが,JVM の ClassLoader も,似たような機能だとか(型検査が厳しいので ClassLoader 間でオブジェクトが移動できないとかあったような気がするので,Ruby だともっと柔軟にできるんじゃないか,という発想).ただ,ClassLoader 自体に色々問題点もあるらしいけど私はさっぱりそれらを知らないので,それがとてもダメな点.

UTF8_StringSpace = FeatureSpace.new{
  class String
    def length
      self.force_encoding('utf8').length
    end
  end

  class Plugin1
    def self.length(str)
      str.length
    end
  end
}

str = 'あいうえお'
UTF8_StringSpace.eval{
  Plugin1.length(str) #=> normal length called
}

こういうケースでは新しい length を呼んで欲しい気がするのでダメかなあ.

あと,実装的には IMMEDIATE な値はどうしようもない気がする(新しいクラス定義を持たせられない).RVALUE な fixnum はコスト高杉だよなぁ.

うーん,ダメかな−.定数空間自体をなんか柔軟に弄る仕組みがあると面白いんじゃないかと思うんだけど.


別の設計として,FeatureSpace の中で実行する全ての挙動は,FeatureSpace で定義された定数空間でしか実行できない,ってものなんだけど,それだと FeatureSpace 間の通信が面倒というか.


バージョン違いのライブラリを,それぞれ FeatureSpace を分けてロードしてあげれば,複数のバージョンが共存できる,とかなんとか.


Module#dup に deep copy 版があればいいって話なのかもしれないなぁ.まぁ,それ以外にもリテラルどうするとか,そういう細かい話はあるが.それと,require に「これ以下でロード」機能を提供するとかあれば,色々.

_6(Thu)

今回の失敗.

  • Delta 航空を選んだこと.色々不便だった.トラブルは無かったのは,良かった.
  • そもそも,チケット手配が遅くなった.もっと早めにすればもっと安かった.
  • マイルとか何それ.
  • パスポートを洗濯しちゃった.おかげでものすごく綺麗になった.何とぞお気をつけ下さい.
  • 風邪ひいた.
  • MacBookAir はもうちょっと早めに買っても良かったかもしれない.
  • 帰国の便に乗るとき,タクシーで国内線のほうに行っちゃった.
  • お金関係のトラブルも無かったな.パスポート(現金で $180)さえなければ,さらにぴったりだった.
  • 家とかアポとか,もっと早めに行動するべきだったよなぁ.

その他,いろいろ.

_2(Sun)

RubyConf 2011 が終わり.

相変わらず,知らない人とは絡めないのは,英語のせいかと思ったけど,日本でだって絡めてないんだから,やはりこれは生来のボッチ気質なのだと思う.


Ruby 2.0 に向けて加速しだした気がする.

Sasada Koichi / ko1 at atdot dot net
$Date: 2003/04/28 10:27:51 $