BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース OpenJDKでのInvokeDynamicに関する最新情報

OpenJDKでのInvokeDynamicに関する最新情報

原文(投稿日:2011/01/12)へのリンク

クリスマスの直前にOpenJDKのビルドにJSR 292 APIの更新版が含まれるようになった。これは、まだ最終版になっていないが、JSRがどのように形作られていくかを上手く示してくれている。詳しくない人のために説明すると、JSR 292は新しいバイトコード命令であるinvokedynamicを追加している。これは静的な型の情報がない状態でのメソッドの実行をサポートするもので、InfoQでも以前、解説を行っている

John Rose氏のブログで変更の主要な点がまとめられている。その中のいくつかは次のようなものだ。

  1. CallSiteクラスは、次の3つの抽象サブクラスに分割された。 MutableCallSite、ConstantCallSite、VolatileCallSiteだ。
  2. java.dyn.Linkageクラスは非推奨となり、最終ドラフトでは除かれる予定だ。
  3. java.dyn.JavaMethodHandleクラスは取り除かれた。Rose氏のブログによると「Lookup.findVirtual(private static finalにキャッシュされている)を使って、MethodHandle.bindToで任意のオブジェクトをメソッドハンドルに変換する。MethodHandles.asInstanceを使って、メソッドハンドルを任意のSAMインターフェースに変換する」とのことだ。

APIのいくつかの分野は、暫定的な状態であり変更もあり得る。その中には、MethodHandles.AsInstanceObjectインターフェースも含まれる。このインターフェースはアプリケーションが、無限の委譲チェーンを作成するリスクなしで、繰り返しメソッドハンドルとSAMオブジェクトを変換する仕組みを提供する。加えて、JSR 292を有効化する現時点でのJVMオプション(XX:+UnlockExperimentalVMOptions, -XX:+EnableInvokeDynamic, and -XX:+EnableMethodHandles)は近い将来にデフォルトとなる。

残念ながら、JDK 7にはinvokedynamic命令を実行するためのJava言語での文法のサポートは含まれていない。これらは、Project Lambdaの一部としてJDK 8のタイミングで導入される予定だ(Java lambdaの実装プランは、JSR 292で導入された機能のいくつかを利用しており、その中にはメソッドハンドルや動的実行が含まれている)。しかしながら、しばらくの間は、Rose氏は、indifyという名前の小さなクラス変換の仕組みを用意し、これによってinvokedynamic命令を生成し、MethodHandleおよびMethodType定数のために「ldc」命令を生成する。Rémi Forax氏も、DynamicIndyという名前の小さなクラスを開発するなかで、同様の問題に取り組んでいる。Forax氏が説明するところによると、このクラスは、Javaのバイトコード操作のためのライブラリASM 4.0 (まだリリースされていない)を利用して、invokedynamicを呼び出す静的メソッドを生成している。この静的メソッドは、Javaの中で呼び出されるMethodHandleに変換される。

JSR 292は、主に動的言語の要望に焦点を当てているが、JavaそのものがこのAPIのユーザになることが上で述べたように明らかになった。この観点から述べると、java.dynパッケージという名称は変更されるべきであろう。Brian Goetz氏とMark Reinhold氏は、これをjava.lang.mh (mhはMethodHandleの略)に変更するように提案している。しかし、その他の提案も歓迎だし、Rémi Forax氏のブログに提案を行うこともできる。

この記事に星をつける

おすすめ度
スタイル

BT