RHGの逆襲
まず、私が質問したことだけまとめとく。
- YARV Bytecodeをロードする話
- 問題は二点:互換性と安全性
安全性について。
Rubyプログラムをちょこちょこっと書き換えても、安全性は損なわれることはない。ここでいう安全性とは、処理系が実行中に未定義の状態にならない、という程度の意味。卑近な表現をすれば、SEGVが起きないと言うこと。これは、Rubyの処理系によって(直感的には)保証されている(し、そうなるべく開発者は努力していることが、自然に期待される)。
一方、YARVのバイトコードを書き換えたときには、「なにが起きるかわからない」。未定義の状態になって、SEGVするかもしれないし、未定義の状態というのは計算機が突然壊れても文句を言えないということ。JavaのクラスローダにはVerifierがあって、安全だと確認できないクラスファイルはロードできないようになっている。
Verifierは、どういう性質を検査しなくてはいけないのか。それは難しいのか。
そのモチベーションがよくわからない。エンタープライズな分野で、安全性が保証されなくなる可能性がある操作を許されるものなのかどうか。
- インライン展開の話
- bindingへの操作とかが入ると、わけわからなくなる
- evalもそう
evalはともかく、bindingへの操作はちゃんとフロー解析すれば追えるはず。ただし、フロー解析には時間がかかるので、AHTでやっておかないといけない。
もっと簡単に、JITでインライン展開することもできる。インライン展開だけを考えた場合には、x86とかの機械語にコンパイルする必要はなくて、YARVのバイトコードへインライン展開することもできるんじゃないだろうか。その場合、高速化できるかどうかは、私にはちょっと判断がつかないけど。
- 型推論で速くなるか
ならないと思う。型推論よりも、フロー解析のほうが良いと思う。
私の型推論でわかる情報は、どのメソッドが呼び出されているかということ。事前にそれがわかっていれば、SML#のような(Dictionary passingのような)最適化はできるけど。YARVのボトルネックは、たぶんそこじゃないと思う(私の意見)。それに、はっきり型がわかるプログラムは多くないため、ランタイムの型チェックを省略できる場合は少なくて、そうするとあんまり速くならないような気がする。