Da Vinci Machine

Da Vinci MachineあるいはMulti Language Virtual Machineとは、
サン・マイクロシステムズによるプロジェクトで、Java仮想マシン(JVM)に動的言語のサポートを
追加する拡張のプロトタイプを開発するものであった。

当時、JVM上では動的言語を実行できていたが、このプロジェクトのゴールは、
動的言語の実装を容易にし、パフォーマンスを良くすることであった。
このプロジェクトはJSR 292 (Supporting Dynamically Typed Languages on the Java Platform)のリファレンス実装であった。see JSR 292

 歴史 
150px|thumb|right
Java 7以前には、Java仮想マシンには動的型付き言語のサポートが組み込まれていなかった。

 既存のJVM命令セットは静的に型付けされている。
 JVMは既存のクラスとメソッドを動的に変更するサポートは限定的であった。当時はデバッグ環境でのみ動かせた。

JSR 292 (Supporting Dynamically Typed Languages on the Java Platform)は、以下を提案した。
 新しくinvoledynamic命令をJVMレベルで追加する。これにより、動的な型チェックによりメソッドを呼び出せるようになる。
 プロダクション環境で実行時に、クラスとメソッドを動的に変更できるようにする。

JRubyのJava実装の成功により、2008年1月の終わりにDa Vinciプロジェクトが開始された。
Da Vinciにより実験された機能は、Java 7に追加することが予定された。
このJSRのプロトタイプを作るだけでなく、他の低優先度の拡張のプロトタイプを作ることも目的だった。
最初の動くプロトタイプは、OpenJDKへのパッチとして開発され、2008年8月にアナウンスされ利用可能になった。

その後、JRubyチームは、JRubyのコードベースに動的呼び出しを組み込むのに成功した。
1.1.5のリリースに含まれており、invokedynamic機能がないJVMでは無効化されていた。

その後、プロジェクトはJDKのコードベースに統合され、
JDK 7リリースの一部となった。

 アーキテクチャー 
動的呼び出しは、Javaが言語レベルで強く静的に型付けされた言語であっても、型の情報はバイトコードレベルでは広く利用されていないという事実に基づいている。

しかし、動的言語の実装は、
パフォーマンスを良くし、実行時にスクリプトをバイトコードにコンパイルするために、
(リフレクションではなく) just-in-timeコンパイルを利用できる必要がある。

Java仮想マシンで実行できるためには、これらのバイトコードは実行の前に検証されなくてはならない。検証機構は、コードを通じて型が静的であることをチェックする。
これによりメソッド呼び出しの引数のシグネチャーの変更のたびに、異なるバイトコードを生成しなくてはならない。
これは、メモリーを多く利用するだけでなく、JVMがクラスに関する情報を保存するのに使うヒープ領域であるMetaspace (Java 8以前ではPermanent Generation)と呼ばれるメモリー領域も利用する。
この領域で利用されるメモリーは、Javaプログラムのコンテクストの変更不可能なデータを保存しているため、ほぼ全くガベージコレクションされることない。
また、これにより、動的言語の実装は、スクリプトの極一部しかコンパイルできない。

JSR 292は以下を提案する。

 既に存在するクラスを読み込み、変更して、変更されなかった部分の構造とデータを共有した新しいクラスを作る機構を提案する。これにより、Permanent Generation領域は利用されない。
 新しいinvokedynamicバイトコードを追加し、この種の呼び出しをJVMが最適化できるようにする。

 関連項目 

 動的言語ランタイム — Microsoftによる.NET Frameworkの共通言語ランタイムで動的言語をサポートするための環境
 Nashorn — Da Vinci Machineに基づく

 脚注 

 外部リンク 
Da Vinci Machineプロジェクトのページ
Lang.NET Symposiumにおけるサン・マイクロシステムズによるプレゼンテーション
プロジェクトリーダーであるJohn Rose (project leader)によるブログ
JSR 292提案文書
JSR 292に関するACM 2010のプレゼンテーション

Category:Java仮想マシン
Category:Javaプラットフォームソフトウェア
Category:Java specification requests