勝手に和訳:John Rose氏によるJSR292の覚え書き

ブログhttp://blogs.sun.com/jrose/http://blogs.sun.com/jrose/entry/notes_on_an_architecture_forのエントリがありました。これはJSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform仕様作成のための覚え書きです。どんなことが書いてあるのか興味があったので勉強をかねて、勝手に翻訳してみました。
   &rqauo; http://www.servletgarden.com/blog/2008/01/06/notes-on-an-architecture-for-dynamic-invocationtranslation/です。

内容は言語屋さんにはお馴染みかもしれないのですが、この辺のところ、あまり勉強したことがなかったので、私にはともて難しくて翻訳にも時間がかかってしまいました。Googlingして用語を調べてはみたものの、誤訳や勘違いがあると思いますので、原文と照らし合わせて読んだ方がいいかもしれません。

この覚え書きでよく出てくる「callサイト(call sites)」という用語はJIT関係でよく出てくるのですが、定義らしきものは見つけられませんでした。いろいろと読んで調べてみたところ、.NET用ではありますが、Wrox Article:CLR Method Call Internals : Page 2 - Wroxの解説が一番あっているのではないかと思います。つまり、JVMの中にはcallサイトとよばれる部分が複数あり、各callサイトにはメソッドのテーブルがある。テーブルの中身はメソッド内の処理そのものということです。

あらためてJRubyソースコードを眺めてみると確かに、org.jruby.runtime.CallSiteというクラスがあります。そういえば、デバッグしているとよくこのクラスを通っていました。

なぜ、このような仕様を決める必要があるのかということについてはhttp://www.wrox.com/WileyCDA/Section/id-291454.htmlのプレゼン資料をみるとわかりやすいのではないかと思います。一つの例ですが、ダイナミックな言語(この場合、JavaScriptではないかと思います)では

class Gourmand {
    Boolean eat(Food junk);
    Boolean eat(Fish freddie);
    Boolean eat(Mint thin);
}

のような関数が定義されていて、

var f = fetchFood();
(new Gourmand()).eat(f);

のようにメソッドを実行することがあります。このようなケースでもJVMが正しく目的のメソッドを選び出す必要があるわけです。現在はダイナミックな言語の実装のなかでそれぞれに対応しているし、JVMの中まで修正できないので実装がたいへんという問題を解決しようという仕様のようです。