Da Vinci Machine
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/06/04 15:06 UTC 版)
![]() |
|
開発元 | サン・マイクロシステムズ |
---|---|
対応OS | クロスプラットフォーム |
種別 | ライブラリ |
ライセンス | GPL+リンク例外 |
公式サイト | openjdk |
Da Vinci MachineあるいはMulti Language Virtual Machineとは、 サン・マイクロシステムズによるプロジェクトで、Java仮想マシン(JVM)に動的言語のサポートを 追加する拡張のプロトタイプを開発するものであった。
当時、JVM上では動的言語を実行できていたが、このプロジェクトのゴールは、 動的言語の実装を容易にし、パフォーマンスを良くすることであった。 このプロジェクトはJSR 292 (Supporting Dynamically Typed Languages on the Java Platform)のリファレンス実装であった。[1]
歴史

Java 7以前には、Java仮想マシンには動的型付け言語のサポートが組み込まれていなかった。
JSR 292 (Supporting Dynamically Typed Languages on the Java Platform)[1]は、以下を提案した。
- 新しくinvoledynamic命令をJVMレベルで追加する。これにより、動的な型チェックによりメソッドを呼び出せるようになる。[3][4][5]
- プロダクション環境で実行時に、クラスとメソッドを動的に変更できるようにする。
JRubyのJava実装の成功により、2008年1月の終わりにDa Vinciプロジェクトが開始された。[6] Da Vinciにより実験された機能は、Java 7に追加することが予定された。 このJSRのプロトタイプを作るだけでなく、他の低優先度の拡張のプロトタイプを作ることも目的だった。[7] 最初の動くプロトタイプは、OpenJDKへのパッチとして開発され、2008年8月にアナウンスされ利用可能になった。[8][9][10]
その後、JRubyチームは、JRubyのコードベースに動的呼び出しを組み込むのに成功した。 1.1.5のリリースに含まれており、invokedynamic
機能がないJVMでは無効化されていた。[11]
その後、プロジェクトはJDKのコードベースに統合され、[12] JDK 7リリースの一部となった。
アーキテクチャー
動的呼び出しは、Javaが言語レベルで強く静的に型付けされた言語であっても、型の情報はバイトコードレベルでは広く利用されていないという事実に基づいている。
しかし、動的言語の実装は、 パフォーマンスを良くし、実行時にスクリプトをバイトコードにコンパイルするために、 (リフレクションではなく) just-in-timeコンパイルを利用できる必要がある。 [要出典] Java仮想マシンで実行できるためには、これらのバイトコードは実行の前に検証されなくてはならない。検証機構は、コードを通じて型が静的であることをチェックする。 これによりメソッド呼び出しの引数のシグネチャーの変更のたびに、異なるバイトコードを生成しなくてはならない。 これは、メモリーを多く利用するだけでなく、JVMがクラスに関する情報を保存するのに使うヒープ領域であるMetaspace (Java 8以前ではPermanent Generation)と呼ばれるメモリー領域も利用する。 この領域で利用されるメモリーは、Javaプログラムのコンテクストの変更不可能なデータを保存しているため、ほぼ全くガベージコレクションされることない。 また、これにより、動的言語の実装は、スクリプトの極一部しかコンパイルできない。[13]
JSR 292は以下を提案する。
- 既に存在するクラスを読み込み、変更して、変更されなかった部分の構造とデータを共有した新しいクラスを作る機構を提案する。これにより、Permanent Generation領域は利用されない。
- 新しい
invokedynamic
バイトコードを追加し、この種の呼び出しをJVMが最適化できるようにする。[3]
関連項目
脚注
- ^ a b see JSR 292
- ^ Nutter, Charles (2007年1月3日). “InvokeDynamic: Actually Useful?”. 2008年2月6日閲覧。
- ^ a b Ed Ort (2009年7月). “New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine”. 2009年7月26日閲覧。
- ^ Jeff Friesen (2014年12月16日). “How To Invokedynamic”. JavaWorld. 2020年6月10日閲覧。
- ^ Rafael Winterhalter (2015年3月2日). “Dismantling invokedynamic”. dzone.com. 2020年6月10日閲覧。
- ^ Krill, Paul (2008年1月31日). “Sun's Da Vinci Machine broadens JVM coverage”. 2009年3月28日時点のオリジナルよりアーカイブ。2008年2月6日閲覧。
- ^ “Sub-Projects and Investigations”. Sun Microsystems (2007年). 2008年2月6日閲覧。
- ^ Rose, John (2008年8月26日). “Happy International Invokedynamic Day!”. 2008年9月3日時点のオリジナルよりアーカイブ。2008年9月3日閲覧。
- ^ Rose, John (2008年9月2日). “Happy International Invokedynamic Day!”. 2008年9月7日閲覧。
- ^ Lorimer, R.J. (2008年9月1日). “Dynamic Invocation Runs on OpenJDK”. infoq.com. 2008年9月3日閲覧。
- ^ Nutter, Charles (2008年9月11日). “A First Taste of InvokeDynamic”. 2008年9月13日閲覧。 “I managed to successfully wire InvokeDynamic directly into JRuby's dispatch process! Such excitement! The code is already in JRuby's trunk, and will ship with JRuby 1.1.5 (though it obviously will be disabled on JVMs without InvokeDynamic).”
- ^ Rose, John (2009年4月22日). “progress: indy.patch -> JDK7”. 2009年4月30日閲覧。 “The majority of indy.patch has entered the JDK7 VM at my workgroup's integration repo, today at about 4:00AM PDT:”
- ^ Nutter, Charles (2008年9月11日). “A First Taste of InvokeDynamic”. 2008年2月6日閲覧。 “The dirty secret of several JVM implementations, Hotspot included, is that there's a separate heap (or a separate generation of the heap) used for special types of data like class definitions, class metadata, and sometimes bytecode or JITted native code. And it couldn't have a scarier name: The Permanent Generation. Except in rare cases, objects loaded into the PermGen are never garbage collected (because they're supposed to be permanent, get it?) and if not used very, very carefully, it will fill up(...)”
外部リンク
- Da Vinci Machineのページへのリンク