Seasar Conference 2007 Autumnで、千葉先生は言語特性の動的と静的について話したらしい。私ゃ見に行かなかったけど、みんなその話はしてた。あと、 文殊堂さんのレポート を読んだ。
曰く、
ロード時までにクラス書き換えできれば十分じゃないの?
うん。Railsはね。だから、私は思っている。みんなもっと Module#freeze
を使えばいいのに。……と、リンクしようと思ったらリファレンスマニュアルに載ってないじゃん。riには載ってるけど。そりゃマイナーなわけだ。
Module#freeze
するとメソッドの追加削除ができなくなる。だから、VMはfrozen classの利用を検出したらメソッド探索をインライン展開したりとかいう最適化の余地があるんじゃなかろうか。その適切なタイミングを検出させるのは難しくてもあるいは、 GC.start
みたいに YARV::Optimization.start
というのはあり得ないだろうか。
そうしたら、サーバーサイドみたいにロード後にそれほど変わらずに長時間稼働し続けるシステムではこれを使うだろう。ま、dynamic_finder使えなくなるけど。dynamic_finderを宣言しておくと先行定義してくれるような仕組みがあれば私は使うかも。(それなんていうS2Dao)
でも、いにしえのLispの動的ぶりはこんなもんじゃなかったと聞く。稼働しているソースを動的にデバッグ & 編集したり。要は、Railsはまだまだ動的さが足りないと言うことだね。動的言語の機能を生かし切っていない。やっぱりRailsはRubyにとっては世界制覇の始まりに過ぎないのかも。
にしても、そんな夢のフレームワークが出てくるまでは、Railsは Module#freeze
して、YARVは最適化してくれればいいのに。Rubyのメソッド呼び出しを_vtblにするような最適化って、あー、YARVのバイトコードを増やさないといけないのか?
いや、_vtbl言いたかっただけ。COM大好きだから。
追記
そういえばg++は、ローカルでnewしてdeleteしてるようなケースだとオブジェクトの属するクラスが具体的に判明してるので、仮想関数呼び出しもinline展開したりしてくれたよなー。実験したバージョンは忘れたけど。そういうのと Module#freeze
を駆使すれば実はRubyではメソッド呼び出しを単なるgotoにできるケースってあるんでないかな。(あれ? gcc4.0だと駄目だ。何で実験したんだったか)
追記(2007-11-21)
See Also: 走り続けるプログラム by 瀧内さん