Java バイトコードに invokedynamic 命令を追加?
Ruby や Python を Java VM でネイティブ(?)にサポートしようと Java のバイトコード仕様の変更の提案がなされた。
動的に型付けされた言語を JVM 上で動かすための invokedynamic 命令を追加しようという。
- 提案者の Gilad Bracha 氏の blog
- http://blogs.sun.com/roller/resources/gbracha/JAOO2005.pdf
- JSR-292 Supporting Dynamically Typed Languages on the Java Platform
私の理解としては、
- invokedynamic 命令は呼び出したいメソッド名、(オプションで)引数リスト、戻り値の型を渡す。コンパイル時やベリファイヤは型チェックしない。実行時にインスタンスにメソッドがあるかどうかをチェックして、あれば呼び出す。
- 同一名でシグネチャが異なる複数のメソッドがあり、呼び出し先を決定できない場合には(ユーザーが定義する)トラップハンドラに処理を移す。おそらく java.lang.reflect.Proxy のように呼び出し時の引数リストが渡ってくると思われる。
- invokedynamic 命令は呼び出される実際の型に合わせて引数の型変換を試みる。
いろいろ疑問が残る。