BT

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

| 作者: Charles Humble フォローする 904 人のフォロワー , 翻訳者 能仁 信亮 フォローする 0 人のフォロワー 投稿日 2011年1月16日. 推定読書時間: 3 分 |

原文(投稿日: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氏のブログに提案を行うこともできる。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT