Da Vinci Machine

From Wikipedia, the free encyclopedia

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

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

歴史

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

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

JSR 292 (Supporting Dynamically Typed Languages on the Java Platform)[1]は、以下を提案した。

  • 新しくinvoledynamic命令をJVMレベルで追加する。これにより、動的な型チェックによりメソッドを呼び出せるようになる。[3][4][5]
  • プロダクション環境で実行時に、クラスとメソッドを動的に変更できるようにする。

JRubyJava実装の成功により、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]

関連項目

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

脚注

外部リンク

Related Articles

Wikiwand AI