JP2013514569A - 静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新の方法、コンピュータ・プログラム製品、およびシステム - Google Patents
静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新の方法、コンピュータ・プログラム製品、およびシステム Download PDFInfo
- Publication number
- JP2013514569A JP2013514569A JP2012543561A JP2012543561A JP2013514569A JP 2013514569 A JP2013514569 A JP 2013514569A JP 2012543561 A JP2012543561 A JP 2012543561A JP 2012543561 A JP2012543561 A JP 2012543561A JP 2013514569 A JP2013514569 A JP 2013514569A
- Authority
- JP
- Japan
- Prior art keywords
- class
- bytecode
- version
- surrogate
- field
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/656—Updates while running
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本発明の下で、アクティブに動作するコンピュータ・システム内の仮想マシン上でバイトコードとして実行する静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新の方法、コンピュータ・プログラム製品、およびシステムが提供される。既存の1つまたは複数のモジュール(バイトコード表現の形でのアプリケーション・リソースおよびクラス定義の識別可能なコレクション)からインスタンス化されたオブジェクトのセットは、アクティブに動作するコンピュータ・システム内の仮想マシン上での実行の準備ができている。アクティブに動作する仮想マシンに既にロードされたモジュールに対応する1つまたは複数のモジュールの新しいバージョンが、動作中のソフトウェアを更新するために仮想マシンに動的にロードされる。ロードされたモジュール内のクラス定義は、あるクラスの以前のバージョンのオブジェクトと新しいバージョンのオブジェクトとの間の透過的状態転送および共有されるオブジェクト・アイデンティティを可能にするバイトコードを挿入することによって、動的更新のために準備される。ソフトウェア更新の場合に、更新されるクラスの以前のバージョンからインスタンス化されたオブジェクトは、その将来の対応するオブジェクトへリダイレクトする潜在能力を有する未初期化サロゲートオブジェクトになる。対応するオブジェクトは、宣言するクラス・メンバの最初のアクセス時にレイジイに作成される。オブジェクトおよびクラスの挙動のレイジイ・リダイレクションに加えて、ノンブロッキング動的更新が、レイジイ移植によって達成される。
Description
本発明は、コンピュータ・システム上でアクティブに動作しているソフトウェアのプログラミング・コードを、再始動またはソフトウェアのランタイム状態を失わせることを必要とせずに、現在のバージョンから新しいバージョンに動的に更新することに関する。より具体的には、本発明は、言語のコンパイラが、JAVA(登録商標)プログラミング言語で記述されたソフトウェアによって実施されるように動的にロードされ仮想マシン上で実行されるバイトコード・ベースのクラス定義の形の実行可能オブジェクト・コードを作る、静的に型付けされたクラスベースのオブジェクト指向プログラミング言語で記述されたアクティブに動作しているソフトウェアの状態と機能性との両方を動的に更新することを可能にすることに関する。本発明を用いると、アクティブに動作しているソフトウェア・システムは、動的更新工程の結果としてソフトウェアのプログラミング・コードに対する変更が即座に実現されるので、これらの変更が行われる前の標準的な停止、再展開、および再始動方式を経験する必要がもはやなくなる。
多数の重要なアプリケーションのために非常に信頼性のあるコンピュータ・システム上で動作する高可用性コンピュータ・アプリケーションが存在する。これらのシステムおよびプログラムは、通常、毎日24時間、毎週7日間動作し、処理への割込みは、顧客サービスおよびいくつかの状況で安全性に関する深刻な影響を有するおそれがある。たとえば、インターネットおよびワールド・ワイド・ウェブを介する電子商取引の出現は、eコマース・ウェブサイトが取引を処理するために常に使用可能であることを必要とする。他の例は、クレジット・カード取引処理アプリケーション、航空交通管制アプリケーションなどを含む。
そのようなミッション・クリティカル・アプリケーション用のソフトウェアは、開発環境上で「オフラインで」機能強化されるので、そのような機能強化されたソフトウェアを生産環境に「オンラインで」展開しまたはリフレッシュすることが必要になる。そのような機能強化を展開する、前の形は、状態データを保存し、シャットダウンするかクリティカル・アプリケーションの可用性を他の形で損ない、新しいソフトウェアをインストールし、アプリケーションを再始動するか他の形で完全に使用可能にし、その後、ソフトウェアの前の状態を復元することを必要とした。この点で、アプリケーションは、既存のデータを用いて機能強化されたコードを実行しているはずである。
システムのシャットダウンまたは、システムの手動静止などの他の性能に影響するイベントによって、サービスは途絶される。サービス途絶を避けるために、ソフトウェア更新は、しばしば、セキュリティおよび安全性を危険にさらすリスクを伴って、できる限り遅延される。したがって、システムのシャットダウンまたは割込みを必要とせずに、アクティブに動作しているシステム内のソフトウェアの1つまたは複数のモジュールに変更(機能強化および/または保守)を適用する必要が存在する。さらに、アクティブに動作しているシステム内でそのようなモジュールを追加しまたは削除する必要が存在する。
増加する種類のミッション・クリティカル・アプリケーションが、静的に型付けされたクラスベースのオブジェクト指向プログラミング言語で記述されるので、そのようなアプリケーションの個々のモジュール内でクラスを動的に更新するという特定の課題に対処する必要がある。
動作中のシステム上で、静的に型付けされたクラスベースのオブジェクト指向プログラミング言語で記述されたモジュールを更新する時には、更新は、変更されるクラスの前のインスタンスから状態情報を保存し、これらのクラスの新しいインスタンスにこの情報を提供する必要がある。さらに、クラスのセットの更新が原子的に行われることを保証する必要が存在する。というのは、そうでなければ、更新が、クラスの以前のバージョンと新しいバージョンとの型の変化に起因するバイナリ非互換性を引き起こす可能性があり、これが、ランタイム障害を引き起こし、システム全体を停止させるからである。
広く受け入れられた静的に型付けされたクラスベースのオブジェクト指向プログラミング言語JAVA(登録商標)は、ドミトリーブ(Dmitriev)の提案したクラス再ロード機能の実装[5](非特許文献1)を介する、クラスの動的再定義のあるサポートを有する。再定義は、メソッド本体、定数プール、および属性のプログラミング・コードを変更することができる。しかし、クラス再定義は、フィールドもしくはメソッドの追加、除去、もしくは名前の変更、メソッドのシグネチャの変更、修飾子の変更、または継承階層の変更を行ってはならない。これらの制限は、あるクラスの後続バージョンの間のバイナリ非互換性問題を避けるために課せられる。実際には、これらの制限は、JAVA(登録商標)での現在のクラス再定義能力を、大規模で寿命の長いミッション・クリティカル・アプリケーションに必要なほとんどの動的更新をサポートするのに不適切なものにする。
[6](非特許文献2)で、マラバーバ(Malabarba)らは、新しい動的クラスローダを有する変更されたJAVA(登録商標)仮想マシンに基づいて、アクティブに動作しているソフトウェア内に現在存在する他のクラスが変更されるクラスの一部に依存しない限り、Javaクラスに対するすべての変更を可能にする方法Dynamic Java Classesを開示している。更新されるクラスにこれらの制限を課すことによって、この方法は、動的に型安全になる。たとえば、他のクラスがあるフィールドまたはメソッドに依存しない場合に、そのフィールドまたはメソッドを除去してもよい。同様に、あるクラスの型に対する変更が、そのクラスに依存するクラスの型違反を引き起こさない限り、その変更を行うことができる。この新しい動的クラスローダは、型違反を引き起こすクラスの過渡的ロードをサポートしないので、この方法は、一時に単一のクラスの動的更新に制限され、これは、非トリビアルなソフトウェア更新について変更スコープを制限するためものである。さらに、この方法は、競争状態が発生するのを防ぐために、マルチスレッド・アプリケーションのクラスを更新する間に、すべてのアクティブ・スレッドをブロックしなければならない。このスレッドのブロックは、ソフトウェア更新が行われる時のアプリケーション実行における望ましくない動揺を引き起こす。
[7](非特許文献3)で、スブラマニアン(Subramanian)らは、変更されたJAVA(登録商標)仮想マシンに基づいて、開発者がクラス階層内のどこにでもフィールドおよびメソッドを追加し、削除し、置換することを可能にする方法JVOLVEを開示している。JVOLVEは、VMクラスローディング、ジャストインタイム・コンパイル、スケジューリング、リターン・バリア(return barrier)、オンスタック置換、およびガーベジ・コレクションに追加し、調整することによってこれらの更新を実装する。新しいフィールドを初期化し、既存フィールドを更新するために、JVOLVEは、クラス・トランスフォーマ関数およびオブジェクト・トランスフォーマ関数を適用し、前者はスタティック・フィールド用であり、後者はオブジェクト・インスタンス・フィールド用である。クラス・トランスフォーマ関数およびオブジェクト・トランスフォーマ関数は、いわゆる更新準備ツール(Update Preparation Tool)によって更新ごとに準備され、この更新準備ツールは、更新されるクラスの以前のバージョンと新しいバージョンとの間の差を調べる。JVOLVEは、ガーベジ・コレクション(GC)およびスレッド・スケジューリングを実行して安全であるVMセーフ・
ポイントで、実行中のスレッドを停止させる。JVOLVEは、ガーベジ・コレクタおよびJITコンパイラを利用して、変更されるクラスに関連するコードおよびデータを更新する。JVOLVEは、ヒープ全体のGCを開始して、更新されるクラスの既存オブジェクト・インスタンスを見つけ、提供されるオブジェクト・トランスフォーマを使用して新しいバージョンを初期化する。JVOLVEは、すべての変更されるメソッド実装について、既存のコンパイル済みコードを無効化し、新しいバイトコードをインストールする。アプリケーションが実行を再開する時に、これらのメソッドは、次に呼び出される時にJITコンパイルされる。JVolveは、更新を行える前に、ソフトウェアが静止の状態に達することを必要とする、すなわち、すべてのアプリケーション・スレッドが、VMセーフ・ポイントで停止されなければならない。更新工程は、ヒープ全体のガーベジ・コレクションの持続時間中にアプリケーションが一時停止することを要求するstop−the−worldガーベジ・コレクションベースの手法を使用する。VMセーフ・ポイントでのアプリケーション・スレッドのこの同期化されたブロックは、予測不能な時間期間にわたるサービス途絶を引き起こす。
ポイントで、実行中のスレッドを停止させる。JVOLVEは、ガーベジ・コレクタおよびJITコンパイラを利用して、変更されるクラスに関連するコードおよびデータを更新する。JVOLVEは、ヒープ全体のGCを開始して、更新されるクラスの既存オブジェクト・インスタンスを見つけ、提供されるオブジェクト・トランスフォーマを使用して新しいバージョンを初期化する。JVOLVEは、すべての変更されるメソッド実装について、既存のコンパイル済みコードを無効化し、新しいバイトコードをインストールする。アプリケーションが実行を再開する時に、これらのメソッドは、次に呼び出される時にJITコンパイルされる。JVolveは、更新を行える前に、ソフトウェアが静止の状態に達することを必要とする、すなわち、すべてのアプリケーション・スレッドが、VMセーフ・ポイントで停止されなければならない。更新工程は、ヒープ全体のガーベジ・コレクションの持続時間中にアプリケーションが一時停止することを要求するstop−the−worldガーベジ・コレクションベースの手法を使用する。VMセーフ・ポイントでのアプリケーション・スレッドのこの同期化されたブロックは、予測不能な時間期間にわたるサービス途絶を引き起こす。
[8](非特許文献4)で、グスタフソン(Gustavson)は、プログラムが動作している間にクラスを更新する能力を用いてJAVA(登録商標)仮想マシンを拡張する方法JDrumsを開示している。動作中のプログラム内の事前に存在するインスタンスを有するクラスを更新するために、JDrumsは、すべてのそのようなオブジェクトを、更新仕様に従って新しいクラスのオブジェクトに変換する。更新仕様は、更新を開始する時に、更新されるクラスと一緒に提供されなければならない。同様に、更新されるクラスのスタティック・データについて更新仕様を指定することが可能である。更新仕様は、JAVA(登録商標)ソースコード内で、更新されるクラスごとに1つのいわゆるCONVERSION CLASS内で定義される。conversion classは、変換をどのように実行しなければならないのかを定義するメソッドを含む。JDrumsは、クラスの継承階層の動的変更をサポートしない。
[3](非特許文献5)で、オルソ(Orso)らは、オブジェクト・ラッパを介するインダイレクションを使用するホットスワップ技法に基づいて、動作中のJAVA(登録商標)アプリケーションからのクラスの置換、追加、および除去を可能にする方法DUSC(Dynamic Updating through Swapping of Classes)を開示している。DUSCは、まず、オブジェクト・ラッパを導入するためにクラス・リネーミングおよびコード書換を適用し、その後、ランタイムにクラスをスワップすることによるクラス更新を実行することによって、動的更新を可能にする。この方法は、アプリケーション・プログラミングに複数の制限を課す、すなわち、アプリケーション内のクラスは、更新されるクラスのpublicフィールドまたはprotectedフィールドに直接にアクセスすることを許可されず、リフレクションは、更新されるクラスのどれにもおよび更新されるクラスのコンポーネントのどれにも適用されず(リフレクションの形として、java.lang.Classのメソッドなど、特定のクラスに関する情報を点検するすべてのメソッドをも含む)、更新されるクラスの新しいバージョンは、そのクラスの前のバージョンによって提供されるものと同一のインターフェースを提供し、更新されるクラスは、ネイティブ・メソッドを含んではならず、更新されるクラスのメソッドは、更新中に実行されていない(すなわち、そのクラスのメソッドは、スタック上にない)。開発者は、DUSCを使用して動的に更新可能なアプリケーションをプログラムする時に、これらの制限のすべてを考慮に入れなければならない。
[9](非特許文献6)で、ビアレク(Bialek)らは、JAVA(登録商標)アプリケーションのパーティショニングに基づく、これらのパーティションを更新可能ユニットにする方法を開示している。アプリケーションのパーティションは、パーティションが含むクラスをカプセル化し、明示的な提供されるインターフェースおよび要求されるイ
ンターフェースを有し、パーティションをコンポーネントに似たものにする。新しいパーティションの実装の提供されるインターフェースは、少なくとも、更新が拒否されない場合に、前のバージョンの提供されるインターフェースを含まなければならない。したがって、この方法は、提供されるインターフェースからのパブリック・メンバの除去をサポートしない。パーティショニングに関する情報は、開発者によって提供されることまたはソースコードから自動的に抽出されることのいずれかとすることができる。開示される方法は、バージョン・アダプタを使用することによってメソッド、フィールド、およびコンストラクタを追加し、メソッド署名を変更することを可能にする。各パーティションは、状態転送関数を提供する。パーティションの状態転送関数は、古いパーティションのオブジェクトの状態の、それに対応する新しいバージョンへのマッピングを含む。アプリケーション・プログラマは、これらのバージョン・アダプタおよび状態転送関数を記述することを要求される。あるパーティションが更新される時に、そのパーティションへのすべてのアクセスがブロックされる。更新が終了した後に、パーティションは、アンロックされ、アプリケーションは、更新されたパーティションのオブジェクトの新しいバージョンを使用してその通常実行を継続することができる。
ンターフェースを有し、パーティションをコンポーネントに似たものにする。新しいパーティションの実装の提供されるインターフェースは、少なくとも、更新が拒否されない場合に、前のバージョンの提供されるインターフェースを含まなければならない。したがって、この方法は、提供されるインターフェースからのパブリック・メンバの除去をサポートしない。パーティショニングに関する情報は、開発者によって提供されることまたはソースコードから自動的に抽出されることのいずれかとすることができる。開示される方法は、バージョン・アダプタを使用することによってメソッド、フィールド、およびコンストラクタを追加し、メソッド署名を変更することを可能にする。各パーティションは、状態転送関数を提供する。パーティションの状態転送関数は、古いパーティションのオブジェクトの状態の、それに対応する新しいバージョンへのマッピングを含む。アプリケーション・プログラマは、これらのバージョン・アダプタおよび状態転送関数を記述することを要求される。あるパーティションが更新される時に、そのパーティションへのすべてのアクセスがブロックされる。更新が終了した後に、パーティションは、アンロックされ、アプリケーションは、更新されたパーティションのオブジェクトの新しいバージョンを使用してその通常実行を継続することができる。
[10](非特許文献7)で、ヒャルムティソン(Hjalmtysson)およびグレイ(Gray)は、実行中のC++プログラムのクラスレベルでのランタイム更新を可能にする方法、Dynamic C++ classesを開示している。この方法は、ダイナミックリンキング・インターフェースにまたがるプログラムレベル抽象化の保存をむずかしくする、C++が動的にロード可能なモジュールの作成を直接にはサポートしないという問題に対処する。Dynamic C++ Classesは、一般的なC++特徴を活用し、ほとんどの現代のコンパイラを用いてコンパイルできるプロキシ手法に基づく。プロキシ手法は、既存クラスのバージョン更新ならびに新しいクラスの導入をサポートする。それを行うために、メイン・プログラムは、新しい実装と通信する(そのメソッドを呼び出す)ことができなければならない。したがって、各実装は、コンパイル時にメイン・プログラムに既知のインターフェースを有しなければならない。各新しい実装は、既存クラスを更新する(新しいバージョン)か、既知のインターフェースを使用する新しいクラスを導入する(新しい型)かのいずれかを行う。この制限に起因して、この方法は、メソッドの更新だけに制限される。
[11](非特許文献8)で、スタネック(Stanek)らは、C++クラスを動的に更新することを可能にする方法、Dynamically Evolvable C++ Classesを開示している。クラスの追加、除去、更新、マージ、および分割を含む。クラスの動的なマージおよび分割は、状態変換機能を使用して可能にされる。アプリケーションをDynamically Evolvable C++ Classesと一緒に使用するためには、アプリケーションのある準備が必要である。この準備は、(a)Dynamically Evolvable C++ Classesの基礎になるフレームワークによって提供されるスマート・ポインタおよびコンテナ・テンプレートを使用してアプリケーションを記述することと、(b)フレームワークによって定義される共通APIをクラスごとに実装することと、(c)インスタンス作成およびデストラクションのためのファクトリ・メソッドを実装することと、(d)各クラスを別々のダイナミック・リンク・ライブラリにコンパイルすることと、(e)ダイナミック・クラス・ライブラリのそれぞれをフレームワークのクラス・レジストリに登録することとからなる。基礎になるフレームワークは、更新の状態変換の後にオブジェクト参照を記憶するために、C++テンプレートとして実装されたスマート・ポインタに基づく。提示されたように、この方法は、マルチスレッド・アプリケーションでの競争状態の下で安全な状態変換が無視されるので、シングル・スレッド・アプリケーションだけに適用される。
[12](非特許文献9)で、チェン(Chen)らは、古いバージョンおよび新しい
バージョンを並列に動作させることによってマルチスレッド・ソフトウェアを動的に更新することを可能にする方法POLUSを開示している。POLUSは、アプリケーション・データの古いバージョンと新しいバージョンとの両方の同時共存を可能にすることによって並列実行を達成し、更新されるデータのいずれかのバージョンへの書込アクセスがある時に必ずある状態同期化関数を呼び出すことによってバージョンの間のコヒーレンスを維持し、POLUSは、オペレーティング・システムによって提供されるデバッギングAPI(たとえば、UNIX(登録商標)のptraceおよびWINDOWS(登録商標)のDebugActiveProcess)を使用して更新工程中にデータのいずれかのバージョンを書込保護する。この同期化手法は、マルチスレッド・ソフトウェアで複数のスレッドがデータの異なるバージョンに同時にアクセスする時の一貫性を保証する。並列実行は、古いバージョンのアクティブ・スレッドがなくなるや否や、終了する。その時から、オリジナル関数のプロローグに間接ジャンプ命令を挿入するのにバイナリ書換を使用して、すべての関数呼出が、古いバージョンから新しいバージョンにリダイレクトされる。POLUSは、Cプログラミング言語のような命令型(手続き型)プログラミング言語の動的更新のために設計されている。したがって、POLUSは、クラスベースのオブジェクト指向プログラミング言語に適用可能ではない。
バージョンを並列に動作させることによってマルチスレッド・ソフトウェアを動的に更新することを可能にする方法POLUSを開示している。POLUSは、アプリケーション・データの古いバージョンと新しいバージョンとの両方の同時共存を可能にすることによって並列実行を達成し、更新されるデータのいずれかのバージョンへの書込アクセスがある時に必ずある状態同期化関数を呼び出すことによってバージョンの間のコヒーレンスを維持し、POLUSは、オペレーティング・システムによって提供されるデバッギングAPI(たとえば、UNIX(登録商標)のptraceおよびWINDOWS(登録商標)のDebugActiveProcess)を使用して更新工程中にデータのいずれかのバージョンを書込保護する。この同期化手法は、マルチスレッド・ソフトウェアで複数のスレッドがデータの異なるバージョンに同時にアクセスする時の一貫性を保証する。並列実行は、古いバージョンのアクティブ・スレッドがなくなるや否や、終了する。その時から、オリジナル関数のプロローグに間接ジャンプ命令を挿入するのにバイナリ書換を使用して、すべての関数呼出が、古いバージョンから新しいバージョンにリダイレクトされる。POLUSは、Cプログラミング言語のような命令型(手続き型)プログラミング言語の動的更新のために設計されている。したがって、POLUSは、クラスベースのオブジェクト指向プログラミング言語に適用可能ではない。
(特許文献1)に、外部ソースを使用して、ユーザ・アプリケーションのデータ空間内の可変データの最小単位を動的に更新することを可能にする方法およびサービスが開示されている。アプリケーションGUIは、データ・ユニットを選択し、ブローカ・トピックにリンクすることを可能にする動的更新ユーティリティ(dynamic update
utility、DUU)を用いて機能強化される。本発明は、アクティブ状態を失わずにアクティブに実行中のソフトウェアのプログラミング・コードを動的に更新することに対処するが、(特許文献1)は、データ値の動的更新という異なる問題に対処する。
utility、DUU)を用いて機能強化される。本発明は、アクティブ状態を失わずにアクティブに実行中のソフトウェアのプログラミング・コードを動的に更新することに対処するが、(特許文献1)は、データ値の動的更新という異なる問題に対処する。
(特許文献2)は、アクティブに動作中のコンピュータ・システム内でソフトウェア・モジュールを動的にリフレッシュする方法、コンピュータ・システム製品、およびシステムを開示している。既存の1つまたは複数のモジュール(実行可能コードの認識可能なユニット)は、アクティブ・コンピュータ・システム内での実行の準備ができている。機能において既存モジュールに対応する新しいモジュールが、既存モジュールを更新するためにコンピュータ・システム・メモリにロードされる。新しいモジュールは、既存モジュールによって現在使用されつつあり、他の点で実行を引き継ぐ準備ができている対応する状態データをポイントすることによって、実行の準備をされる。呼出点からのアクセスまたは呼出参照を既存モジュールから新しいモジュールに切り替えるために、比較的短い瞬間の間に排他的にリフレッシュする工程のために実行に対してロックが保持される。ロックは、今や開放され、既存データを用いる新しいモジュールの実行を可能にし、したがって、モジュールの更新またはリフレッシュを達成する。最後に、前のすなわち「古い」モジュールが、メモリから除去される。本発明は、静的に型付けされたクラスベースのオブジェクト指向プログラミング言語で記述されたアクティブに動作するソフトウェアのノンブロッキング動的更新を可能にするが、(特許文献2)の方法は、手続き型言語で記述されたソフトウェアのブロッキング動的更新に制限される。
ドミトリーブ(Dmitriev)M.:Safe Evolution of Large and Long−Lived Java Applications、PhD thesis、Department of Computing Science、University of Glasgow、Glasgow G12 8QQ、Scotland、2001.
マラバーバ(Malabarba)S.、パンデイ(Pandey)R.、グラッグ(Gragg)J.、バール(Barr)E.、and バーンズ(Barnes)F.:Runtime Support for Type−Safe Dynamic Java Classes、In Proceedings of ECOOP’00、Lecture Notes in Computer Science、Vol.1850、Springer−Verlag、(2000)、pp.337−361.
スブラマニアン(Subramanian)S.、ヒックス(Hicks)M.、マッキンレイ(McKinley)K.:Dynamic Software Updates:A VM−centric Approach、In Proceedings of the 2009 ACM SIGPLAN conference on Programming language design and implementation、ACM SIGPLAN Notices、Volume 44、Issue 6、May 2009、pp.1〜12.
グスタフソン(Gustavson),J.:Dynamic Updating of Computer Programs − Proposed Improvements to the JDrums Updating System、Rise publications、2005.
オルソ(Orso)A.、ラオ(Rao)A.、ハロルド(Harrold)M.J.:A Technique for Dynamic Updating of Java Software、In:proceedings of ICSM’02、IEEE Computer Society、2002、pp.649−658.
ビアレク(Bialek),R.、ジュル(Jul),E.、J.−G.シュナイダ(Schneider),J.−G.、ジン(Jin),Y.:Partitioning of Java applications to support dynamic updates、In proceedings of APSEC’04、IEEE Computer Society Press、pp.616−623.
ヒャルムティソン(Hjalmtysson)G.、グレイ(Gray)R.:Dynamic C++ classes、In Proceedings of the USENIX 1998 Annual Technical Conference、pages 65−76、USENIX Association、June 15−19 1998.
スタネック(Stanek)J.、コタリ(Kothari)S.、ヌイェン(Nguyen)T.N.、クルズニエラ(Cruz−Neira)C.2006. Online Software Maintenance for Mission−Critical Systems、In Proceedings of ICSM’06、IEEE Computer Society、2006、pp.93−103.
チェン(Chen)H.、ユウ(Yu)J.、チェン(Chen)R.、ザン(Zang)B.、イェウ(Yew)P.:POLUS:A Powerful Live Updating System、In Proceedings ICSE’07、IEEE Computer Society、2007、pp.271−281.
前述を考慮すると、ソフトウェアまたはソフトウェアを実行するコンピュータを再始動することを必要とせず、ソフトウェアに対する更新を実行した結果としてソフトウェアのランタイム状態を失わない、静的に型付けされたクラスベースのオブジェクト指向ソフトウェアの透過的ノンブロッキング動的更新のシステム、方法、およびプログラム製品の必要が存在する。
本発明の実施形態は、バイトコードにコンパイルされ、アクティブに動作するデスクトップ機、サーバ、メインフレーム、または組込みコンピューティング・デバイス上のプラットフォーム独立仮想マシン内で実行される、静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新のシステム、方法、およびプログラム製品を提供する。具体的には、本発明の下で、ソフトウェアのプログラミング・コードのバージョンの間の変更を有効にするためにソフトウェアを再始動する必要を回避するために、ソフトウェアのクラス定義の異なるバージョンのバイトコードは、仮想マシンにロードされる時に一連の変換を受ける。これらの変換は、アクティブに動作しているコンピュータ・システムに存在するクラスの前のバージョンのすべてのライブ・オブジェクトの、オブジェクトがクラスの前のバージョンからインスタンス化された後に動的にロードされたクラスの新しいバージョンの対応するオブジェクトのサロゲートオブジェクトへのランタイム・スイッチングを可能にし、オブジェクト・アイデンティティおよびクラス型代入可能性は、オブジェクトおよびクラスのサロゲート(Surrogate)とその共存するバージョンとの間で共有される。本発明は、まず、更新されたサブクラスによって定義される拡張された挙動および/またはオーバーライドされた挙動が更新される仮想マシン固有ブートストラップ・クラスの以前のバージョンの既にインスタンス化されたオブジェクトについて実現されるようにするために、ブートストラップ・クラスにバイトコードをインジェクトすることによって、ブートストラップ・クラスのアプリケーション・サブクラスに対する将来の更新のためにブートストラップ・クラスを準備するために、ブートストラップ・クラスのプリブート・バイトコード変換を実行することによって動作する。次に、本発明は、変換されたブートストラップ・クラスがアプリケーション・インスタンスの仮想マシン・ブートストラップ・クラスの新しいセットを構成するアプリケーション・インスタンスを実行することによって進行する。実行中に、本発明は、仮想マシンにロードされるすべてのクラスのバイトコードのローディングをインターセプトし、クラスローディングが開始された後に、本発明は、連続するフェーズで、対応する共存するオブジェクトおよびクラスの共有されるオブジェクト・アイデンティティおよびクラス型アイデンティティを可能にするためにクラスのバイトコードを変換する。ロードされるクラスのカテゴリに応じて、本発明は、異なる変換を実行する、すなわち、システム・クラスのバイトコードが、それから派生するアプリケーション・サブクラスの将来の更新のためにシステム・クラスを準備するために変換され、これは、更新されたサブクラスによって定義される拡張された挙動および/またはオーバーライドされた挙動が更新されたサブクラスの以前のバージョンの既にインスタンス化されたオブジェクトについて実現されるようにするためにシステム・クラスにバイトコードをインジェクトすることによって達成され、アプリケーション・クラスのバイトコードが、アプリケーション・クラスへのバイトコードのインジェクトによって、アプリケーション・クラスを更新対応にするために変換され、これによって、アイデンティティおよび状態がノンブロッキングな形で自動的に転送される将来の対応するオブジェクトおよびクラスのサロゲートクラスおよびオブジェクトになるためにアプリケーション・クラスおよびそのインスタンスのランタイム・スイッチングを可能にする。最後に、ソフトウェア更新の場合に、ソフトウェア更新は、現在動作しているシステムと新しいバージョンとの間の差を構成するクラス定義の変更セットのバイトコードを含み、本発明は、新しいクラス定義の将来オンデマンド・インスタンス化される対応するオブジェクトの未初期化サロゲートになるために変更セット内のクラスからイ
ンスタンス化された現在ライブのオブジェクトの挙動を透過的にスイッチングすることによって、アクティブに動作しているコンピュータ・システムのノンブロッキング・ソフトウェア更新を実行する。
ンスタンス化された現在ライブのオブジェクトの挙動を透過的にスイッチングすることによって、アクティブに動作しているコンピュータ・システムのノンブロッキング・ソフトウェア更新を実行する。
この実施形態の変形形態では、ライブ・オブジェクトのオブジェクト・アイデンティティおよび状態は、クラスのより後のバージョンのオブジェクトの新しい対応するバージョンへの動的ソフトウェア更新の後の最初の使用時に対にされ、バイトコードの変換は、まず、更新されたクラス・バージョンの新しい未初期化対応オブジェクトをコンストラクトすることと、その後、対応するオブジェクトの一意アイデンティティidをコンストラクトし、オブジェクトの将来の機能強化されたアイデンティティ検査がその特定のバージョンに関わりなく対応するオブジェクトについて真をもたらすことを保証することと、最後に、クラス更新の後の最初の使用時にオブジェクトの以前の対応するバージョンから状態を移植することとを含む。
さらなる変形形態では、バイトコードの変換は、未初期化対応するオブジェクトのコンストラクションをトリガしたサロゲートオブジェクトにとって新規の状態の部分を初期化する自動的に生成されたバイトコード・メソッドをアプリケーション・クラスに挿入する。
さらなる変形形態では、バイトコードの変換は、別々のクラスローダを用いて更新されたクラスをロードすることであって、したがって、同一のクラスを表す複数の型は仮想マシンにロードされる、ロードすることと、言語によって定義される動的クラス型動作を実行するクラス内のバイトコードを、動的クラス検査動作のオペランドが同一の型名前空間を共有する対応するバージョンによって置換される動的クラス型検査を実行するバイトコードによって置換することとによって、同一のクラスの異なるバージョンを表す複数のクラスが共存できることを保証する。
さらなる変形形態では、バイトコードの変換は、メソッド呼出しのフォワーディングが、オブジェクトを、そのメンバへのすべてのアクセスを同一のクラスのより新しいバージョンの新しい対応するオブジェクトにフォワードするサロゲートに変換することを保証する。これは、まず、複数の対応するオブジェクトのいずれかを参照するクライアントが必ずそれ自体のクラスローダの到達可能な型から代入可能な型を有するオブジェクトを見るようにクラスのバイトコードを変換することによって達成される。これは、仮想マシン・バイトコード命令「instanceof」を、「instanceof」命令の右辺オペランドの型名前空間に従う特定の対応するオブジェクト表現に対する「instanceof」検査を実行するバイトコードによって置換することと、その後、「CHECKCAST」と同等の仮想マシン・バイトコード命令を、「CHECKCAST」命令の右辺オペランドの型名前空間に従う特定の対応するオブジェクト表現に対して「CHECKCAST」命令を実行するバイトコードによって置換することとを含み、最後に、クラスおよびクラスの前にロードされたバージョンのオブジェクトの、すべての将来の要求を対応する新しいクラスおよびオブジェクトにリダイレクトするサロゲートへのランタイム・スイッチングを実行し、新しい対応する表現から入手される可能な値は、サロゲートメンバの呼出し側の型名前空間に従うサロゲート表現によって置換され、リダイレクト工程を制御する挿入されるバイトコードは、サロゲートメンバの呼出し側によって与えられたパラメータを、リダイレクト工程の受取り側の型名前空間に従う対応する表現によって置換する。
さらなる変形形態では、バイトコードの変換は、サロゲートオブジェクトから対応する新しいオブジェクトへのメソッド呼出の仮想マシン表現のキャッシングによって、効率的なフォワーディングを保証する。
さらなる変形形態では、バイトコード変換は、アイデンティティについてオブジェクトを比較する仮想マシン・バイトコード命令を、同一の型名前空間に属する対応するオブジェクト・バージョンを使用してアイデンティティ検査を実行するバイトコードによって置換することによって、同一のクラスの異なるバージョンのライブ・オブジェクトの間の共有されるオブジェクト・アイデンティティを可能にする。
さらなる変形形態では、状態は、宣言されたフィールドあたり1つの生成されるGETメソッド内および宣言されたフィールドあたり1つの生成されるSETメソッド内のフィールドアクセスをラップする、アプリケーション・クラス内のバイトコードを生成することによって、同一のクラスの異なるバージョンからインスタンス化された複数の対応するオブジェクトの間で共有される。これによって、同一のオブジェクトを表す対応するオブジェクトのセット内のどのオブジェクト・バージョンが現在個々の共有されるフィールド値を保持するのかを記憶する。GETメソッドは、サロゲートオブジェクト上で呼び出される時に、フィールド読取要求がサロゲートオブジェクトの最新の対応するバージョンにフォワードされることを保証し、最新の対応するオブジェクトから入手されるフィールド値は、サロゲートオブジェクトの型名前空間のフィールド値に変換され、これは、フィールド値が最新の対応するオブジェクト内に現在存在しない場合に、フィールド値が、対応するオブジェクト内で検索され、まず最新の対応するオブジェクトの型名前空間に変換することによって転送されることを保証し、それを行うことは、フィールド値が最新の対応するオブジェクト内に存在する場合に、フィールド値が、その間に更新がなかった場合に読み取られ、返されることを保証する、すなわち、生成されるフィールド・GETメソッドを宣言するクラスの更新が、フィールド値が読み取られた後に発生する場合に、読取要求をサロゲートオブジェクトの最新の対応するバージョンにフォワードすることを保証し、最新の対応するオブジェクトから入手されるフィールド値は、今のサロゲートオブジェクトの型名前空間のフィールド値に変換される。同様に、SETメソッドに挿入されるアルゴリズムは、サロゲートオブジェクト上で呼び出される時に、フィールド書込要求が、サロゲートオブジェクトの最新の対応するバージョンにフォワードすることを保証し、最新の対応するオブジェクトにフォワードされるフィールド値は、最新の対応するオブジェクトの型名前空間のフィールド値に変換され、これによって、フィールド値が最新の対応するオブジェクト内に現在存在しない場合に、フィールド値が書込まれ、フィールド値を前に保持した対応するオブジェクトが、見つけられ、前の状態をクリアするように要求されることを保証する。これは、フィールド値が最新の対応するオブジェクト内に存在する場合に、フィールド値が、その間に更新がなかった場合に書込まれ、生成されるフィールド・SETメソッドを宣言するクラスの更新が、フィールド値が書込まれた後に発生する場合に、読取要求をサロゲートオブジェクトの最新の対応するバージョンにフォワードすることを保証し、最新の対応するオブジェクトにフォワードされるフィールド値は、最新の対応するオブジェクトの型名前空間のフィールド値に変換される。
さらなる変形形態では、バイトコードの変換は、前のバージョンから最新の対応するオブジェクトへの状態の転送が、対応するオブジェクトによって共有される一時的ロック機構の下で実行されることを保証する。
さらなる変形形態では、バイトコードの変換は、前の対応するバージョン内の状態のクリアが、対応するオブジェクトによって共有される一時的ロック機構の下で実行されることを保証する。
さらなる変形形態では、バイトコードの変換は、共通同期化オブジェクトを使用して、オブジェクトおよびそのサロゲートオブジェクトのグループへのスレッドに関する同期化されたアクセスを保証する。バイトコードの変換は、2つのステップすなわち、組込み同
期化アクセス修飾子を、メソッドの始めにMONITORENTER同等命令を挿入し、メソッドのすべての出口点にMONITOREXIT同等命令を挿入するバイトコードによって置換することであって、それに基づいて同期化されるオブジェクトは、対応するオブジェクトおよびクラスについて同一である、置換することと、言語によって定義される同期化を実行する動作を、それに基づいて同期化されるオブジェクトを対応するオブジェクトについて同一である一意に識別可能なオブジェクトによって交換するバイトコードによって置換することとを含む。
期化アクセス修飾子を、メソッドの始めにMONITORENTER同等命令を挿入し、メソッドのすべての出口点にMONITOREXIT同等命令を挿入するバイトコードによって置換することであって、それに基づいて同期化されるオブジェクトは、対応するオブジェクトおよびクラスについて同一である、置換することと、言語によって定義される同期化を実行する動作を、それに基づいて同期化されるオブジェクトを対応するオブジェクトについて同一である一意に識別可能なオブジェクトによって交換するバイトコードによって置換することとを含む。
さらなる変形形態では、バイトコードの変換は、アプリケーション・クラス内の各メソッドの始めに、サロゲートオブジェクトが使用可能なクラスの最も新しいバージョンからインスタンス化された対応するオブジェクトへフォワードすることを自動的に適合させることを保証するバイトコードを挿入することを含む。
さらなる変形形態では、バイトコードの変換は、オブジェクトへのアクセスが、ランタイムにメソッド本体の定義を置換することによってフォワードされることを保証する。
さらなる変形形態では、バイトコードの変換は、ライブ・オブジェクトが、スイッチ中にオブジェクト内でコードを現在実行しているスレッドを全くブロックせずにサロゲートオブジェクトに動的にスイッチされることを保証する。
さらなる変形形態では、バイトコードの変換は、ライブ・オブジェクトが、スイッチ中にオブジェクト内でコードを現在実行しているスレッドを全くブロックせずにサロゲートオブジェクトに動的にスイッチされることを保証する。
さらなる変形形態では、バイトコードの変換は、サロゲートオブジェクトが、状態およびアイデンティティを共有し、オンデマンド・コンストラクトされる対応オブジェクトが、クラスの最も新しいバージョンからインスタンス化されることを保証する。
さらなる変形形態では、バイトコードの変換は、サロゲートオブジェクトが、クラスの最も新しいバージョンからインスタンス化されたオンデマンド・コンストラクトされた対応オブジェクトと状態を共有することを保証する。
さらなる変形形態では、バイトコードの変換は、サロゲートオブジェクトが、クラスの最も新しいバージョンからインスタンス化されたオンデマンド・コンストラクトされた対応オブジェクトとアイデンティティを共有することを保証する。
さらなる変形形態では、バイトコードの変換は、サロゲートオブジェクトのクライアントが、サロゲートオブジェクトのクラスの型への1つまたは複数の参照を保持するが、使用可能な最も新しい対応クラス・バージョンへのサロゲートメンバのフォワーディングを介してクラスの最も新しいバージョンのメソッド本体を使用することを保証する。
さらなる変形形態では、バイトコードの変換は、宣言するクラス内の関連する生成されたGETメソッドを呼び出すバイトコードによって直接にオブジェクト状態を読み取るためにすべてのリフレクション的機構を置換することを含む。
さらなる変形形態では、バイトコードの変換は、宣言するクラス内の関連する生成されたSETメソッドを呼び出すバイトコードによって直接にオブジェクト状態を書込むためにすべてのリフレクション的機構を置換することを含む。
さらなる変形形態では、バイトコードの変換は、クラスの以前のバージョンが仮想マシンに前にロードされている場合にクラス初期化メソッド内のオリジナル・コードが実行されないことを保証するために、クラス初期化メソッドの始めにバイトコードを挿入することを含む。
さらなる変形形態では、バイトコードの変換は、コンストラクションが宣言するコンス
トラクタのサブクラスのサロゲートインスタンスに対して発生する場合に、コンストラクタが、オリジナル・コードを実行せず、コンストラクタ呼出をクラスの最も新しいバージョンの対応するオブジェクトにリダイレクトしないことを保証するために、オブジェクト・コンストラクタの始めにバイトコードを挿入することを含む。
トラクタのサブクラスのサロゲートインスタンスに対して発生する場合に、コンストラクタが、オリジナル・コードを実行せず、コンストラクタ呼出をクラスの最も新しいバージョンの対応するオブジェクトにリダイレクトしないことを保証するために、オブジェクト・コンストラクタの始めにバイトコードを挿入することを含む。
さらなる変形形態では、バイトコードの変換は、ファイナライゼーションがサロゲートオブジェクトに対して発生する場合に、ファイナライザが、オリジナル・コードを実行せず、ファイナライズ呼出を最も新しい対応するオブジェクトにリダイレクトしないことを保証するために、オブジェクト・ファイナライザの始めにバイトコードを挿入することを含む。
さらなる変形形態では、バイトコードの変換は、作成されるクローンが、クローンを作成されるオブジェクトのすべての対応するオブジェクトによって共有される状態と同等の状態を含むことを保証するバイトコードによって、言語によって定義されるクローン作成のオカレンスを置換することを含む。
さらなる変形形態では、バイトコードの変換は、最新の対応するオブジェクトによってシリアル化されるオブジェクトを置換するバイトコードによってオブジェクト・シリアル化のオカレンスを置換することを含み、挿入されるバイトコードは、共有されるオブジェクト状態が、シリアル化の処理を継続する前に最新の対応するオブジェクトに転送されることを保証する。
さらなる変形形態では、バイトコードの変換は、まず、置換される配列読取動作によって入手される値を呼出し側クラスの型名前空間の値に変換することと、その後、置換される配列書込動作で使用される値を最新の対応する配列オブジェクト型名前空間の値に変換することとによって、配列にアクセスする命令を、アクセス要求を最新の対応する配列オブジェクトにリダイレクトするバイトコードによって置換することを含む。
さらなる変形形態では、バイトコードの変換は、動的にロードされたクラスの新しいバージョンの型情報が、クラスの前にロードされたバージョンの継承階層とは異なる継承階層を示すことを可能にする。
さらなる変形形態では、バイトコードの変換は、動的にロードされたクラスの新しいバージョンの型情報が、クラスの前にロードされたバージョンのインターフェースとは異なるインターフェースを示すことを可能にする。
さらなる変形形態では、バイトコードの変換は、動的にロードされたクラスの新しいバージョンのメソッド宣言が、クラスの前にロードされたバージョンのメソッド宣言とは異なることを可能にする。
さらなる変形形態では、バイトコードの変換は、動的にロードされたクラスの新しいバージョンのフィールド宣言が、クラスの前にロードされたバージョンのフィールド宣言とは異なることを可能にする。
実施形態による他の方法、システム、および/またはコンピュータ・プログラム製品は、次の図面および詳細な説明を再検討する時に当業者に明白になるであろう。すべてのそのような追加の方法、コンピュータ・プログラム製品、および/またはシステムが、この説明に含まれ、本発明の範囲に含まれ、添付の特許請求の範囲によって保護されることが、意図されている。
上で短く説明した本発明のより特定の説明を、添付図面に示された本発明の特定の実施形態を参照することによって伝える。これらの図面は、本発明の1つまたは複数の通常の実施形態を示すのみであり、したがって、本発明の範囲を限定するものと解釈してはならない。次の図面に関して、同様の符号は、図面の組全体を通じて同一の要素を表す。
上で示したように、本発明は、アクティブに動作しているデスクトップ機、サーバ、メインフレーム、または組込みコンピューティング・デバイス上の仮想マシン内で実行される、静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新のシステム、方法、およびプログラム製品を提供する。具体的には、本発明は、クラス定義のバイトコードを動的に更新することを可能にする、クラス定義のバイトコードに対する変換を実行することによって、動的更新を提供する。クラスの更新は、モジュールの粒度レベルで行われる。前の動作しているバージョンとのモジュールAPI互換性を破壊しない変更は、モジュール自体を超える影響を有しない。バイナリ互換性ルールに違反する変更[2]は、すべての動作する依存物に関する新しいAPI互換モジュール・バージョンをも含むように更新セットを拡張する。更新中の変更は、動作しているソフトウェアの異なるバージョンでの更新されるクラス定義およびその共存する依存物の型安全を保証しながら、メソッド本体の変更、メソッドの追加/除去、コンストラクタの追加/除去、フィールドの追加/除去、クラスの追加/除去、インターフェースの変更、スーパークラスの置換、実装されるインターフェースの追加/除去、および透過的オブジェクト状態移植(transparent object state migration)を含むことができる。
一般に、この手法は、クラスのレベルでのコードと状態との両方の予期されない動的なソフトウェア進化をサポートする。API進化に関する一般に受け入れられたガイドラインに基づいて、本発明の手法は、システムを停止する前に状態をシリアル化し、再展開されたシステムを再始動した後に逆シリアル化する方式から派生したステートフル更新の同一のセットを可能にする。
本明細書で使用される時に、用語「モジュール」または「ソフトウェア・モジュール」は、長期記憶媒体(ディスク・ドライブ、CD−ROM、テープなどであるがこれらに限定されない)から独立にロード可能な1つのコンピュータ・コードを意味する。本発明の文脈では、「モジュール」は、バイトコード表現の形のクラス定義および補足のアプリケーション・リソースの識別可能なコレクションを暗示する。さらに、モジュールは、外部の世界すなわち依存モジュールがそこからパブリック・メンバに到達できる、明確に定義されたAPIを有する。モジュールは、他のコンポーネントに対する依存性を明示的に宣言する。
本明細書で使用される時に、用語「変更セット」は、バイナリ非互換性を避けるために一緒に原子的に再定義されなければならないクラス定義のセットを意味する。
本明細書で使用される時に、用語「型名前空間」は、オブジェクト、クラス、またはモジュールのうちの1つである、特定のコンテキストから到達可能な型を意味する。到達可能な型は、所与のコンテキスト内から直接にロードできる型によって与えられる。
本明細書で使用される時に、用語「型名前空間」は、オブジェクト、クラス、またはモジュールのうちの1つである、特定のコンテキストから到達可能な型を意味する。到達可能な型は、所与のコンテキスト内から直接にロードできる型によって与えられる。
図1は、本発明を実践できる、ワークステーションなどのコンピューティング・デバイスのブロック図である。図1の環境は、関連する周辺デバイスを含む、パーソナル・コンピュータ、ワークステーション、企業メインフレーム・コンピュータ、サーバ、ラップトップ機、ハンドヘルド・コンピュータ、情報機器など、単一の代表的なコンピューティング・デバイス100を含む。コンピューティング・デバイス100は、マイクロプロセッサ102または同等の処理能力と、既知の技法に従ってマイクロプロセッサ102とコンピューティング・デバイス100のコンポーネントとの間で接続し、その間の通信を可能にするバス104とを含む。いくつかのコンピューティング・デバイスで、その中に組み込まれた複数のプロセッサがある場合があることに留意されたい。
マイクロプロセッサ102は、バス104を介してストレージ106と通信する。ランダム・アクセス・メモリ(RAM)、読取り専用メモリ(ROM)、フラッシュ・メモリ、その他などのメモリ108は、直接にアクセス可能であるが、ハード・ディスクなどの二次記憶デバイス110およびフロッピー(登録商標)・ディスケット・ドライブ、CD
ROMドライブ、テープ・ストレージ、その他などのリムーバブル・ストレージ・デバイス112は、当技術分野で既知であり、習慣的であるように、追加のインターフェース・ハードウェアおよびソフトウェアを用いてアクセス可能である。リムーバブル・ストレージ・デバイス112は、ディスケット、CD、テープ・リールもしくはテープ・カートリッジ、ソリッド・ステート・ストレージ、その他など、コンピュータ使用可能データを保持し、コンピュータ使用可能媒体の形である、適当なタイプのリムーバブル媒体114を関連付けられる。コンピューティング・デバイス100が、複数のメモリ(たとえば、RAMおよびROM)、二次記憶デバイス、およびリムーバブル・ストレージ・デバイス(たとえば、フロッピー(登録商標)・ドライブおよびCD ROMドライブ)を有することができることに留意されたい。
ROMドライブ、テープ・ストレージ、その他などのリムーバブル・ストレージ・デバイス112は、当技術分野で既知であり、習慣的であるように、追加のインターフェース・ハードウェアおよびソフトウェアを用いてアクセス可能である。リムーバブル・ストレージ・デバイス112は、ディスケット、CD、テープ・リールもしくはテープ・カートリッジ、ソリッド・ステート・ストレージ、その他など、コンピュータ使用可能データを保持し、コンピュータ使用可能媒体の形である、適当なタイプのリムーバブル媒体114を関連付けられる。コンピューティング・デバイス100が、複数のメモリ(たとえば、RAMおよびROM)、二次記憶デバイス、およびリムーバブル・ストレージ・デバイス(たとえば、フロッピー(登録商標)・ドライブおよびCD ROMドライブ)を有することができることに留意されたい。
コンピューティング・デバイス100は、通常、キーボード118、マウスまたは他のポインティング・デバイス120、ディスプレイ122(CRTモニタ、LCDスクリーン、その他など)、プリンタ124、または接触感知スクリーン、ディジタル化された入力パッドその他などの任意の他のユーザ・インターフェース・デバイスなどの1つまたは複数のインターフェース・デバイスにバス104を介してマイクロプロセッサ102を接続するユーザ・インターフェース・アダプタ116を含む。コンピューティング・デバイス100が、ユーザ・インターフェース・デバイスとの必要な接続を行うために複数のユーザ・インターフェース・アダプタを使用することができることに留意されたい。
コンピューティング・デバイス100は、電話モデム、ケーブル・モデム、無線モデム、ISDNアダプタ、DLSアダプタ、ローカル・エリア・ネットワーク(LAN)アダプタ、または他の通信チャネルなどの通信アダプタ126を介して他のコンピューティング・デバイス、コンピュータ、ワークステーションなどまたはそのネットワークと通信することもできる。これは、コンピューティング・デバイスに、ネットワーク128(LAN、広域ネットワーク(WAN)、インターネットなど)、他のネットワークまたはコンピュータにアクセスするのに使用できる電話回線130、セル電話網などの無線ネットワーク132、および他の通信機構ヘの直接アクセスを与える。コンピューティング・デバイス100が、必要な通信接続を行うために複数の通信アダプタ(たとえば、電話モデム・カードおよびセルラ・ディジタル・パケット・データ(CDPD))を使用することが
できることに留意されたい。コンピューティング・デバイス100を、LANまたはWAN内の他のコンピューティング・デバイスに関連付けることができ、あるいは、コンピューティング・デバイスを、別のコンピュータとのクライアント/サーバ配置内のクライアントまたはサーバとすることなどができる。これらの構成のすべてならびに適当な通信ハードウェアおよび通信ソフトウェアが、当技術分野で既知である。
できることに留意されたい。コンピューティング・デバイス100を、LANまたはWAN内の他のコンピューティング・デバイスに関連付けることができ、あるいは、コンピューティング・デバイスを、別のコンピュータとのクライアント/サーバ配置内のクライアントまたはサーバとすることなどができる。これらの構成のすべてならびに適当な通信ハードウェアおよび通信ソフトウェアが、当技術分野で既知である。
コンピューティング・デバイス100は、オペレーティング・システム・ソフトウェア134、ミドルウェア・ソフトウェア136、およびアプリケーション・ソフトウェア138など、ソフトウェアを動作させる機能を提供する。そのようなソフトウェアが、タスクを実行し、このコンピューティング・デバイスおよび他のコンピューティング・デバイス上のさまざまなソフトウェア・コンポーネントと通信できることに留意されたい。
当業者によって理解されるように、本明細書で説明されるものなどのコンピュータ・プログラム(オペレーティング・システム・ソフトウェア134、ミドルウェア・ソフトウェア136、および/またはアプリケーション・ソフトウェア138を含む)は、通常、プログラム・コードを含むか格納する1つまたは複数のコンピュータ使用可能媒体を有するコンピュータ・プログラム製品の一部として配布される。したがって、本明細書で使用される時に、「媒体」または「コンピュータ使用可能媒体」は、コンピュータ・メモリ(RAMおよび/またはROM)、ディスケット、テープ、コンパクト・ディスク、集積回路、プログラマブル論理アレイ(PLA)、通信回路を介するリモート伝送、セルラ・ネットワークなどの無線ネットワークを介するリモート伝送、または適当なアダプタ・インターフェースを有するもしくは有しないコンピュータによって使用可能な任意の他の媒体を含むことができる。コンピュータ使用可能媒体の例が、CD Rom、ディスケット、ハード・ドライブ、および類似物などの触知できる物理媒体ならびにプログラムが電子的に配布される時の、有線または無線のいずれを介するものであれ、搬送波信号などの他の触知できない物理媒体を含むが、これに限定されないことに留意されたい。また、米国カリフォルニア州マウンテン・ビューのSun Microsystems社から入手可能なJAVA(登録商標)技術による「サーブレット」または「アプレット」がコンピュータ・プログラム製品と考えられることに留意されたい。
使用可能にする命令を、ディスケットまたはテープ「に書込み」、集積回路またはPLA「内に格納し」、通信回路または無線ネットワーク「を介して搬送する」ことができるが、本明細書で説明される本発明において、コンピュータ使用可能媒体が、命令を「担持する」と呼ばれ、あるいは、命令(またはソフトウェア)が、媒体「上に」あると呼ばれることを了解されたい。したがって、媒体「上で実施される」ソフトウェアまたは命令は、命令またはソフトウェアをコンピュータ使用可能媒体に関連付けることができる上記およびすべての同等の形を含むことが意図されている。
単純さのために、用語「コンピュータ・プログラム製品」は、1つのコンピュータ・システム(または複数の協力するシステム)が上で識別された発明に従って動作することを可能にするために任意の形のソフトウェアまたは命令を担持しまたはその上で実施された、上で定義されたコンピュータ使用可能媒体を指すのに使用される。
同様に、本発明がその上で実施されるコンピュータ・ハードウェアが、一緒に動作する、実質的に独立に動作する、またはネットワークを介して分散された1つまたは複数のプロセッサを含み、さらに、本発明を実行するのに必要な命令および計算を格納するメモリを含むことを了解されたい。
当業者は、本発明によるシステムを、当業者に既知のさまざまな異なる形で作成できることを認めるであろう。たとえば、図1に示された汎用コンピューティング・デバイスを
、本明細書が後で説明するようにコンピューティング・デバイスが機能するようにするために、適当なソフトウェアを用いて構成することができる。さらに、ディスクリート電子コンポーネントを使用して、その機能のすべてまたは一部を実施するシステムを作成することができる。最後に、適当なソフトウェアを実行する複数のコンピューティング・デバイスまたはディスクリート電子コンポーネントの組合せを、類似する形で使用できることに留意されたい。本質的に、ハードウェアは、本発明を構成する機能要素を実行するように構成される(ソフトウェアによる、カスタム設計されるなどのいずれであれ)。
、本明細書が後で説明するようにコンピューティング・デバイスが機能するようにするために、適当なソフトウェアを用いて構成することができる。さらに、ディスクリート電子コンポーネントを使用して、その機能のすべてまたは一部を実施するシステムを作成することができる。最後に、適当なソフトウェアを実行する複数のコンピューティング・デバイスまたはディスクリート電子コンポーネントの組合せを、類似する形で使用できることに留意されたい。本質的に、ハードウェアは、本発明を構成する機能要素を実行するように構成される(ソフトウェアによる、カスタム設計されるなどのいずれであれ)。
図2を参照すると、複数のコンポーネント206から作られる例のシステム・セットアップを示す図。当初に、202によって示されるように、時刻t=0のシステムは、208内のクラスが206内のクラスを使用できるという事実を反映する、システム内のコンポーネントの通常のバインディングを示す。ランタイムに、これらのバインディングは、動作するシステム内のクラスローダによって維持される。本発明は、仮想マシンによって実行される現代のプログラミング言語での通常のクラスローダ・セットアップの知識に基づく。通常、すべてのモジュールは、そのモジュールによって明示的に宣言されたクラスおよびリソースをロードする責任だけを負う別個のクラスローダに割り当てられる。モジュール依存性204で宣言されたクラスのクラスロードは、関連するクラスローダを見つけることからなり、そのクラスローダにクラスロードを委譲する。これの広く適用されている方式は、各クラスの一意表現をもたらし、この表現は、異なるモジュールの間の型共有を単純にする。しかし、モジュールによって定義されたクラスの動的置換の文脈では、モジュールはそのモジュール依存性の新しいバージョンで宣言されたクラスにどのようにして到達するのかという疑問が生じる。クラス再ロードの組込みサポートがなければ、新しいクラスローダを、置換されるコンポーネント212のそれぞれに割り当てなければならない。仮想マシンの観点からは、これによって、別個の型の新しいセットが作成される。
ここで210を参照すると、置換されたモジュールとの新しいクラスローダの関連付けは、クライアント・モジュールが更新されたモジュールの以前のバージョンに静的にバインドされる時には問題がある。明瞭にするために、216によって宣言されたクラスが、214によって宣言されたクラスAを使用する場合に、214の更新は、新しい型Aを作成し、この型Aは、オリジナルの型Aと代入互換ではない。したがって、216に関連付けするクラスローダにモジュール212に委譲させるためにクラスローディング委譲方式を動的に変更する試みは、成功しない。一例として、クライアント・クラスが既に新しい型を使用するモジュール216内のクラスにリンクされているケースは、クラスキャスト例外およびリンケージ・エラーをもたらす。それでも本発明は、図1に示されたセットアップからの問題を解決する動的更新フレームワークを提供する。さらに、本発明は、バージョン・バリアから発するすべての型関連問題[1]を成功して処理し、バージョン・バリアにまたがるモジュール通信がたとえばJAVA(登録商標)プログラミング言語の現在のセマンティクス内でシームレスに発生し得ることを伴う。
技術的説明の理解を容易にするために、次の表記が、本明細書の残り全体に適用される。ターゲット・コンポーネントは、動作するコンポーネントの最新バージョンを表す。コンポーネントの連続する更新では、ターゲット以外のコンポーネントのすべてを指すのに、用語以前のコンポーネントを使用する。更新時に、それぞれ更新の前および更新の後のターゲット・コンポーネントに言及する時に、用語現在のターゲットおよび新しいターゲットを使用する。用語中間コンポーネントは、ターゲット・コンポーネントとある以前のコンポーネントとの間の特定のコンポーネント・バージョンを指すのに使用される。一例として、コンポーネントAの4つのバージョン、A1、A2、A3、およびA4を検討されたい。この場合には、A4がターゲットであり、他のすべては、以前のコンポーネントである。コンポーネントA2およびA3は、A1に関する中間であり、A3は、A2に関
する中間である。さらに、コンポーネントは、(所与の説明に適当である場合に)214および216によって既に使用されている形A(n)で表される更新の時刻に関連する。タイミングは、更新の間の時間差が変化する場合であっても、必ず等距離の実数の線形シーケンスとして表される。さらに、同一の当初に展開されたコンポーネントの2つのバージョンを表す2つのコンポーネントは、対応コンポーネントとして言及される。これらの時間関連用語に加えて、コンポーネント・プラットフォーム自体の上に構築されるすべてのユーザ固有コンポーネントは、更新可能コンポーネントと言われる。更新可能システムのクラスレベルでは、更新可能コンポーネント内で宣言されたクラスを記述するのに、用語更新可能クラスを使用する。
する中間である。さらに、コンポーネントは、(所与の説明に適当である場合に)214および216によって既に使用されている形A(n)で表される更新の時刻に関連する。タイミングは、更新の間の時間差が変化する場合であっても、必ず等距離の実数の線形シーケンスとして表される。さらに、同一の当初に展開されたコンポーネントの2つのバージョンを表す2つのコンポーネントは、対応コンポーネントとして言及される。これらの時間関連用語に加えて、コンポーネント・プラットフォーム自体の上に構築されるすべてのユーザ固有コンポーネントは、更新可能コンポーネントと言われる。更新可能システムのクラスレベルでは、更新可能コンポーネント内で宣言されたクラスを記述するのに、用語更新可能クラスを使用する。
本発明によって開示される動的更新手法の基本的概念は、インプレース・プロキシフィケーション技法である。これは、以前のコンポーネントとターゲットとの間の接着剤(glue)である。インプレース・プロキシフィケーション機構は、2つのコンポーネント・バージョンの間のインダイレクションを導入するという問題に対する新規の解決策を提供する。既存のインダイレクション機構が、古いコンポーネントの回りで古いバージョンから新しいバージョンへ呼出しをリダイレクトするためのコードを置く包括的ラッパー概念[4]の変形形態を採用する場合に、インプレース・プロキシフィケーション機構は、古いコンポーネントのコード内でより新しいバージョンへのインダイレクションのレベルを提供するのに、インプレース生成されたコードを使用する。したがって、リダイレクションは、外側から内側へ移動され、これは、包括的ラッパー概念に基づく既存手法が直面する複数の問題を解決する。主なアイデアは、コンポーネントのコードの内部でプロキシ挙動を可能にするためにコンポーネントレベル・スイッチを生成することである。
ここで、図3を参照すると、304に入ってくる要求が308によって示されるコンポーネントAPIによってどのようにインターセプトされ、310にフォワードされるのかの図。このフォワーディングは、310内の新しい別個の名前空間の作成に起因して生じるバージョン・バリアをまたぐので、直接通信を介して発生することができない。その理由から、以前のコンポーネントからターゲットへ通信するのにリフレクション的技法を使用する。しかし、リフレクションは、フォワードされるメソッド呼出の仮引数型と戻り型が以前のコンポーネントによって知られている型と非互換である場合があるので、当面の問題に対する完全な解決策を提供しない。一般に、下で説明する前提条件が、成功のフォワーディングのために、更新可能なクラス内で宣言されるメソッドに適用される。
すべての更新可能なクラスは、ターゲット・クラスについて知る必要がある。したがって、本発明を実施する現在の例のシステムは、すべてのアプリケーション・クラスがロードされる直前に、そのクラス内で型java.lang.Classのスタティック・フィールドを生成する。このフィールドは、宣言するコンポーネントのすべての更新の後の最初の使用時にセットされる。
図4を参照すると、コンポーネント更新が402に、およびその後に404に適用された後の例のシステム・スナップショットを示すこと。このケースで正しいTargetメソッドを見つけることは、更新可能な仮引数型が、必ずしも呼び出すメソッド内の型と型互換ではないので、問題がある。したがって、型がTargetメソッドの仮型と一致するようにするために、正しい型をルックアップしなければならない。ここで、コンポーネントDで宣言されたあるメソッド、たとえばmが、仮引数型としてコンポーネントE型クラスを使用する場合に、この型は、ターゲット・コンポーネントEすなわち406の名前空間に従わない。したがって、402の名前空間内の型が、このメソッドをルックアップするのに使用されなければならない。起点に関わりなく正しい型バージョンを入手する唯一の穏当なオプションは、既知のクラスローダのみに委譲するターゲット・クラスの関連するクラスローダを尋ねることである。メソッド呼出が生じるたびにクラスのクラスロー
ダを尋ねることは、許容できないオーバーヘッドを導入する。それは、各メソッド呼出内の更新可能な仮引数型ごとにクラスローディング・アルゴリズムを実行することを強制する。これは、本発明が、既にルックアップされたメソッドを、宣言するクラス内で直接にキャッシングする理由である。さらに、本発明は、更新可能なコンポーネントごとに、既にロードされたクラスのキャッシュを維持する。
ダを尋ねることは、許容できないオーバーヘッドを導入する。それは、各メソッド呼出内の更新可能な仮引数型ごとにクラスローディング・アルゴリズムを実行することを強制する。これは、本発明が、既にルックアップされたメソッドを、宣言するクラス内で直接にキャッシングする理由である。さらに、本発明は、更新可能なコンポーネントごとに、既にロードされたクラスのキャッシュを維持する。
スタティック・メソッドの場合に、ターゲット・クラスおよびメソッドは、メソッド・フォワーディングをサポートするのに十分である。しかし、インスタンスメソッド呼出では、メソッドは、呼出がフォワードされなければならないオブジェクトを判定しなければならない。このターゲット・オブジェクトへの参照は、特殊なマーカ型のコードによって生成されたインスタンス・フィールドによって、更新可能クラスのすべてのインスタンス内に保持される。バイトコード変換によって、マーカ型は、すべての更新可能クラスによって実装される。我々は、用語ターゲット情報を用いて、上で述べたターゲットのすべてすなわちターゲット・コンポーネント、クラス、メソッド、およびオブジェクトについて示す。しかし、この用語は、スタティック・メソッドのコンテキストでターゲット情報がターゲット・コンポーネント、クラス、およびメソッドだけからなると言う意味で、文脈依存である。
Targetメソッドをフォワードすべき正しいパラメータを見つけることは、正しい場所にあるターゲット・オブジェクトを判定することと同一である。パラメータは、バージョンに関わりなくシステム内の同一のエンティティを表さなければならない。したがって、Targetメソッドに配送される実際のパラメータを、どの型がターゲット・クラスによって理解されるのかに従って、インプレース・プロキシとターゲット・オブジェクトとの組合せとすることができる。
ここで、図5を参照すると、502の動的更新の後で504の動的更新の後のモジュール・バインディングの例のスナップショットを示すこと。メソッド本体の進化に加えて、本発明は、クラス・インターフェースおよび型階層の動的進化をも可能にする。APIクラスの型に影響する変更は、クライアントの更新の時にクライアント・コンポーネントに直接に可視になる。これは、クライアント・コンポーネントの新しいバージョン508に関連するクラスローダに、そのクラスローディングをそのコンポーネント依存性のターゲット・コンポーネント506に直接に委譲させることによって達成される。
図5に示されたセットアップは、総合性能に関する本発明のもう1つの非常に重要なプロパティをも明らかにする。明らかに、前述の前提条件に従うAPIメソッドのフォワーディングは、比較的大きい性能ペナルティを提示する。これは、主に導入されるリフレクション的挙動によって引き起こされる。しかし、クライアントが更新されたコンポーネントAPIに対してコンパイルされ、その後に新しいターゲット・コンポーネントに動的にバインドされた後には、これらの呼出は、やはり、Targetメソッドに対して直接に発生する。したがって、メソッド呼出速度は、更新の前の速度に戻る。
前のセクションのインプレース・プロキシフィケーション技法は、クラスローダ境界にまたがる通信を可能にするが、それ自体ではプログラム一貫性を維持しない。上で説明したように、正しい実行フローをサポートするために処理される必要がある、フォワーディングに関わる型関連の問題がある。フレームワークは、特定のターゲット・コンポーネント内のすべてのライブ・オブジェクトが、すべての対応する以前のコンポーネント内で0個または1個のいずれかのオブジェクトによって表されることを保証しなければならない。0個は、対応するオブジェクトがオンデマンドで作成されるのみであるからである。たとえば、ターゲット・コンポーネント内の普通のコンストラクタの実行は、その点での以前のバージョンの他のオブジェクトのどれの作成をもトリガしない。ターゲット・オブジ
ェクトがインプレース・プロキシ法を介して返される場合に限って、対応するオブジェクトがコンストラクトされ、その場所に返される。この対応するオブジェクトは、すべての将来のメソッド呼出を、そのオブジェクトがそれから作成されたターゲット・オブジェクトにフォワードするように事前に構成される。正しいオブジェクトが必ず返されることを保証するために、本発明は、その中でオブジェクトがそのライブ表現に従って対にされるレジストリを提供する。本発明は、コレスポンダンス・ハンドリング(Correspondence Handling)と命名された技法によって、オブジェクトの複数の表現の間の対応を処理する。
ェクトがインプレース・プロキシ法を介して返される場合に限って、対応するオブジェクトがコンストラクトされ、その場所に返される。この対応するオブジェクトは、すべての将来のメソッド呼出を、そのオブジェクトがそれから作成されたターゲット・オブジェクトにフォワードするように事前に構成される。正しいオブジェクトが必ず返されることを保証するために、本発明は、その中でオブジェクトがそのライブ表現に従って対にされるレジストリを提供する。本発明は、コレスポンダンス・ハンドリング(Correspondence Handling)と命名された技法によって、オブジェクトの複数の表現の間の対応を処理する。
更新時に、更新されるコンポーネントのすべてのクラスおよびオブジェクトの挙動は、更新されるコンポーネントのランタイム・スイッチを変更することによって、インプレース・プロキシになる。最初の使用時に、インジェクトされたインプレース・プロキシ・コードは、新しいターゲット・コンポーネントによって宣言されたクラス定義からの対応する未初期化オブジェクトのコンストラクションをトリガし、これらの対を適当な対応するマップに追加する。さらに、これは、新しいターゲット・コンポーネントの対応する表現をポイントするようにセットされたターゲット・オブジェクトおよびクラス・フィールドの初期化をトリガする。この点で、未初期化オブジェクトは、以前のオブジェクトの状態が新しいターゲット・オブジェクトに移植されなかったことを示す。状態移植は、個々のフィールドの最初の使用時に、レイジイに発生する。
上で述べたシナリオは、対応するオブジェクトが、動作するシステム内に既に存在するオブジェクトについてどのように作成され、処理されるのかを説明する。クライアントは、更新が行われた後に、以前のコンポーネントのオブジェクトを作成し続けることができる。この場合に、コンストラクタは、メソッド呼出と同様に、ターゲット・コンポーネント内の対応するコンストラクタにフォワードする。これは、原理的には2つのコンストラクタを実行するが、ユーザ記述のコンストラクタ本体は、ターゲット・コンストラクタ内でのみ動作する。さらに、そのようなオブジェクト・コンストラクションから生じる2つの対応するオブジェクトは、上述のコレスポンダンス・ハンドリングに従ってマッピングされる。
もう1つの重要な問題は、コンポーネント境界にまたがるすべてのメソッド呼出が、インプレース・プロキシを介するインダイレクションの1つのレベルだけを通過することを保証することである。あるコンポーネントが2回更新され、そのオブジェクトがインプレース・プロキシフィケーション工程を2回通過すると仮定する。すると、第1バージョンのクライアントがメソッドを呼び出す時に、その呼出は、ターゲット・コンポーネント内のオブジェクトに達するために中間コンポーネントを通過する。1レベルのインダイレクションを保証するために、インプレース・プロキシ・クラスは、その最後の既知のターゲット・コンポーネントへの静的フォワード参照を維持する。最終的に、このターゲットは、更新され、そのランタイム・コンポーネント・スイッチは、その宣言されたクラス内でフォワーディングを可能にするために変更される。これは、最初のコンポーネントによって保持されるフォワード参照に、中間コンポーネントをポイントさせるが、これは望ましくない。したがって、ターゲット・コンポーネントの現在の知識の単純な検査は、新しいターゲット・コンポーネントがインストール済みであることを示し、フォワード参照は、フォワーディングの直前にアプリケーション・スレッド自体によって更新される。さらに、このメタ情報更新は、コレスポンダンス・ハンドリングにも反映される。
状態移植は、動的更新の中心である。一般に、状態移植技法は、1)透過的状態移植および2)プログラマによって影響される状態移植というカテゴリのうちの1つに含まれる。本発明は、透過的状態移植に基づく。我々の意見では、透過的状態移植は、明示的に記述されたバージョン・アダプタまたは状態転送関数を必要としないので、プログラマによ
って影響される状態移植より好ましい。バージョン・アダプタおよび状態転送関数の記述は、多くのタイプの更新に不必要な、労力集中型のタスクである。本発明は、以前のコンポーネントのフィールド値を自動的かつ透過的にターゲット・コンポーネントに転送する機構を使用する。
って影響される状態移植より好ましい。バージョン・アダプタおよび状態転送関数の記述は、多くのタイプの更新に不必要な、労力集中型のタスクである。本発明は、以前のコンポーネントのフィールド値を自動的かつ透過的にターゲット・コンポーネントに転送する機構を使用する。
この機構は、状態移植をオンデマンドでレイジイに実行する。状態は、フィールドの最初のアクセス時にアプリケーション・スレッドによって以前のコンポーネントからターゲット・コンポーネントに移植される。この手法は、特殊なロックが不要なので、標準的な同期化セマンティクスを保存する。したがって、スレッドが一時的に停止されないので、デッドロックは問題にならない。
更新の後に、すべての入ってくる要求は、新しいターゲット・コンポーネント内で終り、最終的に、状態を以前のバージョンから転送させる。これを達成するために、本手法は、フィールド読取およびフィールド書込を処理する特殊なアクセス・メソッドを作成する。基本的なアイデアは、状態が存在するかどうかを反映するブール値をすべてのフィールドについて維持することである。クラス・ローディグおよび標準コンストラクタ呼出の際に、これらのフィールドには偽がセットされる(デフォルト初期化)。この場合に、偽は、いずれかの状態が最初に初期バージョンにあるので、状態が存在することを反映する。新しいターゲット・クラスおよび以前のオブジェクトからコンストラクトされるオブジェクトでは、これらのフィールドに、明示的に真がセットされる。これによって、このフィールドは、状態が存在しないことを、関連するアクセス・メソッドに示す。状態を現在のターゲット・クラスおよびオブジェクトに転送するために、挿入されるアクセス・メソッドは、関連するブール値に偽の値を保持するものを見つけるまで、以前の対応するバージョンをルックアップする。見つけた後に、そのフィールドは、以前のバージョンからターゲットに転送され、ブール値には、それぞれ真および偽がセットされる。この工程は、更新不能型だけが参照によってコピー可能なので、見つかった値の型にも依存する。更新可能型である場合には、コレスポンダンス・ハンドリングは、対応するオブジェクトを突き止めるか作成する。
本発明の重要なプロパティは、クラスでの新しいフィールドの導入をサポートすることである。移植されるオブジェクトの関連するブール値にどのようにして明示的に真がセットされるのかを説明した。これは、新しいフィールド値が当初に実際にターゲット・クラスおよびオブジェクトに格納されるという事実を反映するものではない。その理由から、特殊なゲッター・メソッドが初めて呼び出された後に、そのメソッドは、以前のバージョン内のフィールドを突き止めることを試行することになる。そのメソッドは、この特定のフィールドが追加されたことを発見し、したがって、値が既に存在するかのようにブール・フィールドを訂正する。しかし、新しいフィールドに意味のある値を自動的に代入することはできない。可能なヌルポインタ例外または予期されないデフォルト・プリミティブ値を回避するために、本発明は、プログラマ自身によってクラスレベルで明示的に記述されるフィールド代入の初期化をサポートする。プログラマによって記述されたすべてのクラスレベル代入について、本発明は、すべての以前のオブジェクトから作成される新しいオブジェクトが、プログラマによって代入された値を保持することを保証する。これは、後で詳細に説明するバイトコード分析を介して達成される。
本手法がバイナリ互換変更をどのようにして処理するのかを説明したので、このセクションでは、本手法がバイナリ非互換変更をどのようにして処理するのかを説明する。本手法は、合同でバイナリ互換コンポーネントを構成する更新セットを必要とするオフライン更新方式を模倣する。したがって、この手法は、前のバージョンとのバイナリ互換性を破壊する、コンポーネントAPIの更新をもサポートする。我々は、例として、既存メソッドにパラメータを追加する、周知の単純な例を使用する。
public void createInstance(String name,int ID){・・・}
public void createInstance(String name,int ID,String description){・・・}
ここで、上のメソッドを含むコンポーネントの更新を試みることは、壊されたクライアントをもたらす可能性がある。したがって、静的依存性ベリファイヤが、更新を実行する前に、そのような非互換コンポーネント変更を突き止める。与えられた例では、ベリファイヤは、除去されたAPIメソッドという変更を見つける。その後、ベリファイヤは、クライアント・コンポーネントに対する更新を突き止めることを試み、クライアント・コンポーネントの更新されたセットとの互換性を検査する。ベリファイヤは、非互換性を見つけない場合に、コンポーネントの新しいセットの更新を実行する。そうではない場合には、ベリファイヤは、更新を破棄する。したがって、バイナリ非互換変更の導入は、クライアント・コンポーネントに要件を課すことによって、動作中のシステムの更新能力に影響する。これは、独立に開発されたコンポーネントにおける周知の制限である。コンポーネントのオリジナル・バージョンによってセットアップされた契約を破るために支払うべき代償は、この手法が、関わるプログラマがクライアントの更新にも投資する前にすべての動作中のシステムでの更新を適用できないことである。API設計者は、この代償を十分に知っている。通常、API設計者は、バイナリ互換性を維持するために処置を講じる。一例は、API設計者が、リスティング3でメソッドをオーバーロードし、したがって複数のソースコード反復について古いAPIを維持することである。我々は、この制限が、まさにオフライン更新方式から得られるものであり、更新がどのようにして実行されるのかに無関係であることを強調するものである。バイナリ非互換変更の更新を可能にするよりスマートな機構を導入するすべての試みは、プログラマ透過性を壊す。
public void createInstance(String name,int ID){・・・}
public void createInstance(String name,int ID,String description){・・・}
ここで、上のメソッドを含むコンポーネントの更新を試みることは、壊されたクライアントをもたらす可能性がある。したがって、静的依存性ベリファイヤが、更新を実行する前に、そのような非互換コンポーネント変更を突き止める。与えられた例では、ベリファイヤは、除去されたAPIメソッドという変更を見つける。その後、ベリファイヤは、クライアント・コンポーネントに対する更新を突き止めることを試み、クライアント・コンポーネントの更新されたセットとの互換性を検査する。ベリファイヤは、非互換性を見つけない場合に、コンポーネントの新しいセットの更新を実行する。そうではない場合には、ベリファイヤは、更新を破棄する。したがって、バイナリ非互換変更の導入は、クライアント・コンポーネントに要件を課すことによって、動作中のシステムの更新能力に影響する。これは、独立に開発されたコンポーネントにおける周知の制限である。コンポーネントのオリジナル・バージョンによってセットアップされた契約を破るために支払うべき代償は、この手法が、関わるプログラマがクライアントの更新にも投資する前にすべての動作中のシステムでの更新を適用できないことである。API設計者は、この代償を十分に知っている。通常、API設計者は、バイナリ互換性を維持するために処置を講じる。一例は、API設計者が、リスティング3でメソッドをオーバーロードし、したがって複数のソースコード反復について古いAPIを維持することである。我々は、この制限が、まさにオフライン更新方式から得られるものであり、更新がどのようにして実行されるのかに無関係であることを強調するものである。バイナリ非互換変更の更新を可能にするよりスマートな機構を導入するすべての試みは、プログラマ透過性を壊す。
図6を参照すると、当初にシステム・スタートアップの前に602、動的更新対応プログラム・インスタンスをスタートアップするのに必要なステップの高水準表現を示す流れ図。ステップ604では、本発明のユーザは、コンピュータ・プログラムを実行するためのアクションを行い、ここで、本発明が実行されなければならない。ユーザは、ブートストラッピング変換ツールを表す特殊なエージェント・ライブラリを指定する。このツールは、ブートストラップ・クラスすなわち、エージェント・ライブラリをスタートアップするために仮想マシンによって使用されるクラスのバイトコードを変換する責任を負う。この点で、実行制御は、エージェント・ライブラリにハンド・オーバされる606。特殊なエージェント・ライブラリは、ステップ608で、すべてのロードされるクラスについて仮想マシンに照会することによって、ブートストラップ・クラスのセットを判定する。すべてのロードされるブートストラップ・クラスへの参照を入手し終えて、見つかったブートストラップ・クラスのバイトコードの変換工程が、ステップ900で行われ、ステップ900の詳細な説明は、図9.1を参照しながら与えられる。変換工程の後に、特殊なエージェント・ライブラリは、610で新しいコンピュータ・プログラム・インスタンスをspawnし、このインスタンスは、本発明のランタイム部分を実行するのに必要なバイトコード変換を実行するのに必要な異なる特殊な変換エージェントに加えて、変換されたブートストラップ・クラスを含む。
図7を参照すると、アクティブに動作しているシステム内のモジュールを動的に更新するために行われるステップを示す流れ図。当初に、702で、イベントのフローが、現在動作しているシステム内のモジュールを更新する要求によってトリガされる。動的更新要求の起点は、本発明の特定の実施形態に応じて、本発明と通信できる何にでもすることができる。動的更新工程を開始し終えて、現在動作しているモジュールの最新バージョンを、ステップ704で突き止める。その後、動的更新工程は、本発明の特定の実施形態で機能強化されたコンポーネント・システム内に新しいモジュールをインストールする706。その後、新たに作成されたコンポーネントが、708で、同様に新たに作成された仮想
モジュールに関連付けられる。そのような仮想モジュールは、コンポーネント・システムにインストールされた実際のコンポーネントの特定のバージョンを表す。それらの仮想モジュールは、対応するオブジェクトおよびクラスをオンデマンドでそれ自体の一意の型名前空間から取り出す組込み機構を有するので、対応するモジュール・バージョンの間の糊として機能する。例示すると、312のようなインプレース・プロキシ・メソッド呼出では、メソッドのパラメータが304の型名前空間に属する場合に、そのパラメータを310の対応する型名前空間に変換しなければならない。ここで、312の委譲が発生し得る前に、310に関連する仮想モジュールは、304でインターセプトされたメソッドで与えられるオリジナル・パラメータ値のオブジェクトに対応するオブジェクトについて照会される。そのような対応するオブジェクトが存在する場合には、そのオブジェクトが即座に取り出され、そうでない場合には、上で説明したように未初期化オブジェクトとして作成される。図7に戻って、実際のコンポーネントを仮想モジュールに関連付けた後に、新しい仮想モジュール内のランタイム・スイッチは、当初に、関連するコンポーネントの一意型名前空間内でそれぞれコンストラクトされ、ロードされたオブジェクトおよびクラスが委譲しないことを保証するためにセットアップされる710。前にインストールされたモジュールの動的更新が、712で行われ、ここで、ランタイム・スイッチは、すべてのオブジェクトおよびクラスを、新たにインストールされたモジュール内の可能な将来の対応する表現のサロゲートにするのに使用される。最後に、714で、本発明の特定の実施形態で機能強化されたコンポーネント・システム内の特定の要素のリソースのドメイン固有更新が、実行される。
モジュールに関連付けられる。そのような仮想モジュールは、コンポーネント・システムにインストールされた実際のコンポーネントの特定のバージョンを表す。それらの仮想モジュールは、対応するオブジェクトおよびクラスをオンデマンドでそれ自体の一意の型名前空間から取り出す組込み機構を有するので、対応するモジュール・バージョンの間の糊として機能する。例示すると、312のようなインプレース・プロキシ・メソッド呼出では、メソッドのパラメータが304の型名前空間に属する場合に、そのパラメータを310の対応する型名前空間に変換しなければならない。ここで、312の委譲が発生し得る前に、310に関連する仮想モジュールは、304でインターセプトされたメソッドで与えられるオリジナル・パラメータ値のオブジェクトに対応するオブジェクトについて照会される。そのような対応するオブジェクトが存在する場合には、そのオブジェクトが即座に取り出され、そうでない場合には、上で説明したように未初期化オブジェクトとして作成される。図7に戻って、実際のコンポーネントを仮想モジュールに関連付けた後に、新しい仮想モジュール内のランタイム・スイッチは、当初に、関連するコンポーネントの一意型名前空間内でそれぞれコンストラクトされ、ロードされたオブジェクトおよびクラスが委譲しないことを保証するためにセットアップされる710。前にインストールされたモジュールの動的更新が、712で行われ、ここで、ランタイム・スイッチは、すべてのオブジェクトおよびクラスを、新たにインストールされたモジュール内の可能な将来の対応する表現のサロゲートにするのに使用される。最後に、714で、本発明の特定の実施形態で機能強化されたコンポーネント・システム内の特定の要素のリソースのドメイン固有更新が、実行される。
図8を参照すると、本発明の実施形態の実行中にオンデマンドでクラスを変換するために行われるステップを示す流れ図。当初に、802で、クラスロード・イベントが、動作中のシステムを実行する仮想マシンにクラスをロードするためにトリガされる。ステップ804では、変換エージェントが、クラスがシステム・クラスまたはアプリケーション・クラスのどちらであるのか判定する。ここで、クラスは、そのクラスローダに関して分類される。アプリケーション・クラスは、基礎になるコンポーネント・システムのコンポーネント・クラスローダによってロードされ、システム・クラスは、システム・クラスローダによってロードされる。それぞれシステム・クラスおよびアプリケーション・クラスを変換する、1400および1800に示された高水準工程ステップは、図9.6および図9.10によって表される、より細粒度の図を参照しながら詳細に示される。同様に、クラスローダに関わりなくシステム内のすべてのクラスに対してさらなるバイトコード変更を実行する、2600として示された高水準変換ステップは、図9.16を参照する時に包括的に説明される。すべてのバイトコード変換が完了した後に、変更されたクラスが、806で仮想マシンにロードされる。
図9.1を参照すると、ブートストラップ・クラスのバイトコードを変換するために行われるステップを示す流れ図。このフローは、すべてのブートストラップ・クラスのバイトコードを変換するためにブートストラップ工程によってトリガされる902。したがって、この流れ図によって示される工程は、すべてのブートストラップ・クラスについて繰り返される。904では、ブートストラップ・クラスの中で、本発明のある種のプロパティを満足するために特殊なハンドリングを必要とするクラスが、フィルタ・アウトされる。904での判断が真になる場合には、これらの特殊なクラスを変換するために行われるステップは、図9.3でさらに詳細に示される別々の工程(1100)によって処理される。各非特殊ブートストラップ・クラスについて、バイトコードは、1)906でブートストラップ・フィールドに関する情報を保存し、2)メソッドおよびコンストラクタを通って反復して908、コードがオブジェクト・ファイナライザである1100、コンストラクタである1200、publicメソッドまたはprotectedメソッドである1300かどうかに従ってコードを変換することによって変換される。最後に、バイトコード置換および他の特殊バイトコード命令ハンドリングを実行する高水準工程が、260
0によって取り込まれ、2600は、図9.16を参照しながら詳細に示される。
0によって取り込まれ、2600は、図9.16を参照しながら詳細に示される。
図9.2は、900で見つかった特殊なブートストラップ・クラスのバイトコード変換を実行するために行われるステップを示す流れ図である。本発明の例の実施形態は、リフレクション的機構の使用が上で説明したインプレース・プロキシフィケーションおよびコレスポンダンス・ハンドリング・モデルに対応することを保証するために、これらの特殊なクラス内のある種のメソッドのバイトコードを置換する。1004で、この工程は、変換される特殊なクラスがjava.lang.Classクラスである場合には1006に分岐する。その後、この工程は、1008で、getDeclaredMethodまたはgetDeclaredFieldという名前のメソッドを検索する。これらのメソッドでは、検索されるフィールドまたはメソッドが本発明によって追加されるかどうかを検査するために、バイトコードがメソッドの始めに挿入される1014。そうである場合には、1016で、ランタイム例外を送出するバイトコードを追加する。1008に戻って、java.lang.Class内のメソッドが、getDeclaredFieldまたはgetDeclaredMethodのうちの1つである場合には、この工程は1010に分岐し、そうである場合には、1012で、それぞれ宣言されたメソッドおよびフィールドのリストに戻る前に、本発明によって追加されたすべてのメソッドまたはフィールドを実行するための特殊なフィルタ・メソッドを呼び出すバイトコードを追加する。もう一度1004を見ると、「no」分岐に従う場合に、この工程は、1018でjava.lang.reflect.Fieldクラスを探す。このクラスが見つかる場合には、1020で、getFieldAccessorという名前の特定のメソッドを突き止め、ステップ1024で、上で説明したように本発明のフィールドアクセス・モデルに従うカスタムメードのフィールド・アクセッサを返すために、このメソッドの始めにバイトコードを挿入する。同様に、最後の特殊なクラスすなわちjava.reflect.ReflectionFactoryについて、ステップ1022で、特殊なメソッドを突き止め、ここで、ステップ1024で、バイトコード変換がメソッドの始めに挿入される。
図9.3を参照すると、finalizeメソッドのオリジナル・コードが特定のオブジェクトの最新バージョンでのみ実行されることを確実にするために必要なステップを示す流れ図。バイトコード変換は、ファイナライザ・メソッドの始めにバイトコードを挿入する1102。挿入されるバイトコードは、まず、finalizeメソッドがその上で実行されるオブジェクトが更新対応アプリケーション・クラス内で宣言されているかどうかを検査する1104。そうである場合には、挿入されるバイトコードは、上で説明したコレスポンダンス・ハンドリングに従って、そのオブジェクトがオブジェクトの最新バージョンであるかどうかを検査する1106。そうである場合には、このfinalizeメソッドのオリジナル・メソッド本体を実行する1108。1104に戻って、現在ファイナライズされつつあるオブジェクトが、更新対応アプリケーション・クラスのインスタンスではない場合には、やはりオリジナル・メソッド本体を実行する1108。オブジェクトが、ステップ1106で最新バージョンではない場合には、変換工程は、オリジナル・メソッド本体を実行せずに即座にリターンするバイトコード1110を挿入する。オブジェクト・ファイナライゼーション時にオリジナルのfinalizeコードを除外する理由は、現在のオブジェクトの最新の対応するオブジェクトが、現在システム内でライブであることである。したがって、finalizeメソッドのクリーン・アップから生じるすべての可能な副作用は、動作中のシステムに対する望まれないセマンティック影響を有する可能性がある。
図9.4を見ると、コンストラクタのオリジナル・コードが特定のオブジェクトの最新バージョンでのみ実行されることを保証するために行われるステップを示す流れ図。バイトコード変換は、コンストラクタの始めにバイトコードを挿入する1202。挿入される
バイトコードは、まず、コンストラクタが実行されるオブジェクトが更新対応アプリケーション・クラス内で宣言されているかどうかを検査する1204。そうである場合には、挿入されるバイトコードは、上で説明したコレスポンダンス・ハンドリングに従って、そのオブジェクトがオブジェクトの最新バージョンであるかどうかを検査する1206。そうである場合には、このコンストラクタのオリジナル・メソッド本体を実行する1208。1204に戻って、現在コンストラクトされつつあるオブジェクトが、更新対応アプリケーション・クラスのインスタンスではない場合には、オリジナル・コンストラクタを実行する1208。オブジェクトが、ステップ1206で最新バージョンではない場合には、変換工程は、オリジナル・メソッド本体を実行せずに即座にリターンするバイトコード1210を挿入する。この状況は、更新されたクラスのクライアントがそのクラスのオブジェクトをコンストラクトする場合に一般的に発生する。クラス階層内のコンストラクタの必須連鎖は、最初のバイトコード命令がスーパ・コンストラクタへの呼出であることを強制する。したがって、挿入されるバイトコードが、オブジェクトが最新バージョンであるか否かに関して推論できる場合であっても、挿入されるバイトコードがスーパ・コンストラクタ呼出を省略することはできない。したがって、説明される例でスーパ・コンストラクタに入る時には、作成されつつあるオブジェクトは、最新バージョンではなく、インプレース・プロキシフィケートされたサブクラスによって処理されるコンストラクタ委譲をもたらす。
バイトコードは、まず、コンストラクタが実行されるオブジェクトが更新対応アプリケーション・クラス内で宣言されているかどうかを検査する1204。そうである場合には、挿入されるバイトコードは、上で説明したコレスポンダンス・ハンドリングに従って、そのオブジェクトがオブジェクトの最新バージョンであるかどうかを検査する1206。そうである場合には、このコンストラクタのオリジナル・メソッド本体を実行する1208。1204に戻って、現在コンストラクトされつつあるオブジェクトが、更新対応アプリケーション・クラスのインスタンスではない場合には、オリジナル・コンストラクタを実行する1208。オブジェクトが、ステップ1206で最新バージョンではない場合には、変換工程は、オリジナル・メソッド本体を実行せずに即座にリターンするバイトコード1210を挿入する。この状況は、更新されたクラスのクライアントがそのクラスのオブジェクトをコンストラクトする場合に一般的に発生する。クラス階層内のコンストラクタの必須連鎖は、最初のバイトコード命令がスーパ・コンストラクタへの呼出であることを強制する。したがって、挿入されるバイトコードが、オブジェクトが最新バージョンであるか否かに関して推論できる場合であっても、挿入されるバイトコードがスーパ・コンストラクタ呼出を省略することはできない。したがって、説明される例でスーパ・コンストラクタに入る時には、作成されつつあるオブジェクトは、最新バージョンではなく、インプレース・プロキシフィケートされたサブクラスによって処理されるコンストラクタ委譲をもたらす。
図9.5を参照すると、プログラマが記述したメソッド本体の実行が必ず実行中のオブジェクトの最新バージョンで発生することを確実にするためにメソッドの始めにバイトコードを挿入する1302ために行われるステップを示す流れ図。挿入されるバイトコードは、まず、メソッドが実行されるオブジェクトが更新対応アプリケーション・クラス内で宣言されているかどうかを検査する1304。そうである場合には、挿入されるバイトコードは、上で説明したコレスポンダンス・ハンドリングに従って、そのオブジェクトがオブジェクトの最新バージョンであるかどうかを検査する1306。そうである場合には、オリジナル・メソッド本体を実行する1308。1304に戻って、現在メソッドを実行しつつあるオブジェクトが、更新対応アプリケーション・クラスのインスタンスではない場合には、オリジナル・メソッド本体を実行する1308。オブジェクトが、ステップ1306で最新バージョンではない場合には、変換工程は、現在実行中のオブジェクトの最新の対応するバージョンをルックアップする責任を負うメソッドを呼び出すバイトコード1310を挿入する。最新の対応するバージョンを入手し終えて、オリジナル・メソッド呼出は、ステップ1312で、ターゲット・クラス内の対応するメソッドに委譲される。
図9.6を見ると、システム・クラスが、ロードされる時1042にどのように変換されるのかを示す流れ図。システム・クラスを仮想マシンにロードする前に、バイトコードを解析する1404。クラスの解析中に、1406によって示されているように、2つの特殊なアクセッサ・メソッドが、クラス内の非スタティック・フィールドの読取および書込のために作成される。これらのメソッドの生成の詳細な説明は、それぞれ図9.7(1500)および図9.8(1600)を参照する時に与えられる。1408は、クラスがfinalクラスとして宣言されているか否か判定する。そうでない場合には、流れはステップ1700を通って進み、1700は、1410に進む前に、可能な更新対応サブクラスがそれらを利用するために、このクラスの内部でいくつかのヘルパ・メソッドを生成する必要があることを示す。この生成のさらなる説明は、図9.9(1700)を参照する時に与えられる。1408に戻って、クラスがfinalではない場合には、この工程は、1410でメソッドおよびコンストラクタを通って反復し、コードがオブジェクト・ファイナライザである1100(図9.3)、コンストラクタである1200(図9.4)、publicメソッドまたはprotectedメソッドである1300(図9.4)かどうかに従ってコードを変換する。最後に、バイトコード置換および他の特殊バイトコード命令ハンドリングを実行する高水準工程が、2600(図9.16)によって取り
込まれる。
込まれる。
図9.7を参照すると、システム・クラス内の非スタティック・フィールドアクセス用のフィールド読取メソッドを生成する1502ために行われるステップを示す流れ図である。当初に、1504で、生成されるメソッドのスタブを作成する。次に、1506で、この工程は、finalクラスに基づいて分岐し、finalクラスについては、1508で、直接にフィールド値を読み取るためのバイトコードが、生成されるメソッドに挿入される。この最適化は、finalクラスについてサブクラスが存在し得ないので可能である。したがって、インプレース・プロキシ・オブジェクトを、処理されるシステム・クラスを含むクラス階層から作成することはできず、処理されるシステム・クラス内のフィールドに関する安全な直接フィールドアクセスが保証される。finalとして宣言されていないクラスについて、この工程は、フィールドのオーナ・オブジェクトが更新対応であるかどうかを1510で検査するために、生成されるメソッドにバイトコードを挿入する。更新対応である場合には、1512で、オブジェクトを特殊な更新対応マーカ・インターフェースにキャストする。この特殊なインターフェースは、下で説明するように、バイトコード変換によってすべてのアプリケーションについて実装される。1514では、本発明のこの実施形態によって実装される特殊なメソッドを使用して、現在実行中のオブジェクトを「起点オブジェクト」に置換する。起点オブジェクトは、標準コンストラクタを実行することによって作成されるオブジェクトと定義される。したがって、対照的に、本実施形態によって作成されるすべての対応するオブジェクトは、起点オブジェクトではない。フィールドは、1516で宣言するクラスの型にキャストし、1518でフィールド値を読み取ることによって起点オブジェクトから読み取られ、1520でフィールドの型に応じて適当なリターン命令を挿入することによってオリジナルのフィールド読取命令の呼出し側に返される。
図9.8を参照すると、システム・クラス内の非スタティック・フィールドアクセス用のフィールド書込メソッドを生成する1602ために行われるステップを示す流れ図。当初に、1604で、生成されるメソッドのスタブを作成する。次に、1606で、この工程は、finalクラスに基づいて分岐し、finalクラスについては、1608で、直接にフィールド値を書込むためのバイトコードが、生成されるメソッドに挿入される。finalとして宣言されていないクラスについて、この工程は、フィールドのオーナ・オブジェクトが更新対応であるかどうかを1610で検査するために、生成されるメソッドにバイトコードを挿入する。更新対応である場合には、1612で、オブジェクトを特殊な更新対応マーカ・インターフェースにキャストする。1614では、この工程は、上で説明した起点オブジェクトへの参照を入手するバイトコードを挿入する。フィールドは、1616で宣言するクラスの型にキャストし、1618でパラメータからの値を生成されるメソッドにロードし、1620でロードされた値を起点オブジェクトに書込むことによって、起点オブジェクトに書込まれる。
図9.9を参照すると、システム・クラス内のある種のヘルパ・メソッドの生成1702を示す流れ図。これらのメソッドは、更新対応クラスのクラス階層内において上で説明したようにターゲット情報に関するある種のプロパティを判定するのに使用される再帰的スーパ呼出を終了するためのコンビニエンス・メソッド(convenience method)である。ステップ1704では、生成工程は、生成されるメソッドが特殊なisMethodPresentメソッドであるか否か判定する。そうである場合に、生成されるメソッドに挿入されるバイトコードは、必ず真を返す1706。他の生成されるメソッドについて、挿入されるバイトコードは、必ず偽を返す1708。
次に図9.10を参照すると、仮想マシン内において1802で開始されるクラスのロードの前に、アプリケーション・クラスのバイトコードを解析し1804、変換するため
に行われるステップの高水準の図を示す流れ図。1806では、変換工程は、システム内のすべてのアプリケーション・クラスによって実装される前述の更新対応マーカ・インターフェースを挿入する。1808は、アプリケーション・クラス内のフィールドごとにフィールド・アクセッサ・メソッドを生成する工程の高水準の図を示し、この生成の詳細な説明は、図9.11および図9.12を参照しながら、この説明に続く。ステップ2100は、このクラスの以前のバージョンに対する更新によって導入されるフィールドを初期化するバイトコードを生成する工程の高水準の図を示す。この工程の詳細な説明は、図9.13を参照する時に与えられる。変換されるクラスによって宣言されるすべてのメンバ1810は、それがfinalizeメソッドであるのか1812、コンストラクタであるのか1814、スタティック・イニシャライザ(<<clinit>>)であるのか1816、非staticのpublicメソッドまたはprotectedメソッドであるのか1818、staticのpublicメソッドまたはprotectedメソッドであるのか1820に従って特殊化された変換を受け、これらの各個々の変換は、それぞれ図9.3(1100)、図9.14(2200)、図9.15(2300)、図9.16(2400)、および図9.17(2500)で包括的に説明される。
に行われるステップの高水準の図を示す流れ図。1806では、変換工程は、システム内のすべてのアプリケーション・クラスによって実装される前述の更新対応マーカ・インターフェースを挿入する。1808は、アプリケーション・クラス内のフィールドごとにフィールド・アクセッサ・メソッドを生成する工程の高水準の図を示し、この生成の詳細な説明は、図9.11および図9.12を参照しながら、この説明に続く。ステップ2100は、このクラスの以前のバージョンに対する更新によって導入されるフィールドを初期化するバイトコードを生成する工程の高水準の図を示す。この工程の詳細な説明は、図9.13を参照する時に与えられる。変換されるクラスによって宣言されるすべてのメンバ1810は、それがfinalizeメソッドであるのか1812、コンストラクタであるのか1814、スタティック・イニシャライザ(<<clinit>>)であるのか1816、非staticのpublicメソッドまたはprotectedメソッドであるのか1818、staticのpublicメソッドまたはprotectedメソッドであるのか1820に従って特殊化された変換を受け、これらの各個々の変換は、それぞれ図9.3(1100)、図9.14(2200)、図9.15(2300)、図9.16(2400)、および図9.17(2500)で包括的に説明される。
図9.11を参照すると、アプリケーション・クラス内のフィールド読取メソッドを生成する1902ために行われるステップを示す流れ図である。フィールド読取メソッドに挿入されるバイトコードは、当初に、1904で、現在実行中のオブジェクトが最新バージョンであるかどうかを検査する。そうである場合には、1906で、フィールド値がオブジェクトのこのバージョンに存在するかどうかを調べるためにさらに検査する。本発明のこの実施形態は、それぞれが宣言するクラスの個々のフィールドについて1906で出される質問に対する答えを保持するブール値の配列を関連付ける。状態が存在する場合には、ステップ1908で、フィールド値を読み取り、ローカル変数に格納する。検査の後に、宣言するクラスの更新が1906と1910との間の時間期間に行われたかどうかを調べることが、実行される。そのような更新が行われた場合には、フィールド読取要求は、1914に示されているように現在のターゲット・バージョンに委譲され、1914は、最初に1904で条件を検査する間にオブジェクト・オーナが更新済みであった場合の結果のイベントでもある。1906に戻って、フィールド状態の現在のバージョンがオーナ・オブジェクトの対応するバージョンに保持される場合には、状態をその現在位置から移植するメソッドが、1916で呼び出される。この呼出は、対応するオブジェクトにまたがって同期化する能力を有して設計された1918に示された特殊なロック機構の下で発生する。したがって、フィールド値を読み取り、書込むアルゴリズムは、ロックフリーであり、したがって高速であるが、状態移植工程は、インプレース・プロキシ・オブジェクトから最新の対応するバージョンへ状態を移動している間に特殊なロックを必要とする。
図9.12に移ると、アプリケーション・クラス内のフィールド書込メソッドを生成する2002ために行われるステップを示す流れ図。フィールド書込メソッドに挿入されるバイトコードは、当初に、2004で、現在実行中のオブジェクトが最新バージョンであるかどうかを検査する。そうである場合には、2006で、フィールド値がオブジェクトのこのバージョンに存在するかどうかを調べるためにさらに検査する。状態が存在する場合には、ステップ2008で、フィールド値を書込む。その後、宣言するクラスの更新が2006と2010との間の時間期間に行われたかどうかを調べるための検査が、実行される。そのような更新が行われた場合には、フィールド書込要求は、2012に示されているように現在のターゲット・バージョンに委譲され、2012は、最初に2004で条件を検査する間にオブジェクト・オーナが更新済みであった場合の結果のイベントでもある。2006に戻って、フィールド状態の現在のバージョンがオーナ・オブジェクトの対応するバージョンに保持される場合には、2014でフィールド値を直接に書込み、2016で関連するブール値をそれ相応に更新する。2つの対応するオブジェクトがフィール
ド値の最新バージョンを保持すると明示的に述べる、導入される時間的矛盾を除去するために、フィールド値の前のオーナを突き止め、値自体ならびに関連するブール値をクリアする、特殊な状態クリア・メソッドが、2018で呼び出される。現在のオブジェクト・オーナならびに前のオーナのブール値を更新する工程は、2020にも示されているように、上で説明したロック機構を必要とする。特定のフィールド値の前のバージョンでの状態を除去する工程は、それ自体では、そのフィールドに対する同時アクセスの正しいセマンティックを保証しない。これが、2010および1910に示された宣言するクラスの更新が必要かどうか調べるための余分な検査が必要な理由である。
ド値の最新バージョンを保持すると明示的に述べる、導入される時間的矛盾を除去するために、フィールド値の前のオーナを突き止め、値自体ならびに関連するブール値をクリアする、特殊な状態クリア・メソッドが、2018で呼び出される。現在のオブジェクト・オーナならびに前のオーナのブール値を更新する工程は、2020にも示されているように、上で説明したロック機構を必要とする。特定のフィールド値の前のバージョンでの状態を除去する工程は、それ自体では、そのフィールドに対する同時アクセスの正しいセマンティックを保証しない。これが、2010および1910に示された宣言するクラスの更新が必要かどうか調べるための余分な検査が必要な理由である。
図9.13を見ると、宣言するクラスの以前のバージョンからコンストラクトされたオブジェクトに、新たに追加されたフィールドのプログラマによって記述されたデフォルト・フィールド値を代入するのに必要なステップを示す流れ図。プログラマによって記述されたフィールド代入と一致するバイトコードを取り込むために、2102で、コンストラクタのバイトコードを解析する。解析されるコンストラクタの予備条件は、そのコンストラクタが、宣言するクラス内の別のコンストラクタにコンストラクションを委譲するコンストラクタになることができないことであり、委譲する場合には、クラスレベルのフィールド代入は、コンストラクタのコードに存在しない。ステップ2104は、宣言するクラスが仮想マシンにロードされる最初のバージョンであるか否か判定するための検査を含む。この場合に、この工程は、バイトコードを全く生成せずに終了する。というのは、対応する宣言するクラスがロードされていないことを考慮すると、以前のバージョンの対応するオブジェクトが存在し得ないからである。対照的に、解析されるクラスが、対応する以前のクラス・バージョンを有する場合には、この工程は2106に進み、2106では、必須のスーパ・コンストラクタ呼出を達成するための最初の命令をスキップする。ステップ2108では、解析中にバイトコード命令を格納できるバイトコード・ブロックが、宣言される。その後、ステップ2110では、バイトコード命令が、コンストラクタ内の次の命令を読み取ることによって開始される。2112に示された、このアルゴリズムの第1の停止判断基準は、命令がPUTFIELDであり、したがって、宣言するクラス内のフィールド値への代入であることである。命令がPUTFIELD命令以外のものである場合には、2118でのテストが、現在の命令がクラスレベルで有効であるかどうかを調べるために検査する。クラスレベルで有効な命令とは、フィールド初期化代入の一部としてコンストラクタの外部で使用できる命令である。たとえば、解析されるコンストラクタの第1パラメータのロードは、コンストラクタの外部で行うことができず、したがって、この工程は解析を停止する。その後、この工程は、ステップ2116に移動し、2116は、停止判断基準が実現される前に見つかったバイトコード・ブロックを用いてメソッドを生成する。2118に戻って、命令をクラスレベルで行える場合には、その命令は、現在のバイトコード・ブロックに格納され、2110で、次の命令が解析される。2112をもう一度見ると、命令がPUTFIELD命令である場合には、このアルゴリズムは2114に分岐し、2114は、PUTFIELD命令に含まれるフィールド名が既に処理されたかどうかを取り込む。そうである場合には、このアルゴリズムは停止し、ステップ2116に進む。フィールド名が新しい場合には、命令は現在のブロックに追加され、かつブロックは格納される。その後、ステップ2108で新しいバイトコード・ブロックが開始され、このアルゴリズムは、上で説明したようにステップ2110から継続する。
図9.14は、更新対応アプリケーション・クラス内のコンストラクタのバイトコード変換を示す流れ図である。この変換は、メソッドの始めにバイトコードを挿入する2202。挿入されるバイトコードは、2204で、宣言するクラスが最新バージョンであるかどうかを検査することによって開始される。そうである場合には、挿入されるバイトコードは、2206で、現在コンストラクトされつつあるオブジェクトも最新バージョンであるかどうかを検査する。宣言するクラスが最新のクラス・バージョンである場合であっても、オブジェクトが、更新されるサブクラスのインスタンスである可能性があり、したが
って、ステップ2206は必要である。オブジェクトが同様に最新バージョンである場合には、2208に示されているように、オリジナル・コンストラクタ本体が実行され、挿入されるバイトコードがないかのようにオブジェクトをコンストラクトする。2204および2206で行われるテストに戻って、これらのテストのうちの1つが、オブジェクトまたはクラスが最新バージョンではないことをもたらす場合には、フローは、2210で継続される。このシナリオでは、挿入されるバイトコードは、コンストラクションが最新クラス・バージョンに委譲されなければならないのかどうか、または任意の可能なサブクラスが、必須スーパ・コンストラクタ呼出からリターンした後に委譲工程を処理するのか否か判定する必要がある。したがって、ステップ2210では、作成されつつあるオブジェクトが、サブクラスのインスタンスであるかどうかが検査され、そうである場合には、コンストラクタは、2212で即座にリターンされる。委譲工程を、2214に来る現在のクラスで実現しなければならない場合には、2214で、入手可能な現在のメタ情報が最新であるか否か判断する。そうである場合には、2216で委譲が行われ、そうでない場合には、2218でターゲット情報を最新にし、その後、2216に進む。
って、ステップ2206は必要である。オブジェクトが同様に最新バージョンである場合には、2208に示されているように、オリジナル・コンストラクタ本体が実行され、挿入されるバイトコードがないかのようにオブジェクトをコンストラクトする。2204および2206で行われるテストに戻って、これらのテストのうちの1つが、オブジェクトまたはクラスが最新バージョンではないことをもたらす場合には、フローは、2210で継続される。このシナリオでは、挿入されるバイトコードは、コンストラクションが最新クラス・バージョンに委譲されなければならないのかどうか、または任意の可能なサブクラスが、必須スーパ・コンストラクタ呼出からリターンした後に委譲工程を処理するのか否か判定する必要がある。したがって、ステップ2210では、作成されつつあるオブジェクトが、サブクラスのインスタンスであるかどうかが検査され、そうである場合には、コンストラクタは、2212で即座にリターンされる。委譲工程を、2214に来る現在のクラスで実現しなければならない場合には、2214で、入手可能な現在のメタ情報が最新であるか否か判断する。そうである場合には、2216で委譲が行われ、そうでない場合には、2218でターゲット情報を最新にし、その後、2216に進む。
次に図9.15を参照すると、本発明の好ましい実施形態でスタティック・イニシャライザを変換するために行われるステップを示す流れ図である。2302に示されているように、バイトコードが、メソッドの始めに挿入される。ステップ2304では、特殊なクラス登録工程が、システム内のクラスのコンポーネントに関連する特殊なモジュールへの参照を入手するために挿入される。この参照は、クラスおよびオブジェクトが更新されたかどうかを調べるためにテストするために、例示的実施形態全体を通じて、挿入されるバイトコードによって使用される。ステップ2306では、挿入されるバイトコードは、クラスが仮想マシンにロードされる最初のバージョンであるか否か判断する。そうである場合には、クラス・イニシャライザ内のオリジナル・コードを2308で実行する。そうではない場合には、このメソッドは、可能な包容力のない副作用を伴うクラス・イニシャライザの再実行を禁ずるために、2310で即座にリターンされる。
図9.16は、更新対応アプリケーション・クラス内のpublicおよびprotectedのインスタンスメソッドのバイトコード変換を示す流れ図である。変換は、メソッドの始めにバイトコードを挿入する2402。挿入されるバイトコードは、2404で実行中のオブジェクトが最新バージョンであるかどうかをテストすることによって開始され、そうである場合には、2406でオリジナルのメソッド本体を実行する。実行中のオブジェクトが最新バージョンではない場合には、2410でこのメソッドを現在のTargetメソッドに成功して委譲するために、2408でメタ情報を検査して、メタ情報が最新であるかどうかを調べる。ターゲット・ポインタが最新ではない場合には、フローは2412に進み、2412で、新しいTargetメソッドをルックアップする。2414でのテストで、対応するメソッドが動的更新によって除去済みである場合には、挿入されるバイトコードは、メソッドの現在のバージョンの実行にフォール・バックする。そうではない場合には、委譲工程が実行され、その実行フローの詳細な説明は、後で図9.25(3300)で示す。
図9.17は、更新対応アプリケーション・クラス内のpublicおよびprotectedのスタティック・メソッドのバイトコード変換を示す流れ図である。変換は、メソッドの始めにバイトコードを挿入する2502。挿入されるバイトコードは、2504で、宣言するクラスが最新バージョンであるかどうかをテストすることによって開始され、そうである場合には、2506に示されているようにオリジナルのメソッド本体を実行する。実行中のオブジェクトが最新バージョンではない場合には、2510でこのメソッドを現在のTargetメソッドに成功して委譲するために、2508でメタ情報を検査して、メタ情報が最新であるかどうかを調べる。ターゲット・ポインタが最新ではない場合には、フローは2512に進み、2512で、新しいTargetメソッドをルックア
ップする。2514でのテストで、対応するメソッドが動的更新によって除去済みである場合には、挿入されるバイトコードは、メソッドの現在のバージョンの実行にフォール・バックする。そうではない場合には、委譲工程が実行され、その実行フローの詳細な説明は、後で図9.25(3300)で示す。
ップする。2514でのテストで、対応するメソッドが動的更新によって除去済みである場合には、挿入されるバイトコードは、メソッドの現在のバージョンの実行にフォール・バックする。そうではない場合には、委譲工程が実行され、その実行フローの詳細な説明は、後で図9.25(3300)で示す。
図9.18を見ると、上で説明されたように本発明の背後のモデルを保証するために特殊なハンドリングを必要とする命令を取り込むためにクラスの内部のすべてのバイトコード命令を解析する2602ことによってシステム内のすべてのクラスで行われるバイトコード変換を示す流れ図。ステップ2604は、オブジェクト・アイデンティティ・テストを実行するバイトコード命令を図9.24(3200)によって後に詳細に示される特殊なメソッドへの呼出に置換する、これらのバイトコード命令をフィルタ・アウトする。その後、そのメソッドによって返されるブール値が、2608でプリミティブ値の単純な比較を挿入することによって検査される。バイトコード命令が、2610のテストでメソッド命令である場合には、そのメソッド命令は、2612で検査され、さらに2612の関連する注釈によって指定されるように、そのメソッドが特殊なメソッドである場合に限って、特殊なハンドラ・メソッドによって置換される。メソッド命令が、cloneメソッドへの呼出である場合には、オリジナル・バイトコードは、図9.19(2700)を参照する時に与えられる詳細な説明に従って変換される。メソッド命令が、例示的実施形態ではJAVA(登録商標)によって例示される基礎になる言語の組込み同期化機構に関連する場合には、これらのバイトコード命令は、図9.20(2800)で示される工程に従って変換される。インターセプトされるバイト命令の最後のグループは、2622によってテストされる、配列に関連する命令である。ある配列長のすべての配列読取、配列書込、または配列照会は、2624によって示されるように、対応するオブジェクトにまたがるアクセスを処理する特殊なメソッド呼出によって置換される。これらの特殊な配列メソッドの実行フローは、図9.27(3500)によって詳細に示される。
次に、図9.19を参照すると、cloneメソッド呼出のオカレンスのバイトコードを変換するために行われるステップを示す流れ図。当初に、2702で、置換バイトコードは、クローン作成の特殊なハンドリングがクローンを作成されようとしているオブジェクトについて必要であるか否か判定するための検査を挿入する。この検査の実行フローは、後で図9.26(3400)によって詳細に示す。2704によるテストで、特殊なクローン・サポートが必要である場合には、実行フローは、2706に示されているように、クローンを作成されるオブジェクトが最新の状態を含むことを保証するために必須のステップを実行する特殊なメソッドを呼び出す。逆に、特殊なハンドリングが必要ではない場合には、2708よって示されるように、オリジナルのcloneメソッド命令が実行される。
図9.20を見ると、2802によって定義される同期化関連バイトコード命令の置換を示す流れ図。すべての同期化関連命令は、実行中にスタック上に含まれる特定のオブジェクトに対して同期化する。ステップ2804では、このオブジェクトは、可能な対応するオブジェクトにまたがって一意のままであるこのオブジェクトの一意表現を返す特殊な同期化メソッドへのパラメータとして与えられる。その後、オリジナル・バイトコード命令が実行される時に、その命令は、その後に、おそらくは異なる対応するオブジェクトを参照する更新されたクラスによってアンロックされ得るオブジェクトに対して同期化する。
図9.21は、仮想マシンにロードされた更新対応クラスのバイトコード内のフィールドアクセス命令2902を変換するために行われるステップを示す流れ図である。命令が、GETSTATIC命令ではない場合には、変換工程は、2914によって示されるように、その命令を、生成されたフィールドアクセス・メソッドへのメソッド呼出に置換す
る。GETSTATIC命令の場合には、2906で、バイトコード命令によって指定されるフィールド・オーナを検査して、それがインターフェースであるかどうかを調べ、そうである場合には、オリジナル・フィールド命令を保存する。すべての他の場合には、ステップ2908で、指定されたフィールド・オーナが現在解析されているクラスと等しいかどうかを検査する。そうである場合には、この工程は、2910で、フィールドが実際に指定されたクラスで宣言されているかどうかを検査する。そうである場合には、ステップ2914で、命令を、生成されたフィールドアクセス・メソッドへの呼出によって置換する。そうではない場合には、変換工程は、ステップ2912で、宣言されたフィールド・オーナ・クラスがこのフィールド用の関連する生成されたアクセス・メソッドを有するか否か判定するランタイム検査を実行するバイトコードを挿入する。このメソッドから返された値が真である場合には、2914に示されているように、フィールドアクセス・メソッドを呼び出す。その一方で、フィールドアクセス・メソッドが宣言されたフィールド・オーナに存在しない場合には、ステップ2916で、フィールド値を取り出すためにオリジナル命令を使用する。
る。GETSTATIC命令の場合には、2906で、バイトコード命令によって指定されるフィールド・オーナを検査して、それがインターフェースであるかどうかを調べ、そうである場合には、オリジナル・フィールド命令を保存する。すべての他の場合には、ステップ2908で、指定されたフィールド・オーナが現在解析されているクラスと等しいかどうかを検査する。そうである場合には、この工程は、2910で、フィールドが実際に指定されたクラスで宣言されているかどうかを検査する。そうである場合には、ステップ2914で、命令を、生成されたフィールドアクセス・メソッドへの呼出によって置換する。そうではない場合には、変換工程は、ステップ2912で、宣言されたフィールド・オーナ・クラスがこのフィールド用の関連する生成されたアクセス・メソッドを有するか否か判定するランタイム検査を実行するバイトコードを挿入する。このメソッドから返された値が真である場合には、2914に示されているように、フィールドアクセス・メソッドを呼び出す。その一方で、フィールドアクセス・メソッドが宣言されたフィールド・オーナに存在しない場合には、ステップ2916で、フィールド値を取り出すためにオリジナル命令を使用する。
図9.22を参照すると、他のクラスからブートストラップ・クラスにおいて宣言されたフィールドにアクセスするだけでなく、ブートストラップ・クラスの内部のフィールドアクセス命令のためのバイトコードを変換するのに必要なステップを示す流れ図。3002のテストで、命令がGETFIELDである場合には、変換は、要素3032の内側に示されたバイトコードを挿入する。当初に、3004で、挿入されるバイトコードは、特定のフィールドのオーナ・オブジェクトが更新対応であるかどうかを検査する。そうである場合には、3006で、オブジェクト・オーナの起点バージョン内のブート・フィールドを取り出すために特殊なメソッドを呼び出すことによって、フィールドアクセスが処理される。このブート・フィールド委譲の実行フローは、後で図9.29(3700)によって詳細に示される。この特殊なメソッドからオブジェクト型値を取り出した後に、ステップ3008は、フィールド型がプリミティブであるか否か判定し、そうである場合には、3010で、バイトコードは、返されたオブジェクトをそのプリミティブ対応物へunboxする。そうではない場合には、3014で、CHECKCAST命令を挿入して、オブジェクトをフィールド型にキャストする。3004に戻って、オブジェクト・オーナが更新対応ではない場合には、挿入されるバイトコードは、3012で、オリジナルGETFIELD命令を使用して、フィールドを直接に安全に読み取る。オリジナル命令がPUTFIELDである場合には、3018に示された挿入されるバイトコードの最初のステップは、スタックにオブジェクト・オーナを置くためにスタックを操作し、したがってこのオブジェクトに対するさらなる検査を実行できるようにすることである。その後、3020で、挿入されるバイトコードは、オブジェクト・オーナが更新対応であるかどうかを検査し、そうである場合には、3022および3024でプリミティブ・フィールド型を扱うのに必要なステップを実行した後に、3026でフィールド書込を特殊なメソッドに委譲する。オリジナル・フィールド命令が、フィールドへの静的アクセスである場合には、これらのクラスを動的に更新することが不可能なので、変換は、バイトコードを挿入する必要がない。したがって、スタティック・フィールドの状態は、宣言するブートストラップ・クラス内に一意に配置される。
次に図9.23を見ると、システム・クラスの内部のフィールド命令を変換するために行われるステップを示す流れ図。3102のテストで、フィールドアクセスが、インスタンス・フィールドへのアクセスを試みている場合には、フィールド命令は、ステップ3104で、生成される関連するフィールドアクセス・メソッドへの呼出によって置換される。
図9.24を参照すると、前に述べたインターセプトされる特殊なメソッドおよび動作を処理する3202ために行われるステップを示す流れ図。1)オブジェクト・アイデン
ティティ比較3204、2)Class.isInstanceメソッド3206、3)CHECKCAST演算子3208、4)instanceof演算子3210、5)Class.isAssignableFromメソッド3212の変換されたオカレンスのうちの1つの実行の場合には、本発明の例示的実施形態の実行レイヤは、上で説明した本発明の基礎になるモデルのセマンティクスを達成するために、特殊なアクションを実行する。当初に、ステップ3214で、実行レイヤは、対応するインスタンスをルックアップし、その結果、3214で、検査または演算の両辺が同一の型名前空間に従うようにする。その後、3216で、オリジナル・コードの未変更バージョンがこれらのインスタンスに対して実行される。3212に戻って、実行レイヤをトリガした実行がClass.getInterfacesメソッド呼出である場合には、実行レイヤは、3218で、オリジナルgetInterfacesメソッドから入手されたインターフェースのリストに、更新対応アプリケーション・クラスに追加された特殊なインターフェースが存在する場合に、それらの特殊なインターフェースをフィルタ・アウトする。
ティティ比較3204、2)Class.isInstanceメソッド3206、3)CHECKCAST演算子3208、4)instanceof演算子3210、5)Class.isAssignableFromメソッド3212の変換されたオカレンスのうちの1つの実行の場合には、本発明の例示的実施形態の実行レイヤは、上で説明した本発明の基礎になるモデルのセマンティクスを達成するために、特殊なアクションを実行する。当初に、ステップ3214で、実行レイヤは、対応するインスタンスをルックアップし、その結果、3214で、検査または演算の両辺が同一の型名前空間に従うようにする。その後、3216で、オリジナル・コードの未変更バージョンがこれらのインスタンスに対して実行される。3212に戻って、実行レイヤをトリガした実行がClass.getInterfacesメソッド呼出である場合には、実行レイヤは、3218で、オリジナルgetInterfacesメソッドから入手されたインターフェースのリストに、更新対応アプリケーション・クラスに追加された特殊なインターフェースが存在する場合に、それらの特殊なインターフェースをフィルタ・アウトする。
次に図9.25を参照すると、実行をインプレース・プロキシ・オブジェクトから最新の対応するバージョンに委譲する3302ために行われるステップを示す流れ図。3304のテストでコンストラクタ委譲である場合には、実行レイヤのフローは、3306で始まり、3306は、ターゲット・コンストラクタが更新されたクラスから除去済みであるかどうかを調べるためのサニティ・チェックである。そうである場合には、コンストラクトは、3342で、その中で委譲工程が開始されたオリジナル・コードの実行にフォール・バックする。呼出し側オブジェクトがオリジナル・コンストラクタからコンストラクトされた後に、そのオブジェクトは、宣言するクラスのメンバの最初の使用時にインプレース・プロキシになり、新しい未初期化の対応するターゲット・オブジェクトが作成される。ターゲット・コンストラクタがターゲット・クラスに存在する場合には、オリジナル・コンストラクタからのパラメータ値が、3308でターゲットの型名前空間に変換される。その後、ステップ3310では、ターゲット・コンストラクタが、変換されたパラメータを用いて呼び出され、3312では、2つの対応するオブジェクトの間の対応関係がセットアップされる。
入ってくる委譲要求が、3314によって示されるようにTargetメソッドに対するものである場合には、実行レイヤは、3316で、サニティ・チェックを実行して、Targetメソッドが更新されたクラスに存在するかどうかを調べる。そうである場合には、3318で、前に説明したようにパラメータを変換する。そうではない場合には、ステップ3342で、オリジナル・メソッドの実行にフォール・バックする。オリジナル・メソッドを実行すること。ステップ3320では、変換されたパラメータを使用してメソッドを呼び出し、3322のテストでメソッドの戻り型がvoidである場合には、この工程は終了する。そうではない場合には、3324で、Targetメソッドから返された値を、呼出し側メソッドの型名前空間に従う対応するオブジェクトに戻って変換する。
インプレース・プロキシ内の生成されたフィールド読取メソッドから来るフィールド・ゲット実行イベント3326の場合には、実行レイヤは、やはり、ステップ3328で、サニティ・チェックを実行して、フィールドが、およびこれによって関連する生成されたフィールド読取メソッドが、まだターゲット・クラスに存在するかどうかを調べることによって開始する。同一の検査が、ステップ3336でフィールド書込メソッド委譲について実行される。Targetメソッドが存在する場合には、ステップ3330で、リフレクション的呼出が発生し、ステップ3332で、返されたフィールド値の変換が行われる。フィールド書込委譲について、新しいフィールド値は、まずステップ3338で新しいターゲット名前空間に変換され、その後、ステップ3340で、対応するメソッドがリフレクション的に呼び出される。
図9.26を見ると、例示的実施形態の実行レイヤがオブジェクトまたは配列のクローンを作成する、入ってくる要求をどのように処理するのか3402を示す流れ図。入ってくる要求が、2702によって以前に指定されたisSpecialCloneNeededの要求である場合には、実行レイヤは、まず、ステップ3406で、クローンを作成されるオブジェクトが更新対応であるかどうかを検査する。そうではない場合には、このメソッドは、ステップ3412で偽を返し、指定されたオブジェクトのクローンを作成するために特殊なハンドリングが必要ではないことを示す。クローン作成されるオブジェクトが更新対応である場合には、ステップ3408で、現在のclone呼出が、java.lang.Objectクラスによって宣言されたネイティブcloneメソッドによって実行されるかどうかを検査する。この場合には、このメソッドは、ステップ3410で真を返し、このオブジェクトのクローンを作成するために特殊なハンドリングが必要であることをシグナリングする。
3414でのテストで、入ってくる要求が、上で述べたisSpecialCloneメソッドからの肯定のフィードバックに対してのみ実行されるspecialCloneメソッドの要求である場合、実行レイヤは、ステップ3416で、クローンになるための未初期化オブジェクトを作成する。この新たに作成されたオブジェクトに対して、ステップ3418で、クラス階層をトラバースして、既存オブジェクトからフィールド値をコピーし、フィールド値がまずその対応するオブジェクトの任意の1つの現在位置に配置されることを保証する。したがって、クローン・オブジェクトは、オリジナル・オブジェクトと同一の状態を含むが、オリジナル・オブジェクトに格納されたメタ状態のいずれをも含まない。
配列クローン作成の場合には、実行レイヤは、まず、3420で、オリジナル配列の同一型の新しい空の配列を作成する。その後、3422で、配列の現在の要素のすべてを格納する対応する配列をトラバースし、値を新しい配列コンポーネント型の型名前空間に変換する。
次に図9.27を参照することは、配列アクセスの変更されたオカレンスが実行される時に例の実施形態の実行レイヤ内で行われるステップ3502を示す流れ図。実行イベントが、3504のテストで配列の長さの照会である場合に、実行レイヤは、まず、ステップ3506で、照会される配列の起点配列を突き止める。起点配列は、アプリケーション・コードによって作成された配列の特定のバージョンである。起点配列は、必ず、それ自体の型名前空間内の更新された要素値を保持する。その後、ステップ3508で、配列長が、起点配列から取り出される。
3510による検査で、変更された配列ロード演算が実行される場合には、実行レイヤは、3512で起点配列を取り出し、ステップ3514で、オリジナルAALOAD命令で与えられたインデックスを使用して起点配列から現在値を得、ステップ3516で、その値を、変更されたバイトコードの呼出し側の型名前空間に変換する。
変更された配列ストア演算が実行される場合には、実行レイヤは、3518で起点配列を取り出し、3520で、オリジナル・バイトコード命令内で使用された値を起点配列の型名前空間に変換し、3522で、変換された値を起点配列に格納する。
図9.28を見ると、オブジェクトのハッシュコードおよびシステム・アイデンティティ・ハッシュコードを取り出すために変更されたバイトコード命令の実行3602を処理するために行われる必要なアクションを示す流れ図。3604による検査でシステム・アイデンティティ・ハッシュコードの置換バイトコードを実行する場合に、実行レイヤは、3606で起点オブジェクトを取り出し、3608で起点オブジェクトのオリジナル・ア
イデンティティ・ハッシュコードを返す。ハッシュコード・メソッドの変更されたバージョンが呼び出される場合には、実行レイヤは、3610で、まず、現在のオブジェクトに使用される特定のハッシュコード・メソッドが、java.lang.Objectクラスで宣言されたメソッドのハッシュコード・メソッドであるかどうかを調べる。そうである場合には、フローは、既に説明したステップ3606から継続する。ハッシュコード・メソッドが、特定のオブジェクトについてオーバーライドされている場合には、要求は、ステップ3612で最新の対応するバージョンに委譲する。したがって、オブジェクトのハッシュコードまたはアイデンティティ・ハッシュコードの要求は、対応するオブジェクトについて必ず同一の結果を返す。
イデンティティ・ハッシュコードを返す。ハッシュコード・メソッドの変更されたバージョンが呼び出される場合には、実行レイヤは、3610で、まず、現在のオブジェクトに使用される特定のハッシュコード・メソッドが、java.lang.Objectクラスで宣言されたメソッドのハッシュコード・メソッドであるかどうかを調べる。そうである場合には、フローは、既に説明したステップ3606から継続する。ハッシュコード・メソッドが、特定のオブジェクトについてオーバーライドされている場合には、要求は、ステップ3612で最新の対応するバージョンに委譲する。したがって、オブジェクトのハッシュコードまたはアイデンティティ・ハッシュコードの要求は、対応するオブジェクトについて必ず同一の結果を返す。
図9.29を参照すると、ブート・フィールドアクセスを委任するために行われるステップ3702を示す流れ図。3704による検査で読取ブート・フィールド委譲要求である場合に、実行レイヤは、まず、ステップ3706で起点オブジェクトを取り出す。その後、実行レイヤは、ステップ3708で、リフレクションを使用して起点オブジェクト内の値を読み取る。ブート書込フィールド委譲要求の場合には、実行レイヤは、まず、ステップ3710で起点オブジェクトを取り出す。その後、実行レイヤは、ステップ3712で、リフレクションを使用して、与えられた値を起点オブジェクトに書込む。
図9.30は、オブジェクトの以前のバージョンから最新の対応するバージョンへ状態を転送するのに必要なステップ3802を示す流れ図を示す。ステップ3804では、実行レイヤは、まず、状態転送をトリガしたオブジェクトに対応するすべてのオブジェクトをルックアップする。突き止められた対応するオブジェクトのリストは、previousObjectsという名前の変数に格納される。その後、ステップ3806で、このリストが、次の要素をpreviousという名前の変数に代入することによってトラバースされる。その後、3808では、実行レイヤは、現在の要素(previous)が状態の現在のバージョンを持ち続けるか否か判定し、そうである場合には、ステップ3810で、突き止められたバージョンの値を最新の対応するオブジェクトの型名前空間に変換する。さらに、変換されたフィールドが、最新の対応するバージョンのフィールドに書込まれる。その後、ステップ3812で、個々のフィールド値の状態の存在を指定するための関連するブール値が、最新の対応するオブジェクトについてセットされ、ステップ3814で、古いフィールド値オーナについてクリアされる。3808に戻って、現在のフィールド値が、トラバースされた現在の要素に存在しない場合には、ステップ3816で、対応するオブジェクトのリストをもう一度検査して、トラバースすべき要素がまだあるかどうかを調べる。そうである場合には、フローは、ステップ3806に再帰的に戻る。さらなる要素が見つからない場合には、実行レイヤは、ステップ3818で、指定されたフィールドがクラスの最新バージョンで新たに宣言されなければならないと結論する。したがって、フィールド値は、新たに宣言されたフィールドにデフォルト値を代入するために前に説明したアルゴリズムによって代入される値を含む。
最後に、図9.31を参照すると、最新バージョンでのフィールド書込が関連するブール値を初めて変更した時に前の対応するオブジェクト内のフィールド値をクリアするために3902行われるステップを示す流れ図。ステップ3904では、実行レイヤは、まず、やはりpreviousObjectsに格納される、状態クリアの実行をトリガしたオブジェクトに対応するすべてのオブジェクトをルックアップする。ステップ3906では、次の要素をpreviousという名前の変数に代入することによって、このリストをトラバースする。3908での検査で、現在の要素が、関連するブール値によって指定されるように状態を保持する場合には、ステップ3910で、値ならびにブール・フィールドを、トラバースされた特定の要素についてクリアし、この工程は終了する。前の要素が状態を保持しない場合には、3912でのテストで次の要素が存在するならば、その要素を検索する。すべての要素がトラバースされ、それらのどれにおいても状態が見つから
ない場合には、実行レイヤは、ステップ3914でフォール・スルーする。というのは、フィールドが新規であり、したがって、フィールド値が、1つの対応するオブジェクトのみで既に一意に配置されるからである。
参考文献
[1]サトウ(Sato)Y.,チバ(Chiba)S.:Loosely−separated ”Sister” Namespaces in Java、In proceedings of ECOOP’05、Lecture Notes in Computer Science、Vol.3586、Springer−Verlag、(2005)、pp.49〜70.
[2]ドロッソポーロウ(Drossopoulou),S.、ラッグ(Wragg),D.、およびアイゼンバッハ(Eisenbach),S、1998、What is Java binary Compatibility?、In Proceedings of OOPSLA’98、ACM press、1998、pp.341〜361.
[3]オルソ(Orso)A.、ラオ(Rao)A.、ハロルド(Harrold)M.J.:A Technique for Dynamic Updating of Java Software、In:proceedings of ICSM’02、IEEE Computer Society、2002、pp.649〜658.
[4]ブチ(Buchi)M.、ウェック(Weck)W.:Generic Wrappers、In proceedings of ECOOP 2000、Lecture Notes in Computer Science、Vol.1850、Springer−Verlag、(2000)、pp.201〜225.
[5]ドミトリーブ(Dmitriev)M.:Safe Evolution of Large and Long−Lived Java Applications、PhD thesis、Department of Computing Science、University of Glasgow、Glasgow G12 8QQ、Scotland、2001.
[6]マラバーバ(Malabarba)S.、パンデイ(Pandey)R.、グラッグ(Gragg)J.、バール(Barr)E.、and バーンズ(Barnes)F.:Runtime Support for Type−Safe Dynamic Java Classes、In Proceedings of ECOOP’00、Lecture Notes in Computer Science、Vol.1850、Springer−Verlag、(2000)、pp.337〜361.
[7]スブラマニアン(Subramanian)S.、ヒックス(Hicks)M.、マッキンレイ(McKinley)K.:Dynamic Software Updates:A VM−centric Approach、In Proceedings
of the 2009 ACM SIGPLAN conference on Programming language design and implementation、ACM SIGPLAN Notices、Volume 44、Issue 6、May 2009、pp.1〜12
[8]グスタフソン(Gustavson),J.:Dynamic Updating
of Computer Programs − Proposed Improvements to the JDrums Updating System、Rise
publications 2005.
[9]ビアレク(Bialek),R.、ジュル(Jul),E.、J.−G.シュナイダ(Schneider),J.−G.、ジン(Jin),Y.:Partitioning of Java applications to support dynamic updates、In proceedings of APSEC’04、IEEE Computer Society Press、pp.616〜623.
[10]ヒャルムティソン(Hjalmtysson)G.、グレイ(Gray)R.:
Dynamic C++ classes、In Proceedings of the USENIX 1998 Annual Technical Conference、pages 65−76、USENIX Association、June 15−19 1998.
[11]スタネック(Stanek)J.、コタリ(Kothari)S.、ヌイェン(Nguyen)T.N.、クルズニエラ(Cruz−Neira)C.2006. Online Software Maintenance for Mission−Critical Systems、In Proceedings of ICSM’06、IEEE Computer Society 2006、pp.93−103.
[12]チェン(Chen)H.、ユウ(Yu)J.、チェン(Chen)R.、ザン(Zang)B.、イェウ(Yew)P.:POLUS:A Powerful Live
Updating System、In Proceedings ICSE’07、IEEE Computer Society 2007、pp.271−281.
ない場合には、実行レイヤは、ステップ3914でフォール・スルーする。というのは、フィールドが新規であり、したがって、フィールド値が、1つの対応するオブジェクトのみで既に一意に配置されるからである。
参考文献
[1]サトウ(Sato)Y.,チバ(Chiba)S.:Loosely−separated ”Sister” Namespaces in Java、In proceedings of ECOOP’05、Lecture Notes in Computer Science、Vol.3586、Springer−Verlag、(2005)、pp.49〜70.
[2]ドロッソポーロウ(Drossopoulou),S.、ラッグ(Wragg),D.、およびアイゼンバッハ(Eisenbach),S、1998、What is Java binary Compatibility?、In Proceedings of OOPSLA’98、ACM press、1998、pp.341〜361.
[3]オルソ(Orso)A.、ラオ(Rao)A.、ハロルド(Harrold)M.J.:A Technique for Dynamic Updating of Java Software、In:proceedings of ICSM’02、IEEE Computer Society、2002、pp.649〜658.
[4]ブチ(Buchi)M.、ウェック(Weck)W.:Generic Wrappers、In proceedings of ECOOP 2000、Lecture Notes in Computer Science、Vol.1850、Springer−Verlag、(2000)、pp.201〜225.
[5]ドミトリーブ(Dmitriev)M.:Safe Evolution of Large and Long−Lived Java Applications、PhD thesis、Department of Computing Science、University of Glasgow、Glasgow G12 8QQ、Scotland、2001.
[6]マラバーバ(Malabarba)S.、パンデイ(Pandey)R.、グラッグ(Gragg)J.、バール(Barr)E.、and バーンズ(Barnes)F.:Runtime Support for Type−Safe Dynamic Java Classes、In Proceedings of ECOOP’00、Lecture Notes in Computer Science、Vol.1850、Springer−Verlag、(2000)、pp.337〜361.
[7]スブラマニアン(Subramanian)S.、ヒックス(Hicks)M.、マッキンレイ(McKinley)K.:Dynamic Software Updates:A VM−centric Approach、In Proceedings
of the 2009 ACM SIGPLAN conference on Programming language design and implementation、ACM SIGPLAN Notices、Volume 44、Issue 6、May 2009、pp.1〜12
[8]グスタフソン(Gustavson),J.:Dynamic Updating
of Computer Programs − Proposed Improvements to the JDrums Updating System、Rise
publications 2005.
[9]ビアレク(Bialek),R.、ジュル(Jul),E.、J.−G.シュナイダ(Schneider),J.−G.、ジン(Jin),Y.:Partitioning of Java applications to support dynamic updates、In proceedings of APSEC’04、IEEE Computer Society Press、pp.616〜623.
[10]ヒャルムティソン(Hjalmtysson)G.、グレイ(Gray)R.:
Dynamic C++ classes、In Proceedings of the USENIX 1998 Annual Technical Conference、pages 65−76、USENIX Association、June 15−19 1998.
[11]スタネック(Stanek)J.、コタリ(Kothari)S.、ヌイェン(Nguyen)T.N.、クルズニエラ(Cruz−Neira)C.2006. Online Software Maintenance for Mission−Critical Systems、In Proceedings of ICSM’06、IEEE Computer Society 2006、pp.93−103.
[12]チェン(Chen)H.、ユウ(Yu)J.、チェン(Chen)R.、ザン(Zang)B.、イェウ(Yew)P.:POLUS:A Powerful Live
Updating System、In Proceedings ICSE’07、IEEE Computer Society 2007、pp.271−281.
Claims (37)
- アクティブに動作しているコンピュータ・システムに存在するクラスの前のバージョンのすべてのライブ・オブジェクトの、前記オブジェクトが前記クラスの前のバージョンからインスタンス化された後に動的にロードされた前記クラスの新しいバージョンの対応するオブジェクトのサロゲートオブジェクトへの透過的ランタイム・スイッチングの方法であって、オブジェクト・アイデンティティおよびクラス型代入可能性は、オブジェクトおよびクラスのサロゲートとその共存するバージョンとの間で共有され、前記方法は、
ソフトウェア更新を提供することであって、前記ソフトウェア更新は、現在動作しているシステムと前記新しいバージョンとの間の差を構成するクラス定義の変更セットのバイトコードを含む、提供することと;
新しいクラス定義の将来オンデマンド・インスタンス化される対応するオブジェクトの未初期化サロゲートになるために前記変更セット内のクラスからインスタンス化された現在ライブのオブジェクトの挙動を透過的にスイッチングすることによって、前記アクティブに動作しているコンピュータ・システムのノンブロッキング・ソフトウェア更新を実行することと;
更新されたサブクラスによって定義される拡張された挙動とオーバーライドされた挙動とのうちの少なくとも1つが更新されるブートストラップ・クラスの以前のバージョンの既にインスタンス化されたオブジェクトについて実現されるようにするために、前記ブートストラップ・クラスにバイトコードをインジェクトすることによって、前記ブートストラップ・クラスのアプリケーション・サブクラスに対する将来の更新のためにブートストラップ・クラスを準備するために、仮想マシンの固有のブートストラップ・クラスのプリブート・バイトコード変換を実行することと;
前記変換されたブートストラップ・クラスがアプリケーション・インスタンスの仮想マシン・ブートストラップ・クラスの新しいセットを構成するアプリケーション・インスタンスを実行することと;
仮想マシンにロードされるすべてのクラスのバイトコードのローディングをインターセプトすることと;
クラスローディングが開始された後に、連続するフェーズで、
対応する共存するオブジェクトおよびクラスの共有されるオブジェクト・アイデンティティおよびクラス型アイデンティティを可能にするために前記クラスの前記バイトコードを変換することと;
選択肢の間で、更新されたサブクラスによって定義される拡張された挙動とオーバーライドされた挙動とのうちの少なくとも1つが前記更新されたサブクラスの以前のバージョンの既にインスタンス化されたオブジェクトについて実現されるようにするためにシステム・クラスにバイトコードをインジェクトすることによって、前記システム・クラスのアプリケーション・サブクラスの将来の更新のために前記システム・クラスを準備するためにシステム・クラス定義のバイトコードをオンデマンドで変換することと;
アイデンティティおよび状態がノンブロッキングな形で自動的に転送される将来の対応するオブジェクトおよびクラスのサロゲートクラスおよびオブジェクトになるためにアプリケーション・クラスおよびそのインスタンスのランタイム・スイッチングを可能にする、前記アプリケーション・クラス自体へのバイトコードのインジェクトによって、前記アプリケーション・クラスを更新対応にするために前記アプリケーション・クラスのバイトコードを変換することと
を有する、方法。 - ライブ・オブジェクトの前記オブジェクト・アイデンティティおよび状態は、前記クラスの、より後のバージョンのオブジェクトの新しい対応するバージョンへの動的ソフトウェア更新の後の最初の使用時に対にされ、前記方法は、
更新されたクラス・バージョンの新しい未初期化対応オブジェクトをコンストラクトす
ることと;
対応するオブジェクトの一意アイデンティティidをコンストラクトし、オブジェクトの将来の機能強化されたアイデンティティ検査がその特定のバージョンに関わりなく対応するオブジェクトについて真をもたらすことを保証することと:
クラス更新の後の最初の使用時にオブジェクトの以前の対応するバージョンから状態を移植することと
を有する、
請求項1に記載の方法。 - 前記未初期化対応オブジェクトは、オブジェクト状態のうちで前記サロゲートオブジェクトにとって新規の部分を自動的に初期化し、前記方法は、
未初期化対応オブジェクトのコンストラクションをトリガした前記サロゲートオブジェクトにとって新規の前記状態の部分を初期化する生成されたバイトコード・メソッドをアプリケーション・クラスに挿入すること
を有する、
請求項2に記載の方法。 - 同一のクラスの異なるバージョンを表す複数のクラスは、共存することができ、前記方法は、
別々のクラスローダを用いて更新されたクラスをロードすることであって、したがって、同一のクラスを表す複数の型は前記仮想マシンにロードされる、ロードすることと;
言語によって定義される動的クラス型動作を実行するクラス内のバイトコードを、動的クラス検査動作のオペランドが同一の型名前空間を共有する対応するバージョンによって置換される動的クラス型検査を実行するバイトコードによって置換することと
を有する、
請求項1に記載の方法。 - メソッド呼出しのフォワーディングは、オブジェクトを、そのメンバへのすべてのアクセスを同一のクラスのより新しいバージョンの新しい対応するオブジェクトにフォワードするサロゲートに変換し、前記方法は、
複数の対応するオブジェクトのいずれかを参照するクライアントが必ずそれ自体のクラスローダの到達可能な型から代入可能な型を有するオブジェクトを見ることを保証するクラスのバイトコードを変換すること
を有し、
前記変換することは、
仮想マシン・バイトコード命令であるinstanceofを、前記instanceofの命令の右辺オペランドの型名前空間に従う特定の対応するオブジェクト表現に対するinstanceof検査を実行するバイトコードによって置換することと;
CHECKCASTと同等の仮想マシン・バイトコード命令を、前記CHECKCASTの命令の右辺オペランドの型名前空間に従う特定の対応するオブジェクト表現に対して前記CHECKCASTの命令を実行するバイトコードによって置換することと;
クラスおよびクラスの前にロードされたバージョンのオブジェクトを、すべての将来の要求を対応する新しいクラスおよびオブジェクトにリダイレクトするサロゲートにランタイム・スイッチングすることであって、新しい対応する表現から入手される可能な値は、サロゲートメンバの呼出し側の型名前空間に従うサロゲート表現によって置換され、前記リダイレクトする処理を制御する挿入されるバイトコードは、サロゲートメンバの呼出し側によって与えられたパラメータを、前記リダイレクトをする処理の受取り側の型名前空間に従う対応する表現によって置換する、ランタイム・スイッチングすることと
を有する、
請求項1に記載の方法。 - サロゲートオブジェクトから対応する新しいオブジェクトへのメソッド呼出の仮想マシン表現のキャッシングは、効率的なフォワーディングを可能にする、
請求項5に記載の方法。 - オブジェクト・アイデンティティは、同一のクラスの異なるバージョンのライブ・オブジェクトの間で共有され、前記方法は、
共有されるオブジェクト・アイデンティティを可能にするためにクラスのバイトコードを変換することであって、アイデンティティについてオブジェクトを比較する仮想マシン・バイトコード命令は、同一の型名前空間に属する対応するオブジェクト・バージョンを使用してアイデンティティ検査を実行するバイトコードによって置換される、変換すること
を有する、
請求項1に記載の方法。 - 状態は、同一のクラスの異なるバージョンからインスタンス化された複数の対応するオブジェクトの間で共有され、前記方法は、
同一のオブジェクトを表す対応するオブジェクトのセット内のどのオブジェクト・バージョンが現在個々の共有されるフィールド値を保持するのかをブックキーピングすることと;
宣言されたインスタンス・フィールドあたり1つの生成されるGETメソッド内および宣言されたインスタンス・フィールドあたり1つの生成されるSETメソッド内のフィールドアクセスをラップする、システム・クラス内のバイトコードを生成することと
を有し、
前記GETメソッドに挿入されるアルゴリズムは、
サロゲートオブジェクト上で呼び出される時に、標準コンストラクタから当初に作成された前記対応するオブジェクトにフィールド読取要求が委譲されることを、保証することを有し、
前記SETメソッドに挿入されるアルゴリズムは、
サロゲートオブジェクト上で呼び出される時に、標準コンストラクタから当初に作成された前記対応するオブジェクトにフィールド読取要求が委譲されることを、保証することを有し、
前記方法はさらに、
標準コンストラクタから当初に作成された前記対応するオブジェクト内のフィールドにアクセスするためにリフレクション的呼出を用いてインスタンス・フィールドにアクセスするためにバイトコード命令を置換する、ブートストラップ・クラス内のバイトコードを生成することと;
宣言されるフィールドあたり1つの生成されるGETメソッド内および宣言されるフィールドあたり1つの生成されるSETメソッド内のフィールドアクセスをラップする、アプリケーション・クラス内のバイトコードを生成することと
を有し、
前記GETメソッドに挿入されるアルゴリズムは、
サロゲートオブジェクト上で呼び出される時に、前記サロゲートオブジェクトの最新の対応するバージョンにフィールド読取要求がフォワードされることを保証することであって、前記最新の対応するオブジェクトから入手されるフィールド値は、前記サロゲートオブジェクトの型名前空間のフィールド値に変換される、保証することと;
前記フィールド値が前記最新の対応するオブジェクト内に現在存在しない場合に、対応するオブジェクト内で前記フィールド値が検索され、まず前記最新の対応するオブジェクトの型名前空間に変換することによって転送されることを保証することと;
前記フィールド値が前記最新の対応するオブジェクト内に存在する場合に、その間に更
新がなかった場合に前記フィールド値が読み取られ、返されることを保証することと;
フィールドあたり生成される前記GETメソッドを宣言するクラスの更新が、前記フィールド値が読み取られた後に発生する場合に、読取要求を前記サロゲートオブジェクトの前記最新の対応するバージョンにフォワードすることを保証することであって、前記最新の対応するオブジェクトから入手される前記フィールド値は、今のサロゲートオブジェクトの型名前空間のフィールド値に変換されることと
を有し、
前記SETメソッドに挿入されるアルゴリズムは、
サロゲートオブジェクト上で呼び出される時に、前記サロゲートオブジェクトの前記最新の対応するバージョンにフィールド書込要求がフォワードされることを保証することであって、前記最新の対応するオブジェクトにフォワードされる前記フィールド値は、前記最新の対応するオブジェクトの型名前空間のフィールド値に変換されることと;
前記フィールド値が前記最新の対応するオブジェクト内に現在存在しない場合に、前記フィールド値が書込まれ、前記フィールド値を前に保持した対応するオブジェクトが、見つけられ、前の状態をクリアするように要求されることを保証することと;
前記フィールド値が前記最新の対応するオブジェクト内に存在する場合に、その間に更新がなかった場合に前記フィールド値が書込まれることを保証することと;
フィールドあたり生成される前記SETメソッドを宣言するクラスの更新が、前記フィールド値が書込まれた後に発生する場合に、前記読取要求を前記サロゲートオブジェクトの前記最新の対応するバージョンにフォワードすることを保証することであって、前記最新の対応するオブジェクトにフォワードされる前記フィールド値は、前記最新の対応するオブジェクトの型名前空間のフィールド値に変換される、保証することと
を有する、
請求項1に記載の方法。 - 前のバージョンから前記最新の対応するオブジェクトへの状態の前記転送は、対応するオブジェクトによって共有される一時的ロック機構の下で実行される、
請求項8に記載の方法。 - 前の対応するバージョン内の状態の前記クリアは、対応するオブジェクトによって共有される一時的ロック機構の下で実行される、
請求項8に記載の方法。 - 共通同期化オブジェクトは、オブジェクトおよびそのサロゲートオブジェクトのグループへのスレッドに関する同期化されたアクセスを保証し、前記方法は、クラスのバイトコードを変換することを有し、
前記変換することは、
組込み同期化アクセス修飾子をバイトコードによって置換することであって、前記バイトコードは、メソッドの始めにMONITORENTER同等命令を挿入し、オリジナル・メソッド本体内でのキャッチされない例外に起因して発生する出口点を含むメソッドのすべての出口点にMONITOREXIT同等命令を挿入し、それに基づき同期化されるオブジェクトは、対応するオブジェクトおよびクラスについて同一であることと;
言語によって定義される同期化を実行する動作を、バイトコードによって置換することであって、前記バイトコードは、それに基づいて同期化されるオブジェクトを、対応するオブジェクトについて同一である一意に識別可能なオブジェクトによって交換することとを有する、
請求項1に記載の方法。 - オブジェクトは、そのメンバへのすべてのアクセスを前記クラスの最も新しいバージョンの対応するオブジェクトにフォワードすることによってサロゲートオブジェクトになり
、前記方法は、
アプリケーション・クラス内の各メソッドの始めに、バイトコードを挿入することであって、前記バイトコードは、サロゲートオブジェクトが使用可能な前記クラスの前記最も新しいバージョンからインスタンス化された前記対応するオブジェクトへの前記フォワードすることを自動的に適合させることを保証する
を有する、
請求項1に記載の方法。 - オブジェクトへのアクセスは、ランタイムにメソッド本体の定義を置換することによってフォワードされる、
請求項12に記載の方法。 - ライブ・オブジェクトは、スイッチ中に前記オブジェクト内でコードを現在実行しているスレッドを全くブロックせずにサロゲートオブジェクトに動的にスイッチされる、
請求項1に記載の方法。 - サロゲートオブジェクトは、前記クラスの最も新しいバージョンからインスタンス化されるオンデマンド・コンストラクトされる対応オブジェクトとともに、状態およびアイデンティティを共有する、
請求項1に記載の方法。 - 前記サロゲートオブジェクトは、前記クラスの最も新しいバージョンからインスタンス化されたオンデマンド・コンストラクトされた対応オブジェクトとともに、状態を共有する、
請求項1に記載の方法。 - 前記サロゲートオブジェクトは、前記クラスの最も新しいバージョンからインスタンス化されたオンデマンド・コンストラクトされた対応オブジェクトとともに、アイデンティティを共有する、
請求項1に記載の方法。 - サロゲートオブジェクトのクライアントは、前記サロゲートオブジェクトのクラスの型への1つまたは複数の参照を保持するが、使用可能な最も新しい対応クラス・バージョンへのサロゲートメンバのフォワーディングを介して前記クラスの最も新しいバージョンのメソッド本体を使用する、
請求項1に記載の方法。 - クラスのバイトコード変換は、オブジェクト状態を読み取るためにすべてのリフレクション的機構を、宣言するクラス内の関連する生成されたGETメソッドを呼び出すバイトコードによって直接に置換する、
請求項1に記載の方法。 - クラスのバイトコード変換は、オブジェクト状態を書込むためにすべてのリフレクション的機構を、宣言するクラス内の関連する生成されたSETメソッドを呼び出すバイトコードによって直接に置換する、
請求項1に記載の方法。 - アプリケーション・クラスのバイトコード変換は、クラス初期化メソッドの始めにバイトコードを挿入することによって、前記クラスの以前のバージョンが前記仮想マシンに前にロードされている場合にクラス初期化メソッド内のオリジナル・コードが実行されない
ことを保証する、
請求項1に記載の方法。 - クラスのバイトコード変換は、オブジェクト・コンストラクタの始めにバイトコードを挿入することによって、コンストラクションが宣言するコンストラクタのサブクラスのサロゲートインスタンスに対して発生する場合に、コンストラクタが、オリジナル・コードを実行せず、コンストラクタ呼出を前記クラスの最も新しいバージョンの前記対応するオブジェクトにリダイレクトしないことを保証する、
請求項1に記載の方法。 - クラスの前記バイトコード変換は、オブジェクト・ファイナライザの始めにバイトコードを挿入することによって、ファイナライゼーションがサロゲートオブジェクトに対して発生する場合に、ファイナライザが、オリジナル・コードを実行せず、ファイナライズ呼出を最も新しい対応するオブジェクトにリダイレクトしないことを保証するために、
請求項1に記載の方法。 - クラスの前記バイトコード変換は、言語によって定義されるクローン作成のオカレンスをバイトコードによって置換し、前記バイトコードは、作成されるクローンがクローンを作成されるオブジェクトのすべての対応するオブジェクトによって共有される状態と同等の状態を含むことを保証する
請求項1に記載の方法。 - クラスの前記バイトコード変換は、オブジェクト・シリアル化のオカレンスをバイトコードによって置換し、前記バイトコードは、シリアル化されるオブジェクトを最新の対応するオブジェクトによって置換し、
前記挿入されるバイトコードは、共有されるオブジェクト状態が、前記シリアル化の処理を継続する前に前記最新の対応するオブジェクトに転送されることを保証する、
請求項1に記載の方法。 - クラスの前記バイトコード変換は、配列にアクセスする命令を、アクセス要求を最新の対応する配列オブジェクトにリダイレクトするバイトコードによって置換し、前記方法は、
置換された配列読取動作によって入手される値を、呼出し側クラスの型名前空間の値に変換することと;
置換された配列書込動作で使用される値を、最新の対応する配列オブジェクト型名前空間の値に変換することと
を有する、
請求項1に記載の方法。 - 動的にロードされたクラスの新しいバージョンの型情報は、前記クラスの前にロードされたバージョンの継承階層とは異なる継承階層を示す、
請求項1に記載の方法。 - 動的にロードされたクラスの新しいバージョンの型情報は、前記クラスの前にロードされたバージョンのインターフェースとは異なるインターフェースを示す、
請求項1に記載の方法。 - 動的にロードされたクラスの新しいバージョンのメソッド宣言は、前記クラスの前にロードされたバージョンのメソッド宣言とは異なる、
請求項1に記載の方法。 - 動的にロードされたクラスの新しいバージョンのフィールド宣言は、前記クラスの前にロードされたバージョンのフィールド宣言とは異なる、
請求項1に記載の方法。 - 前記クラスは、コンパイル中に静的に型検査される、
請求項1に記載の方法。 - クラスは、バイトコードによって表される、
請求項1に記載の方法。 - 代替ブートクラス・パスを提供せずに前記仮想マシンを始動することは、ブートストラップ・クラスの静的バイトコード変換を開始し、前記方法は、
・既にロードされているブートストラップ・クラスのバイトコードを変換することと;
・結果の変更されたブートストラップ・クラスを代替ブートクラス・パスに格納することと;
・バイトコード変換の完了時にプログラム・コードのさらなる実行をすべて放棄し、効果的にコンピュータ・プログラムを終了させることと
を有する、
請求項1に記載の方法。 - 代替ブートクラス・パスを伴って前記仮想マシンを始動することは、ブートストラップ・クラスの代替セットを用いて前記仮想マシンのブートを開始する、
請求項1に記載の方法。 - 代替ブートクラス・パスを提供せずに前記仮想マシンを始動することは、ブートストラップ・クラスの動的バイトコード変換を開始し、前記方法は、
・既にロードされているブートストラップ・クラスのバイトコードを変換することと;
・結果の変更されたブートストラップ・クラスを、代替ブートクラス・パスに格納することと;
・前記仮想マシンの特殊なプログラム・スタートアップ・メソッドを宣言するすべての非ブートストラップ・クラスのバイトコードのロードをインターセプトすることによって、前記特殊なプログラム・スタートアップ・メソッドにハンドリングされるプログラム入力引数をインターセプトするためのバイトコードを挿入することと;
・すべてのプログラム入力引数を提供して新しい仮想マシン・インスタンスを始動することであって、オプションの仮想マシン引数は、前記代替ブートクラス・パスを含む、始動することと;
・前記新しい仮想マシン・インスタンスが終了するのを待ち、アウェイクした後に、プログラム・コードのさらなる実行をすべて放棄し、効果的にコンピュータ・プログラムを終了させることと
を有する、
請求項1に記載の方法。 - コンピュータ・プログラム製品であって、前記コンピュータ・プログラム製品は、
・コンピュータ使用可能媒体と;
・アクティブに動作するコンピュータ・システム内のソフトウェア・モジュールを動的にリフレッシュするために前記コンピュータ使用可能媒体上で実施された、請求項1乃至35のいずれか1項のステップを実行するようにコンピュータに指示するコンピュータ可読命令と
を備える、コンピュータ・プログラム製品。 - システムであって、前記システムは、クラスがバイトコードによって表される静的に型付けされたクラスベースのオブジェクト指向プログラミング言語で記述されたアクティブに動作するコンピュータ・ソフトウェアのノンブロッキング動的更新を可能にするためにコンピュータ内で実施され、
前記システムは、請求項1乃至35のいずれか1項のステップを実行する手段からなる、システム。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US28775009P | 2009-12-18 | 2009-12-18 | |
US61/287,750 | 2009-12-18 | ||
PCT/EP2010/067612 WO2011072970A1 (en) | 2009-12-18 | 2010-11-16 | Method, computer program product, and system for non-blocking dynamic update of statically typed class-based object-oriented software |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2013514569A true JP2013514569A (ja) | 2013-04-25 |
Family
ID=43797834
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012543561A Pending JP2013514569A (ja) | 2009-12-18 | 2010-11-16 | 静的に型付けされたクラスベースのオブジェクト指向ソフトウェアのノンブロッキング動的更新の方法、コンピュータ・プログラム製品、およびシステム |
Country Status (5)
Country | Link |
---|---|
US (2) | US8707287B2 (ja) |
EP (1) | EP2513787A1 (ja) |
JP (1) | JP2013514569A (ja) |
CN (1) | CN102725730A (ja) |
WO (1) | WO2011072970A1 (ja) |
Families Citing this family (99)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8095921B2 (en) * | 2005-10-12 | 2012-01-10 | International Business Machines Corporation | Identifying code that wastes time switching tasks |
US8898627B2 (en) * | 2010-05-11 | 2014-11-25 | Smartshift Gmbh | Systems and methods for applying rules to transform objects of an application |
US8650532B2 (en) * | 2010-05-11 | 2014-02-11 | Microsoft Corporation | Change notification and information update based on uncompiled software development project |
US8769518B1 (en) | 2010-06-29 | 2014-07-01 | Ca, Inc. | Ensuring determinism during programmatic replay in a virtual machine |
JP5368490B2 (ja) * | 2011-01-24 | 2013-12-18 | 株式会社ソニー・コンピュータエンタテインメント | 情報処理装置 |
JP2012163994A (ja) * | 2011-02-03 | 2012-08-30 | Nec Corp | ソフトウェア管理システム、ソフトウェア管理装置、制御方法、及びプログラム |
US9170825B2 (en) * | 2011-04-21 | 2015-10-27 | Oracle International Corporation | Interface method resolution for virtual extension methods |
US8819660B2 (en) * | 2011-06-29 | 2014-08-26 | Microsoft Corporation | Virtual machine block substitution |
CN102222005B (zh) * | 2011-07-12 | 2013-10-30 | 铜陵玉成软件科技有限责任公司 | 面向业务模型的软件运行平台、运行方式及一种开发方法 |
CA2759516C (en) * | 2011-11-24 | 2019-12-31 | Ibm Canada Limited - Ibm Canada Limitee | Serialization of pre-initialized objects |
US9639329B2 (en) * | 2012-06-15 | 2017-05-02 | Syddansk Universitet | System and method for automatic invocation of constructor code for superclasses |
US8972971B2 (en) | 2012-08-09 | 2015-03-03 | International Business Machines Corporation | Image instance mapping |
US9817656B2 (en) | 2012-08-24 | 2017-11-14 | Ca, Inc. | Hot rollback of updated agent |
US9798557B2 (en) * | 2012-08-24 | 2017-10-24 | Ca, Inc. | Injection of updated classes for a java agent |
US11347498B2 (en) * | 2013-02-26 | 2022-05-31 | Red Hat, Inc. | Bytecode modification |
US9286055B1 (en) * | 2013-04-03 | 2016-03-15 | Amdocs Software Systems Limited | System, method, and computer program for aggregating fragments of data objects from a plurality of devices |
US20140330691A1 (en) * | 2013-05-01 | 2014-11-06 | Life Dreams, Inc. | Devices, methods and systems related to automation that provides financial planning advice |
US9298448B2 (en) * | 2013-05-21 | 2016-03-29 | Red Hat, Inc. | System and method for run time dependency resolution |
US9697003B2 (en) | 2013-06-07 | 2017-07-04 | Advanced Micro Devices, Inc. | Method and system for yield operation supporting thread-like behavior |
US9411617B2 (en) * | 2013-10-03 | 2016-08-09 | ZeroTurnaround AS | System and method for matching synthetically generated inner classes and methods |
US9563569B2 (en) | 2014-01-28 | 2017-02-07 | Red Hat Israel, Ltd. | Memory transformation in virtual machine live migration |
US9785378B2 (en) | 2014-01-28 | 2017-10-10 | Red Hat Israel, Ltd. | Tracking transformed memory pages in virtual machine chain migration |
US9652270B2 (en) * | 2014-03-21 | 2017-05-16 | Intel Corporation | Apparatus and method for virtualized computing |
US9384019B2 (en) * | 2014-03-25 | 2016-07-05 | International Business Machines Corporation | Dynamic code injection |
JP6379654B2 (ja) * | 2014-05-15 | 2018-08-29 | 富士通株式会社 | 処理実行プログラム、処理実行方法、及び情報処理装置 |
GB2527060B (en) * | 2014-06-10 | 2021-09-01 | Arm Ip Ltd | Method and device for updating software executed from non-volatile memory |
US9626212B2 (en) | 2014-06-28 | 2017-04-18 | Vmware, Inc. | Live migration of virtual machines with memory state sharing |
US9898320B2 (en) | 2014-06-28 | 2018-02-20 | Vmware, Inc. | Using a delta query to seed live migration |
US10671545B2 (en) | 2014-06-28 | 2020-06-02 | Vmware, Inc. | Asynchronous encryption and decryption of virtual machine memory for live migration |
US9760443B2 (en) | 2014-06-28 | 2017-09-12 | Vmware, Inc. | Using a recovery snapshot during live migration |
US9672120B2 (en) | 2014-06-28 | 2017-06-06 | Vmware, Inc. | Maintaining consistency using reverse replication during live migration |
US9766930B2 (en) | 2014-06-28 | 2017-09-19 | Vmware, Inc. | Using active/passive asynchronous replicated storage for live migration |
US20160085513A1 (en) * | 2014-09-19 | 2016-03-24 | Microsoft Corporation | Loading Code in Self-Contained Applications |
US9535666B2 (en) * | 2015-01-29 | 2017-01-03 | AppDynamics, Inc. | Dynamic agent delivery |
US9519468B2 (en) * | 2015-02-13 | 2016-12-13 | Oracle International Corporation | Modular co-versioning in a dynamically linked runtime environment |
US10146522B1 (en) * | 2015-03-10 | 2018-12-04 | Twitter, Inc. | Live code updates |
US9652220B2 (en) * | 2015-05-11 | 2017-05-16 | Sap Portals Israel Ltd. | Zero down-time deployment of new application versions |
US9733993B2 (en) | 2015-07-02 | 2017-08-15 | Microsoft Technology Licensing, Llc | Application sharing using endpoint interface entities |
US9785484B2 (en) | 2015-07-02 | 2017-10-10 | Microsoft Technology Licensing, Llc | Distributed application interfacing across different hardware |
US10198252B2 (en) | 2015-07-02 | 2019-02-05 | Microsoft Technology Licensing, Llc | Transformation chain application splitting |
US9712472B2 (en) | 2015-07-02 | 2017-07-18 | Microsoft Technology Licensing, Llc | Application spawning responsive to communication |
US10261985B2 (en) | 2015-07-02 | 2019-04-16 | Microsoft Technology Licensing, Llc | Output rendering in dynamic redefining application |
US9733915B2 (en) | 2015-07-02 | 2017-08-15 | Microsoft Technology Licensing, Llc | Building of compound application chain applications |
US9860145B2 (en) | 2015-07-02 | 2018-01-02 | Microsoft Technology Licensing, Llc | Recording of inter-application data flow |
US9658836B2 (en) * | 2015-07-02 | 2017-05-23 | Microsoft Technology Licensing, Llc | Automated generation of transformation chain compatible class |
US10198405B2 (en) | 2015-07-08 | 2019-02-05 | Microsoft Technology Licensing, Llc | Rule-based layout of changing information |
US10031724B2 (en) | 2015-07-08 | 2018-07-24 | Microsoft Technology Licensing, Llc | Application operation responsive to object spatial status |
US10078497B2 (en) | 2015-07-24 | 2018-09-18 | Oracle International Corporation | Bridging a module system and a non-module system |
US9626171B2 (en) | 2015-07-24 | 2017-04-18 | Oracle International Corporation | Composing a module system and a non-module system |
US10061684B2 (en) * | 2015-07-31 | 2018-08-28 | Microsoft Technology Licensing, Llc | Enhanced service validation |
US10158647B2 (en) * | 2015-08-25 | 2018-12-18 | Oracle International Corporation | Permissive access control for modular reflection |
US10277582B2 (en) | 2015-08-27 | 2019-04-30 | Microsoft Technology Licensing, Llc | Application service architecture |
US9921838B2 (en) * | 2015-10-02 | 2018-03-20 | Mediatek Inc. | System and method for managing static divergence in a SIMD computing architecture |
US9852045B2 (en) * | 2015-10-13 | 2017-12-26 | International Business Machines Corporation | Debugging program code |
US20170139681A1 (en) | 2015-11-13 | 2017-05-18 | International Business Machines Corporation | Class splitting in object-oriented environments |
WO2017106379A1 (en) | 2015-12-14 | 2017-06-22 | Pivotal Software, Inc. | Workload management in distributed database systems |
US9977786B2 (en) | 2015-12-23 | 2018-05-22 | Github, Inc. | Distributed code repository with limited synchronization locking |
US11593342B2 (en) | 2016-02-01 | 2023-02-28 | Smartshift Technologies, Inc. | Systems and methods for database orientation transformation |
CN105787367B (zh) * | 2016-02-23 | 2018-09-21 | 华中科技大学 | 一种软件更新的补丁安全性检测方法及系统 |
CN105787306A (zh) * | 2016-03-03 | 2016-07-20 | 山东超越数控电子有限公司 | 一种基于android系统的应用程序加固系统及方法 |
US10394528B2 (en) | 2016-03-30 | 2019-08-27 | Oracle International Corporation | Returning a runtime type loaded from an archive in a module system |
US10191753B2 (en) | 2016-03-30 | 2019-01-29 | Oracle International Corporation | Generating verification metadata and verifying a runtime type based on verification metadata |
US10585655B2 (en) | 2016-05-25 | 2020-03-10 | Smartshift Technologies, Inc. | Systems and methods for automated retrofitting of customized code objects |
US10635420B2 (en) | 2016-07-12 | 2020-04-28 | Oracle International Corporation | Overriding a migrated method in an updated type |
US11354419B2 (en) * | 2016-07-29 | 2022-06-07 | Sap Se | Encryption of application data using field-level metadata |
US10089103B2 (en) | 2016-08-03 | 2018-10-02 | Smartshift Technologies, Inc. | Systems and methods for transformation of reporting schema |
CN106406928B (zh) * | 2016-08-24 | 2019-08-09 | 北京奇艺世纪科技有限公司 | 一种软件热插拔方法及系统 |
US10387142B2 (en) | 2016-09-16 | 2019-08-20 | Oracle International Corporation | Using annotation processors defined by modules with annotation processors defined by non-module code |
US10360008B2 (en) | 2016-09-16 | 2019-07-23 | Oracle International Corporation | Metadata application constraints within a module system based on modular encapsulation |
CN107025105B (zh) * | 2016-09-23 | 2020-10-16 | 阿里巴巴集团控股有限公司 | 代码生成方法及装置 |
JP6411696B1 (ja) * | 2016-12-13 | 2018-10-24 | 株式会社日立製作所 | バージョン管理システムおよびバージョン管理方法 |
US10848410B2 (en) | 2017-03-29 | 2020-11-24 | Oracle International Corporation | Ranking service implementations for a service interface |
CN108664796B (zh) * | 2017-03-29 | 2020-06-05 | 中移(杭州)信息技术有限公司 | 一种so文件保护方法及装置 |
US11496506B2 (en) * | 2017-07-03 | 2022-11-08 | Denso Corporation | Program generation method and electronic control unit for changing importance of functions based on detected operation state in a vehicle |
US10795646B2 (en) * | 2017-07-07 | 2020-10-06 | Vmware, Inc. | Methods and systems that generate proxy objects that provide an interface to third-party executables |
FR3070775B1 (fr) * | 2017-09-04 | 2019-08-23 | Vsora | Allocation dynamique utilisant plusieurs piles |
US10698674B2 (en) | 2018-02-06 | 2020-06-30 | Smartshift Technologies, Inc. | Systems and methods for entry point-based code analysis and transformation |
US10740075B2 (en) * | 2018-02-06 | 2020-08-11 | Smartshift Technologies, Inc. | Systems and methods for code clustering analysis and transformation |
US10528343B2 (en) | 2018-02-06 | 2020-01-07 | Smartshift Technologies, Inc. | Systems and methods for code analysis heat map interfaces |
US11531531B1 (en) | 2018-03-08 | 2022-12-20 | Amazon Technologies, Inc. | Non-disruptive introduction of live update functionality into long-running applications |
EP3582103A1 (en) * | 2018-06-14 | 2019-12-18 | QlikTech International AB | Methods and systems for application program interface management |
US11301224B1 (en) * | 2019-04-30 | 2022-04-12 | Automation Anywhere, Inc. | Robotic process automation system with a command action logic independent execution environment |
US10908924B2 (en) * | 2019-05-01 | 2021-02-02 | Intuit Inc. | System and methods for loading objects from hash chains |
US11296867B2 (en) * | 2019-05-01 | 2022-04-05 | Intuit Inc. | Systems and methods for hash chain migration |
CN110162477B (zh) * | 2019-05-28 | 2022-11-22 | 山东财经大学 | 一种第三方库版本升级的异常自动调试系统及方法 |
CN110333893B (zh) * | 2019-06-28 | 2023-04-18 | 百度在线网络技术(北京)有限公司 | 应用程序的修复方法、装置、设备和存储介质 |
CN110781081B (zh) * | 2019-10-12 | 2024-04-09 | 南京信息职业技术学院 | 一种移动应用回调强制触发方法、系统及存储介质 |
US10977027B1 (en) | 2020-05-07 | 2021-04-13 | Hcl Technologies Limited | System and method of deploying java agents in runtime |
CN113625995A (zh) * | 2020-05-07 | 2021-11-09 | 武汉斗鱼网络科技有限公司 | 一种自适应获取数据的方法和装置 |
CN111760293B (zh) * | 2020-07-07 | 2024-02-09 | 网易(杭州)网络有限公司 | 时间轴工具的资源动态加载方法及装置、电子设备 |
US11693837B2 (en) | 2020-09-18 | 2023-07-04 | Databricks, Inc. | Model ML registry and model serving |
CN114764484A (zh) * | 2021-01-13 | 2022-07-19 | 武汉斗鱼网络科技有限公司 | 懒加载实现方法、装置、电子设备和存储介质 |
CN112925523B (zh) * | 2021-03-02 | 2024-06-21 | 京东科技控股股份有限公司 | 对象比较方法、装置、设备及计算机可读介质 |
US11755313B2 (en) * | 2021-07-12 | 2023-09-12 | Microsoft Technology Licensing, Llc | Implementing changes made to source code of reloadable types at runtime |
CN113419766B (zh) * | 2021-07-21 | 2023-07-21 | 厦门市易联众易惠科技有限公司 | 智能更新程序逻辑的方法、装置、设备及存储介质 |
KR20240051986A (ko) * | 2021-08-31 | 2024-04-22 | 넛크래커 테라퓨틱스 인코포레이티드 | 상태 머신 기반 스크립트 애플리케이션 및 시스템 |
CN114296775B (zh) * | 2022-03-09 | 2022-07-19 | 南京易联阳光信息技术股份有限公司 | 基于大数据的智能运维方法及系统 |
CN116932008B (zh) * | 2023-09-12 | 2023-12-08 | 湖南速子文化科技有限公司 | 虚拟社会模拟的组件数据更新方法、装置、设备及介质 |
CN117632198B (zh) * | 2024-01-26 | 2024-05-07 | 深圳乐木骆科技有限公司 | 固件升级方法、设备、存储介质及装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6584612B1 (en) * | 1999-07-15 | 2003-06-24 | International Business Machines Corporation | Transparent loading of resources from read-only memory for an application program |
US6629315B1 (en) | 2000-08-10 | 2003-09-30 | International Business Machines Corporation | Method, computer program product, and system for dynamically refreshing software modules within an actively running computer system |
GB0414983D0 (en) * | 2004-07-03 | 2004-08-04 | Ibm | A method for replacing code in a running object oriented program |
US7530077B2 (en) | 2004-10-07 | 2009-05-05 | International Business Machines Corporation | Dynamic update of changing data in user application via mapping to broker topic |
US8225311B1 (en) * | 2006-03-30 | 2012-07-17 | Emc Corporation | Deploying and distributing content management code |
-
2010
- 2010-11-16 CN CN2010800624927A patent/CN102725730A/zh active Pending
- 2010-11-16 WO PCT/EP2010/067612 patent/WO2011072970A1/en active Application Filing
- 2010-11-16 US US13/130,524 patent/US8707287B2/en active Active
- 2010-11-16 EP EP10784741A patent/EP2513787A1/en not_active Withdrawn
- 2010-11-16 JP JP2012543561A patent/JP2013514569A/ja active Pending
-
2014
- 2014-03-05 US US14/197,934 patent/US9015659B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US9015659B2 (en) | 2015-04-21 |
US20110283256A1 (en) | 2011-11-17 |
US20140189672A1 (en) | 2014-07-03 |
WO2011072970A1 (en) | 2011-06-23 |
EP2513787A1 (en) | 2012-10-24 |
CN102725730A (zh) | 2012-10-10 |
US8707287B2 (en) | 2014-04-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8707287B2 (en) | Method, computer program product, and system for non-blocking dynamic update of statically typed class-based object-oriented software | |
Orso et al. | A technique for dynamic updating of Java software | |
US7784044B2 (en) | Patching of in-use functions on a running computer system | |
US5848274A (en) | Incremental byte code compilation system | |
Pukall et al. | JavAdaptor—Flexible runtime updates of Java applications | |
US11249758B2 (en) | Conditional branch frame barrier | |
US10140119B2 (en) | Modular serialization | |
US9417931B2 (en) | Unified metadata for external components | |
US10789047B2 (en) | Returning a runtime type loaded from an archive in a module system | |
US10417024B2 (en) | Generating verification metadata and verifying a runtime type based on verification metadata | |
Gregersen et al. | Dynamic update of Java applications—balancing change flexibility vs programming transparency | |
Würthinger et al. | Unrestricted and safe dynamic code evolution for Java | |
US9411617B2 (en) | System and method for matching synthetically generated inner classes and methods | |
US6810519B1 (en) | Achieving tight binding for dynamically loaded software modules via intermodule copying | |
Tilevich et al. | NRMI: Natural and efficient middleware | |
US20180268158A1 (en) | Identifying permitted illegal access operations in a module system | |
US8490115B2 (en) | Ambient state for asynchronous methods | |
Gregersen et al. | Towards a Dynamic-update-enabled JVM | |
Bieniusa et al. | The architecture of the DecentVM: Towards a decentralized virtual machine for many-core computing | |
Ma et al. | Efficient Scheduler Live Update for Linux Kernel with Modularization | |
Lee et al. | Java-based component framework for dynamic reconfiguration | |
Wernli et al. | Incremental dynamic updates with first-class contexts | |
Cheung | Lasy schema evolution in object-oriented databases | |
Chen et al. | Dynamic Reconfiguration on Java Internship bibliography | |
Renouf | The IBM J9 Java Virtual Machine for Java 6 |