以下の説明において、本発明をより完全に理解するために、ロジックの具現化、opコード、オペランドを指定する手段、リソースの区分化/分担/複製の具現化、システムコンポーネントの形式及び相互関係、並びにロジックの区分化/一体化の選択のような多数の特定の細部について述べる。しかしながら、当業者であれば、このような特定の細部を伴わずに本発明を実施できることが明らかであろう。他の点では、本発明を不明瞭にしないため、制御構造、データ構造、及び全ソフトウェアインストラクションシーケンスは、詳細に示さない。当業者であれば、過度の実験を行わなくても、ここに含まれた説明で、適切な機能を具現化することができるであろう。
特に指示のない限り、(分割の破線を除いて)図中の破線は、図中でオプションアイテムを表すのに使用される。しかしながら、破線を使用して全てのオプションアイテムを示すことを想定してはおらず、破線で示されたものは、種々の理由で選択されたものである(例えば、より明瞭にするために、容易に示すことができる、等)。
本明細書において、「1つの実施形態」、「一実施形態」、「例示的な実施形態」、等は、ここに述べる実施形態が、特定の特徴、構造又は特性を含むが、各々の実施形態が、必ずしも、特定の特徴、構造又は特性を含まなくてもよいことを指示する。更に、このような句は、必ずしも、同じ実施形態を指すものではない。更に、特定の特徴、構造又は特性が、ある実施形態に関連して説明されるときには、他の実施形態が明確に説明されるかどうかに関わらず、他の実施形態に関連してこのような特徴、構造又は特性に作用を及ぼすことも、当業者の知識の中でなし得るものとする。
以下の説明及び特許請求の範囲において、「結合(coupled)」及び「接続(connected)」という語は、その派生語と共に、使用することができる。これらの語は、互いに類義語として意図されないことを理解されたい。むしろ、特定の実施形態において、「接続」は、2つ以上のエレメントが互いに物理的又は電気的に直接接触することを示すのに使用される。「結合」は、2つ以上のエレメントが直接物理的又は電気的に接触していることを意味する。しかしながら、「結合」は、2つ以上のエレメントが互いに直接的に接触していないが、それでも、互いに協働又は相互作用することも意味する。
あるケースでは、フローチャートのオペレーションを、他のブロック図の例示的な実施形態を参照して説明する。しかしながら、フローチャートのオペレーションは、他のブロック図を参照して述べるもの以外の本発明の実施形態によって遂行することができ、且つ他のブロック図を参照して述べる本発明の実施形態は、フローチャートを参照して述べるもの以外のオペレーションを遂行できることを理解されたい。
図示された技術は、1つ以上のコンピュータに記憶されて実行されるコード及びデータを使用して具現化することができる。このようなコンピュータは、マシン読み取り可能な媒体、例えば、マシン記憶媒体(例えば、磁気ディスク、光学ディスク、ランダムアクセスメモリ、リードオンリメモリ、フラッシュメモリ装置)、及びマシン通信媒体(例えば、電気的、光学的、音響的、又は他の形態の伝播信号、例えば、搬送波、赤外線信号、デジタル信号、等)を使用して、コード及びデータを記憶し通信する(内部で及びネットワークを経て他のコンピュータと)。更に、このようなコンピュータは、典型的に、1つ以上の他のコンポーネント、例えば、記憶装置、多数のユーザ入力/出力装置(例えば、キーボード及びディスプレイ)、及びネットワーク接続部に結合された1つ以上のプロセッサのセットを含む。プロセッサのセット及び他のコンポーネントの結合は、典型的に、1つ以上のバス及びブリッジ(バスコントローラとも称される)を通して行われる。記憶装置及びネットワークトラフィックは、各々、1つ以上のマシン記憶媒体及びマシン通信媒体を表す。従って、所与のコンピュータシステムの記憶装置は、典型的に、そのコンピュータの1つ以上のプロセッサのセットにおいて実行されるコード及びデータを記憶する。もちろん、本発明の一実施形態の1つ以上の部分は、ソフトウェア、ファームウェア及び/又はハードウェアの異なる組合せを使用して具現化することができる。
概略
本発明の1つの態様によれば、プロデューサは、少なくとも特定のインスタンス(又はオブジェクト)及び特定のメソッドであり、プロデューサがランタイム中に実行される場合には、特定のメソッドが特定のインスタンスにおいて実行される。従って、所与のプロデューサは、所与のインスタンス、及びそのインスタンスに関連した所与のメソッドからインスタンス生成される。クラス、インスタンス及びメソッドと同様に、プロデューサは、ランタイムにより操作される基本的エレメント又はコンストラクトである。従って、プロデューサのインスタンス生成がランタイムによって解釈されて追跡され、従って、ランタイムは、プロデューサにより表わされたインスタンス及びメソッドの組合せを追跡する。換言すれば、プロデューサは、ランタイムインスタンス生成可能な構造であって、これは、ランタイムにより追跡され、即ちランタイムにより実行され、且つ少なくともインスタンスと、そのインスタンスに関連したメソッドとを含み、プロデューサのランタイム実行の結果として、プロデューサのメソッドがプロデューサのインスタンスにおいて実行されるようになる。又、プロデューサのメソッドには、0以上のプロデューサ依存性のセットで、所与のプロデューサに対する0以上のプロデューサのセットを識別するプロデューサ依存性宣言が関連付けられる。より詳細には、プロデューサ依存性は、プロデューサ依存性宣言を使用してメソッドに対して宣言され、所与のメソッドに対するプロデューサ依存性宣言は、0以上のプロデューサ依存性を含み、そして各プロデューサ依存性は、0以上のプロデューサのセットを識別する。従って、プロデューサ依存性宣言、及びそれらが定義するプロデューサ依存性は、ランタイムによって解釈されて追跡され、従って、ランタイムは、プロデューサ依存性宣言により指示されたプロデューサ間の関係を追跡する。
所与のプロデューサが、1つ以上の他のプロデューサのセットに依存する場合には、ランタイムは、所与のプロデューサの前に、他のプロデューサのセットの実行を保証する。従って、プロデューサ依存性宣言は、プロデューサ間の実行関係を表し、一方、プロデューサは、実行されるべきオペレーション(メソッド)及びインスタンスを表す。本発明のある実施形態では、子プロデューサに対する親プロデューサの依存性を、親プロデューサのメソッドに関連したプロデューサ依存性宣言において宣言できる(親プロデューサのプロデューサ依存性宣言が子プロデューサを識別する−ここでは、ダウン方向に宣言されたと称される)が、本発明の他の実施形態では、子プロデューサ(1つ又は複数)のメソッド(1つ又は複数)に関連したプロデューサ依存性宣言において依存性を宣言することもできる(子プロデューサのプロデューサ依存性宣言が1つ以上の親プロデューサを識別する−ここでは、アップ方向に宣言されたと称される)。
本発明の異なる実施形態では、プロデューサは、付加的なものを識別する。例えば、本発明のある実施形態では、プロデューサは、少なくともインスタンスと、そのインスタンスに関連したメソッドとを含むが、本発明の他の実施形態では、プロデューサは、クラス、そのクラスのインスタンス、及びそのインスタンスに関連したメソッドである(例えば、あるプロデューサは、クラス、インスタンス、及びメソッドを直接含み、又、あるプロデューサは、インスタンス及びメソッドを直接含むが、リファレンス(例えば、インスタンスにおけるリファレンス)を通してそのインスタンスのクラスを間接的に識別する)。本発明は、異なるプログラミング言語で書かれたコード(例えば、リフレクティブなオブジェクト指向の言語で書かれたオブジェクト指向のコード、リフレクティブなオブジェクトベースの言語で書かれたオブジェクト指向のコード、手続き型、非リフレクティブなオブジェクト指向、非リフレクティブなオブジェクトベースの言語で書かれて、リフレクティブなオブジェクト指向の言語コードへ変換されたコード)のコンテクストに使用されるが、本発明の実施形態は、リフレクティブなオブジェクト指向のプログラミング言語を参照すると共に、クラス、インスタンス及びメソッドを直接含むプロデューサを参照して、一例として、非限定的に、説明する。又、本発明の一実施形態では、プロデューサのメソッドがインスタンスメソッド(引数として受け取られる入力に加えてインスタンスフィールドを使用できるメソッド)であるが、本発明の別の実施形態は、それに加えて又はそれとは別に、クラスメソッド(全ての入力を引数として受け取り及び/又はインスタンス独立変数を使用するメソッド)であるプロデューサのメソッドをサポートすることもできる(プロデューサのメソッドがインスタンスメソッドである場合には、そのプロデューサのインスタンスは、クラスのインスタンスであるが、プロデューサのメソッドがクラスメソッドである場合には、そのプロデューサのインスタンスは、クラスを表すメタクラスインスタンスである)。
図1Aは、本発明の一実施形態により、オブジェクト指向のソースコードにおけるクラスのメソッドに対するプロデューサ依存性宣言と、そのクラス、そのクラスの所与のインスタンス、及びそのクラスのメソッドを含むプロデューサとの関係を示すブロック図である。図1Aにおいて、オブジェクト指向のソースコード100は、クラス102を含むように示され、このクラスは、次いで、メソッド104、実行モード設定105、及びメソッド104に対するプロデューサ依存性宣言106を含む。もちろん、クラス102は、典型的に、1つ以上のフィールド(図示せず)及び付加的なメソッド(図示せず)を含む。更に、オブジェクト指向のソースコード100は、典型的に、付加的なクラスを含む。
ランタイム中に、クラス102のインスタンス108がインスタンス生成される。インスタンス108は、クラス102のフィールドのデータを含む。更に、プロデューサ110がインスタンス生成され、プロデューサ110は、クラス102、クラス102のインスタンス108(クラス102のメソッド104に関連した)、及びクラス102のメソッド104を識別する。プロデューサ依存性宣言106は、プロデューサ110を実行する前に実行されねばならない0以上のプロデューサ112のセット(プロデューサ110の子プロデューサと称される)をランタイムに対して識別する。換言すれば、プロデューサ110は、0以上のプロデューサ112のセットに依存する。プロデューサ112のセットの出力を消費するのに加えて又はそれに代わって、プロデューサ110は、インスタンス108のデータを消費することができる。更に、プロデューサ110は、少なくとも1つの出力を与え、この出力は、インスタンス108に対して内部であってもよく(従って、インスタンス108のデータを変更し)、及び/又は外部であってもよく、いずれにせよ、プロデューサ110の出力は、0以上の他のプロデューサ114のセット(プロデューサ110の親プロデューサと称される)によって消費することができる。又、上述したように、そして以下に詳細に述べるように、プロデューサ依存性宣言106は、本発明のある実施形態では、0以上のプロデューサ114をランタイムに対して識別することもできる。
プロデューサの入力及び出力は、そのプロデューサのベースとなるメソッドの入力及び出力をベースとすることを理解されたい。従って、これらの入力及び出力は、種々のデータ構造を有する複数のパラメータを表すことができる。
所与のメソッドに対するプロデューサ依存性宣言は、インスタンス生成されて実行されるべき0以上のプロデューサのセットをランタイムにおいて識別する。例えば、所与のメソッド(例えば、メソッド104)に対するプロデューサ依存性宣言(例えば、プロデューサ依存性宣言106)が、所与のプロデューサ(この所与のプロデューサは、第1クラス、そのクラスの第1インスタンス、及びその第1クラスの第1メソッドを識別する)(例えば、プロデューサ112のセットの1つ)に対するプロデューサ依存性を識別する場合には、所与のメソッドのプロデューサ依存性宣言は、第1インスタンスをインスタンス生成すべきである(まだそうでなければ)こと及び第1メソッドを使用して第1インスタンスに対して所与のプロデューサをインスタンス生成すべきであることをランタイムに対して識別する(これらの例において、第1とは、位置や順序を意味するものではない)。
オペレーションにおいて、ランタイムの間に、1つ以上のプロデューサの所与のセットが、関心のあるものであることが指示され、且つそれらに対して宣言されたプロデューサ依存性を有するときに、ランタイムは、1)1つ以上のグラフのセットを自動的に発生し(発見し、構築し、そして任意であるが、解明し)、これらグラフは、マルチレベルのものであり、且つ関心があると指示されたプロデューサの所与のセットから、プロデューサ依存性宣言106に基づくソースプロデューサまで種々の形状(例えば、チェーン、ツリー)のものでよく、そして2)グラフのセットのプロデューサの実行をシーケンスして、関心があると指示されたプロデューサの所与のセットの出力(1つ又は複数)を発生する。従って、ランタイムは、プロデューサ依存性宣言106を使用して、どんな引数を伴うどんなメソッドをどんなインスタントに対して同期のためにいつ実行すべきか決定する。
ある実施形態では、ランタイムは、実行モード設定105をチェックし、プロデューサの実行モードを決定する。異なる実行モードを異なるシステムにおいてサポートすることができる。実行モードのある例は、マルチスレッディング、マルチプロセッシング、及びローカル実行を含む。
プロデューサ依存性は、ランタイムに対するプロデューサの実行のシーケンスを表す。しかしながら、実行のシーケンスを指示するのに加えて、プロデューサ依存性は、本発明の異なる実施形態では、異なる入力対出力関係を表すことができる。例えば、本発明の異なる実施形態は、引数プロデューサ依存性、フィールドプロデューサ依存性、及びシーケンスのみのプロデューサ依存性の1つ以上をサポートすることができる(シーケンスのみのプロデューサ依存性は、ここでは、速記シーケンスプロデューサ依存性と称される)。引数プロデューサ依存性、フィールドプロデューサ依存性、及びシーケンスプロデューサ依存性の各々は、プロデューサ間の実行シーケンス関係を表すが、引数及びフィールドのプロデューサ依存性は、更に、ランタイムが気付くデータも表わす。より詳細には、引数プロデューサ依存性は、ランタイムが子プロデューサの出力を親プロデューサに対する入力パラメータとしてマップするようにさせ、一方、フィールドプロデューサ依存性は、インスタンスのフィールドの使用を指示する。プロデューサ依存性によって表わされる入力対出力関係には関わりなく、プロデューサ依存性の適切な使用は、プロデューサアクセス情報が、その情報に影響するプロデューサの後にシーケンスされるように保証する。
シーケンス依存性は、ランタイムが気付かない仕方でデータを変更するプロデューサと、そのデータを消費するプロデューサとの間で実行順序を保証することを含めて、種々の目的に使用される(子プロデューサは、その出力にアクセスするためのコードを含むことを親プロデューサのメソッドに要求する仕方でその出力を書く(例えば、普通のプロデューサ出力でない、従って、ランタイムにより検出されない出力に影響することにより環境に影響を及ぼすメソッド、例えば、グローバル変数をセットし、プロデューサ出力でないインスタンスにおけるフィールドをセットし、外部データソースに影響する、等のメソッド))。従って、シーケンス依存性は、子プロデューサに対する親プロデューサの依存性を反映するが、コードの書き込みを通して一方から他方へ与える必要のある出力を要求する(例えば、所与のメカニズムに出力を書き込むための子プロデューサのメソッドにおけるコード(例えば、グローバル変数をセットし、外部データソースに影響し、プロデューサ出力でないインスタンスのフィールドをセットし、等々)、及び所与のメカニズムからその出力を読み取るための親プロデューサのメソッドにおけるコード)。このように、シーケンス依存性は、ランタイムで検出できない出力に依存する親プロデューサの実行をランタイムが同期させられるようにする。
本発明の一実施形態では、所与のメソッドに対するプロデューサ依存性宣言106は、プロデューサに対する直接的な依存性(例えば、直接的子孫(子供)、これと対照的に間接的子孫(孫、曾孫、等)がある)のみを識別する。このような実施形態では、各プロデューサ依存性宣言は、所与のメソッドからインスタンス生成されたプロデューサにより出力を直接使用できるプロデューサの単一段又は層のみを与え、プロデューサグラフ(1つ又は複数)の付加的な層の発見/構築/解明は、他のプロデューサ依存性宣言のランタイムプロセッシングに託される。
本発明の一実施形態によれば、プロデューサ依存性宣言106により識別されるプロデューサの依存性は、プロデューサを含むアプリケーションプログラムのパラレル化及びインスツルメンテーションを具現化するのに有用である。アプリケーションプログラムをパラレル化するために、アプリケーションプログラムの2つ以上のプロデューサが、同じ実行モード又は異なる実行モードで実質的にほぼ同時に実行される。アプリケーションをインスツルメント化するために、プロデューサが実行されるときにプロデューサのメトリックが取得される。パラレル化及びインスツルメンテーションは、本発明の例示的実施形態を参照して、以下に詳細に述べる。
例示的キー
プロデューサは、複数の識別子のセットとして見ることができ、指定の粒度の付加的なレベルごとに1つの識別子がある(クラス、インスタンス、メソッド、等)。更に、本発明のある実施形態は、各識別子を個別のキーとして具現化し、一方、他の実施形態は、幾つかの識別子が1つのキーを共有するようにする。例えば、本発明のある実施形態は、プロデューサを、クラス、インスタンス及びメソッドのトリプレットとして具現化し、そしてトリプレットの各部分が個別キー(クラスキー、インスタンスキー及びメソッドキー)により識別され且つプロデューサがクラスキー、インスタンスキー及びメソッドキーの組合せ(プロデューサキー)により識別されるように、キーを具現化する。
キーを使用する本発明の実施形態は、使用するキーの独特性が変化し得る。例えば、本発明の一実施形態では、各クラスキーが独特であり、各インスタンスキーは、全てのクラスの全てのインスタンスにわたって独特であり、そして各メソッドキーは、全てのクラスの全てのメソッドにわたって独特である。別の例として、本発明の他の実施形態では、各クラスが独特のキーを有し、所与のクラスの各インスタンスは、独特のキーを有し(クラスインスタンスにわたって)、そしてクラスの各メソッドは、独特のキーを有する(クラスメソッドにわたって)が、異なるクラスのインスタンスが同じインスタンスキーを有してもよく、且つ異なるクラスのメソッドが同じメソッドキーを有してもよく、この後者の解決策は、本書の残り部分において、一例として、非限定的に、使用される。例えば、第1クラスがメソッドを含むと共に、それらメソッドの各々に対し、第1クラス内で独特であるキーを有すると仮定すれば、このクラスのインスタンス(各々が互いに独特のキーを有する)には、同じメソッドキーが関連付けられる。別の例として、異なる第2クラスが、第1クラスに使用されたものと同じメソッドキーを有するメソッド(第1クラスのメソッドと幾つか同じ、全部同じ、又は全く同じでない)を含むと仮定する。従って、この異なるクラスのインスタンスには、第1クラスのインスタンスに関連付けられた同じメソッドキーが関連付けられてもよい。
これらキーの使用は、1)プロデューサの識別子によって識別された各エンティティを追跡すること(例えば、各クラス、インスタンス、及びメソッドの追跡)、2)多数の親プロデューサ(相互の存在に気付かない)がそれらのプロデューサ依存性宣言(これは、プロデューサキーを使用してプロデューサ依存性を指定する)に基づいて同じ子プロデューサに接続すること、等を含めて、種々の特徴を許す。本発明の一実施形態では、インスタンスキーは、キー識別子がインスタンス又は別のオブジェクト(ストリングのような)へのリファレンスであるかどうかを指示するインスタンスキー特性と、インスタンス又は別のオブジェクト(ストリングのような)のいずれかへのリファレンスであるキー識別子と、の2つのエレメントを保持するクラスのインスタンス(InstanceKey)である。インスタンスキーにインスタンスリファレンスを記憶することは、プログラマーがこれらのインスタンスを識別するための名前を創案することから逃れさせる。
例示的関係
プロデューサが複数の識別子のセット(指定の粒度の各付加的なレベルに対して1つの識別子をもつ)として見られることに関する前記説明に関連して、本発明の一実施形態では、プロデューサとその子供及び親との間の種々のサポートされる関係は、あるプロデューサと、0以上の親プロデューサのセットとの間で少なくとも1つのこのような識別子が異なり、且つあるプロデューサと、0以上の子プロデューサのセットの各々との間で1つのこのような識別子が異なるというものである。ある例示的関係を与えることにより、第1クラスの第1インスタンス及びその第1クラスの第1メソッドである第1プロデューサがインスタンス生成されると仮定し、且つその第1メソッドに対するプロデューサ依存性宣言がランタイムにおいて第2プロデューサを子供として識別すると仮定すると、第2プロデューサは、1)第1クラスの第1インスタンス及びその第1クラスの第2メソッドであり、2)第1クラスの第2インスタンス及びその第1クラスの第2メソッドであり、3)第1クラスの第2インスタンス及び第1クラスの第1メソッドであり、又は4)第2クラスのインスタンス及びその第2クラスのメソッドである。このようなケースでは、第1プロデューサは、第2プロデューサに依存し、従って、第2プロデューサに対する第1プロデューサの入力対出力関係を表す。種々の関係及びそれら関係の組合せは、オブジェクト指向の言語を使用する一実施形態であって、プロデューサが少なくともクラス、インスタンス及びメソッドを識別する本発明の実施形態について以下に説明する。
図1B−1Dは、本発明の一実施形態により、所与のプロデューサと、その親プロデューサのセットと、その子プロデューサのセットとの間の関係を例示する。図1B−1Dは、各々、次のものを示す。1)メソッド104A−Cと、これらメソッドの各々に対するプロデューサ依存性宣言106A−Cとを各々含むクラス定義102A;2)メソッド104D−Eと、これらメソッドの各々に対するプロデューサ依存性宣言106D−Eとを各々含むクラス定義102B;3)メソッド104Fと、このメソッドに対するプロデューサ依存性宣言106Fとを含むクラス定義102C;4)クラス102Aのインスタンス108A;5)クラス102A、インスタンス108A及びメソッド104Aを識別するプロデューサ110A;及び6)プロデューサ112及び114のセットの1つを各々表わすプロデューサ112A.1及びプロデューサ114A.1。ボックス内に文字を伴う破線は、図1B−1Dにおいて、関係を例示するために使用される。従って、ボックス内にAを伴う破線の集合は、1つの関係を表す。図1Bにおける関係は、図1Cにおける関係と組合せ可能であり、従って、これらの組合せは、プロデューサ110Aに対する親プロデューサ114Aと子プロデューサ112Aとの関係の組合せを表している。更に、図1Dは、プロデューサ110Aに対する親プロデューサ114Aと子プロデューサ112Aとの関係のある付加的な組合せを例示している。
図1Bは、本発明の一実施形態によるプロデューサ110Aと親プロデューサ114A.1との関係を例示している。図1Bは、更に、インスタンス108Bを含む。プロデューサ114のセットは、同じクラスの異なるメソッド(1つ又は複数)、同じクラスの異なるインスタンス、及び/又は異なるクラスのメソッド(1つ又は複数)の他のプロデューサ依存性宣言によって識別され、従って、プロデューサ114のセットの各々は、1)プロデューサ110Aと同じインスタンス(クラス102Aのインスタンス108A)及びそのインスタンスの異なるメソッド(インスタンス108Aからプロデューサ114A.1へ及びメソッド104Bからプロデューサ114A.1への破線上のボックス内のAにより示された)であり;2)クラス102Aの異なるインスタンス及びそのインスタンスの異なるメソッド(クラス102Aからインスタンス108Bへ、インスタンス108Bからプロデューサ114A.1へ及びメソッド104Bからプロデューサ114A.1への破線上のボックス内のBにより示された)であり;3)異なるクラスのインスタンス及びそのインスタンスのメソッド(クラス102Bからインスタンス108Bへ、インスタンス108Bからプロデューサ114A.1へ及びメソッド104Dからプロデューサ114A.1への破線上のボックス内のCにより示された)であり;又は4)クラス102Aの(インスタンス108Aとは)異なるインスタンス及びそのインスタンスの同じメソッド(メソッド104A)(例えば、以下に述べるコンティンジェント依存性を伴う)(クラス102Aからインスタンス108Bへ、インスタンス108Bからプロデューサ114A.1へ及びメソッド104Aからプロデューサ114A.1への破線上のボックス内のDにより示された)であり;更に、プロデューサ114のセットに複数のプロデューサがある場合には、プロデューサ114それ自体が、クラス102Aの同じインスタンス、クラス102Aの異なるインスタンス、異なるクラスの同じインスタンス、異なるクラスの異なるインスタンス、及び/又はそれらの混合の一部分でもよい。
図1Cは、本発明の一実施形態によるプロデューサ110Aと子プロデューサ112A.1との関係を例示している。図1Cは、更に、インスタンス108Cを含む。プロデューサ112Aのセットの各々は、1)プロデューサ110Aと同じインスタンス(クラス102Aのインスタンス108A)及びそのインスタンスの異なるメソッド(インスタンス108Aからプロデューサ112A.1へ及びメソッド104Cからプロデューサ112A.1への破線上のボックス内のEにより示された)であり;2)クラス102Aの異なるインスタンス及びそのインスタンスの異なるメソッド(クラス102Aからインスタンス108Cへ、インスタンス108Cからプロデューサ112A.1へ及びメソッド104Cからプロデューサ112A.1への破線上のボックス内のFにより示された)であり;3)異なるクラスのインスタンス及びそのインスタンスのメソッド(クラス102Cからインスタンス108Cへ、インスタンス108Cからプロデューサ112A.1へ及びメソッド104Fからプロデューサ112A.1への破線上のボックス内のGにより示された)であり;又は4)クラス102Aの(インスタンス108とは)異なるインスタンス及びそのインスタンスの同じメソッド(メソッド104A)(例えば、以下に述べるコンティンジェント依存性を伴う)(クラス102Aからインスタンス108Cへ、インスタンス108Cからプロデューサ112A.1へ及びメソッド104Aからプロデューサ112A.1への破線上のボックス内のHにより示された)である。従って、プロデューサ112Aのセットの各々は、プロデューサ110Aの同じインスタンス、クラス102Aの異なるインスタンス、又は異なるクラスのインスタンスでよく、更に、プロデューサ112Aのセットに複数のプロデューサがある場合には、プロデューサ112Aそれ自体が、クラス102Aの同じインスタンス、クラス102Aの異なるインスタンス、異なるクラスの同じインスタンス、異なるクラスの異なるインスタンス、及び/又はそれらの混合の一部分でもよい。
図1Dは、本発明の一実施形態による親プロデューサ114及び子プロデューサ112とプロデューサ110Aとの関係の付加的な組合せを例示している。図1Dは、更に、インスタンス108B及びインスタンス108Cを含む。図1Dの組合せを以下のテーブル1に示す。
テーブル1
図1Eは、本発明の一実施形態により、同じクラスの異なるインスタンスが同じ及び/又は異なるメソッドに基づきプロデューサを有することができることを示す。図1Eは、次のものを示す。即ち、1)クラス定義102Aが、メソッド104A−Cと、各メソッドに対するプロデューサ依存性宣言106A−Cを各々含むこと;2)インスタンス108A及びインスタンス108Bがクラス102Aのものであること;3)プロデューサ110Aが、クラス102Aのインスタンス108Aのメソッド104Aであること;4)プロデューサ110Bが、クラス102Aのインスタンス108Aのメソッド104Bであること;5)プロデューサ110Cが、クラス102Aのインスタンス108Bのメソッド104Aであること;及び6)プロデューサ110Dが、クラス102Aのインスタンス108Bのメソッド104Cであること。更に、図1Dは、次のことを示す。即ち、1)メソッド104Aのプロデューサ依存性宣言106Aが、ランタイムにおいて、プロデューサ110A及びプロデューサ110Cの両方の子プロデューサを識別すること;2)メソッド104Bのプロデューサ依存性宣言106Bが、ランタイムにおいて、プロデューサ110Bの子プロデューサを識別すること;及び3)メソッド104Cのプロデューサ依存性宣言106Cが、ランタイムにおいて、プロデューサ110Dの子プロデューサを識別すること。
例示的ランタイム
図2は、本発明の一実施形態によりプロデューサグラフ指向のプログラミングサポートを伴うランタイムの再使用性を示すブロック図である。図2において、複数のオブジェクト指向のアプリケーションプログラム(プロデューサ依存性宣言を伴うオブジェクト指向のアプリケーションコード210A−I)は、プロデューサグラフ指向のプログラミングサポートを伴う同じランタイム220によって実行される。
図3Aは、本発明の一実施形態によりプロデューサグラフ指向のプログラミングサポートを伴うランタイムを示すブロック図である。図3Aにおいて、プロデューサグラフ指向のプログラミングサポート335を伴うランタイムは、自動プロデューサグラフ実行モジュール340及びプロデューサグラフ実行モジュール345を含む。更に、ランタイム335は、オブジェクト指向のソースコードを実行するもので、従って、図示されていない付加的なモジュールを含む。
更に、図3Aは、オブジェクト指向のソースコードにおけるメソッドのためのプロデューサ依存性宣言320、出力が問題である1つ以上のプロデューサの現在セット325(ここでは、問題とする現在選択されたプロデューサと称される)、及びソースプロデューサの出力330(以下で説明する)を示している。自動プロデューサグラフ発生モジュール340は、プロデューサ依存性宣言320、及び問題とするプロデューサの現在セット325を受け取る。
自動プロデューサグラフ発生モジュール340は、問題とする現在選択されたプロデューサの入力に直接的及び間接的に貢献する出力を伴う子プロデューサをプロデューサ依存性宣言に基づいて発見し、そして問題とする現在選択されたプロデューサからソースプロデューサである発見されたプロデューサのものまでのプロデューサの互いの入力依存性を表すプロデューサの現在グラフを構築するよう試みる。プロデューサグラフ(1つ又は複数)は、プロデューサグラフ(1つ又は複数)構造380に記憶される。
プロデューサグラフ実行モジュール345は、自動プロデューサグラフ発生モジュール340からの現在プロデューサグラフ(1つ又は複数)及びソースプロデューサ330の出力を受け取り、そして現在プロデューサグラフ(1つ又は複数)のプロデューサを実行して、問題とする現在選択されたプロデューサの現在出力を決定する。ある実施形態では、プロデューサグラフ実行モジュール345は、パラレル化モジュール3451、マルチプロセッシングモジュール3453、マルチスレッディングモジュール3455、及びローカル実行モジュール3457を含む。パラレル化モジュール3451は、プロデューサの実行モードを決定し、そしてその決定された実行モードで実行されるべきマルチプロセッシングモジュール3453、マルチスレッディングモジュール3455及びローカル実行モジュール3457の1つにプロデューサを送信することができる。パラレル化は、個々の実行モードによりサポートすることができる。例えば、プロデューサのパラレル実行は、マルチプロセッシングを使用するマルチプロセッシングモジュール3453により達成することができる。或いは又、プロデューサのパラレル実行は、マルチスレッディングを使用するマルチスレッディングモジュール3455により達成することができる。更に、パラレル化は、実行モードの組合せによりサポートすることができる。換言すれば、プロデューサは、異なる実行モードを使用してパラレルに実行することができる。例えば、2つのプロデューサは、マルチスレッディングモジュール3455に1つのプロデューサを送信しそしてローカル実行モジュール3457に他方のプロデューサを送信することによりパラレルに実行することができる。実行モジュールの他の組合せを使用してパラレル化を具現化できることが明らかであろう。
プロデューサグラフ実行モジュール345は、プロデューサ出力キャッシング384により示されたようにプロデューサグラフ構造380にプロデューサの現在出力をキャッシュ記憶する。実行中にプロデューサグラフのプロデューサ出力をキャッシュ記憶することで同期をとることができる。例えば、複数の子プロデューサに依存する親プロデューサを実行する適切な時間は、複数の子プロデューサが全て実行された後であり、換言すれば、子プロデューサの1つが実行を完了するたびに親プロデューサを実行するのは無駄である(あるケースでは、不可能である)。プロデューサ出力をキャッシュ記憶することは、親プロデューサの実行を、全ての子プロデューサが実行されてしまうまで延期できるだけでなく、親プロデューサを実行するための適切な時間、即ち全ての子プロデューサが実行されてそれらの出力がキャッシュ記憶されるとき、を決定できるようにする。従って、ランタイムは、プロデューサ出力キャッシング384において必要な出力が利用できることをチェックすることによりプログラマーに対してこの同期判断を実行し、換言すれば、このような同期が自動化される(プログラマーは、あるインスタンスの所与のメソッドを実行するための適切な時間を決定する個別のソースコードを含ませる必要がない)。別の例として、複数の親プロデューサが同じ子プロデューサ及び他の異なる子プロデューサに依存する場合には、複数の親プロデューサの各々を実行するための適切な時間が典型的に異なり、ランタイムは、子プロデューサのセットの出力の利用性に基づいて複数の親プロデューサの各々を実行するための適切な時間を自動的に決定する。
以下に詳細に述べるように、プロデューサグラフのある部分は、ダイナミックなプロデューサ依存性のために現在発見できないことがあるので、自動プロデューサグラフ発生モジュール340は、プロデューサグラフ全体を発見し構築するように「試みる」が、あるプロデューサが実行されるまでは、最初にプロデューサグラフ全体を完了できないことがある。従って、プロデューサグラフ実行モジュール345は、現在プロデューサグラフの実行中に必要なプロデューサ出力を伴う自動プロデューサグラフ発生モジュール340をインボークし、現在プロデューサグラフの未解明の残部を完了することができる(これは、図3Aにおいて、プロデューサグラフ実行モジュール345から自動プロデューサグラフ発生モジュール340への矢印付き破線で示されており、矢印付き破線は、このようなサポートが任意であるために使用されている)。
図4Aは、本発明の一実施形態による例示的プロデューサグラフの発見及び構築を示すブロック図である。図4Aは、問題とするプロデューサの現在セットがプロデューサ1より成ることを示す。プロデューサ及びそのプロデューサ依存性宣言に基づいて、プロデューサ2及びプロデューサ3が発見される。換言すれば、プロデューサ1に対するプロデューサ依存性宣言は、プロデューサ1への入力がプロデューサ2及びプロデューサ3の実行を要求することを示す。従って、プロデューサ1は、従属プロデューサ(1つ以上のプロデューサ依存性を有するプロデューサ)である。又、図4Aは、プロデューサ3が独立プロデューサ(プロデューサ依存性をもたず、従って、ソースプロデューサであるプロデューサ)であるが、プロデューサ2は、そうでないことも示す。その結果、プロデューサ2のプロデューサ依存性宣言に基づき、プロデューサ4及びプロデューサ5が発見される。図2Aにおいて、プロデューサ4及びプロデューサ5は、独立プロデューサ(従って、ソースプロデューサ)である。
図4Bは、本発明の一実施形態により図4Aのプロデューサグラフの初期実行を示すブロック図である。図4Bにおいて、矢印付きの曲線は、あるプロデューサを実行して出力を発生し、それが別のプロデューサへ入力として与えられることを示す。図3Aに示すように、ソースプロデューサ330の出力は、プロデューサグラフ実行モジュール345に与えられ、対照的に、従属プロデューサ1−2の出力は、図4Bに示すようにプロデューサの実行によって決定される。従って、図4Bでは、次のことが生じる。即ち、1)ソースプロデューサ4及びソースプロデューサ5の出力が従属プロデューサ2に与えられ、従属プロデューサ2が実行され、3)従属プロデューサ2及びソースプロデューサ3の出力がプロデューサ1に与えられ、そして4)プロデューサ1が実行され、且つその出力が、問題とする現在出力として与えられる。図4Bのプロデューサグラフは、データがグラフを上るようにあるプロデューサから別のプロデューサへ流れる方向に駆動されるデータであることに注意する価値がある。
ある実施形態では、プロデューサ4及びプロデューサ5は、これらプロデューサ4及び5が互いに独立であるから、パラレル化(例えば、マルチプロセッシング、マルチスレッディング、等)をサポートする異なる実行モード又は単一実行モードを使用してパラレルに実行することができる。しかしながら、ここに示す例では、プロデューサ2がプロデューサ4及び5に依存するので、プロデューサ2は、プロデューサ4及び5とパラレルに実行されないことがある。従って、ランタイムは、プロデューサ2を実行する前にプロデューサ4及び5が終了するのを待機する。プロデューサ3については、プロデューサ3が、プロデューサ4及び5と独立しているので、プロデューサ3は、プロデューサ4及び5とパラレルに実行される。或いは又、プロデューサ3は、それがプロデューサ2とも独立しているので、プロデューサ2とパラレルに実行されてもよい。ある実施形態では、プロデューサ3の実行は、プロデューサ3、4及び5を実行するのにどれほどの時間がかかるかに基づいて、プロデューサ4及び5の実行、並びにプロデューサ2の実行と時間的に重畳してもよい。
従って、プロデューサ依存性宣言320は、発生されると考えられるプロデューサグラフの境界を定め、一方、問題とするプロデューサの現在選択セット325は、発生されるべき現在プロデューサグラフの開始ノード(1つ又は複数)を識別する。これらの2つから、自動プロデューサグラフ発生モジュール340がプロデューサグラフを発見して構築する。発見及び構築は、自動プロデューサグラフ発生モジュール340に、プロデューサグラフ(例えば、プログラマーにより手動で識別される必要がない)も、プロデューサグラフ内のプロデューサのリストも与えられないという点で、自動的である。むしろ、自動プロデューサグラフ発生モジュール340は、問題とするプロデューサの現在選択セットのプロデューサ依存性宣言(1つ又は複数)を構文解析して、それらの子プロデューサを発見し、次いで、それらの発見されたプロデューサのプロデューサ依存性宣言を構文解析し、等々で、ソースプロデューサまで行う(以下に述べる本発明のある実施形態では、これは、プロデューサグラフ実行モジュール345の助けで行われてもよい)。プロデューサグラフがツリーである場合には、問題とする現在選択されたプロデューサが典型的に根ノードであり、プロデューサ依存性宣言は、葉ノード(ソースプロデューサ)が発見されるまで構文解析される。
オーバーライドされたプロデューサ及び増分的実行
図3Bは、本発明の一実施形態により、増分的実行及びオーバーライドされたプロデューサ出力もサポートするプロデューサグラフ指向のプログラミングサポートを伴うランタイムを示すブロック図である。増分的実行及びオーバーライドされたプロデューサ出力は、各々、独立した任意の特徴であり、従って、本発明の異なる実施形態では、一方を具現化してもよいし、両方を具現化してもよいことを理解されたい。図3Bには明確に示されないが、図3Aのパラレル化モジュール3451、マルチプロセッシングモジュール3453、マルチスレッディングモジュール3455、及びローカル実行モジュール3457は、図3Bのプロデューサグラフ実行モジュール370がプロデューサの実行においてパラレル化を実施できるように図3Bのプロデューサグラフ実行モジュール370に含まれてもよいことが明らかであろう。
図3Bにおいて、プロデューサグラフ指向のプログラミングサポートを伴うランタイム360は、自動プロデューサグラフ発生モジュール365、プロデューサグラフ実行モジュール370、及びオーバーライドプロデューサ出力モジュール390を備えている。ランタイム360は、オブジェクト指向のソースコードを実行するものであり、従って、図示されていない付加的なモジュールを備えている。
更に、図3Bは、オブジェクト指向のソースコードにおけるメソッドに対する依存性宣言320、出力が問題である1つ以上のプロデューサの現在セット325(ここでは、問題とする現在選択されたプロデューサとも称される)、及びソースプロデューサの出力350も示している。ソースプロデューサの出力350は、ソースコードにおける独立プロデューサセットの出力352(例えば、定数、デフォールト値、等)、及び現在オーバーライドされたプロデューサ出力354(出力が現在オーバーライドされた独立プロデューサ及び/又は従属プロデューサの出力)を含む。
本発明のある実施形態では、プロデューサの出力は、現在与えられた値で明確にオーバーライドすることができる(即ち、プロデューサを実行してその現在入力に基づいてその出力値を決定するのではなく、プロデューサに対する出力値が明確に与えられる)。プロデューサグラフの独立プロデューサに加えて、プロデューサグラフのソースプロデューサは、現在オーバーライドされたプロデューサを含む。
オーバーライドプロデューサ出力モジュール390は、オーバーライドされたプロデューサ出力354を受け取る(これは、どのプロデューサがオーバーライドされそしてどんな出力値でオーバーライドされるか識別する)。本発明の一実施形態では、プロデューサは、プロパティプロデューサ又はメソッドプロデューサとして分類することができる。プロパティプロデューサは、プロパティメソッド(例えば、ゲット及びセット)に基づくものである。メソッドプロデューサは、非プロパティメソッドに基づくものである。オーバーライドプロデューサ出力モジュール390は、オーバーライドされたプロパティプロデューサのためのオーバーライドプロパティプロデューサ出力モジュール392と、オーバーライドされたメソッドプロデューサのためのオーバーライドメソッドプロデューサ出力モジュール394とを備えている。オーバーライドプロパティプロデューサ出力モジュール392は、オーバーライドされた値を、プロデューサ出力キャッシング384及びインスタンスのデータに記憶させ、一方、オーバーライドメソッドプロデューサ出力モジュール394は、オーバーライドされた値をプロデューサ出力キャッシング384に記憶させる。本発明の実施形態に基づき、この因果関係は、直接的でも間接的でもよい。図3Bは、オーバーライドログ396を使用して間接的に行わせることを示し、このオーバーライドログは、オーバーライドプロデューサ出力モジュール390の出力を収集するもので、プロデューサグラフ実行モジュール370によって消費される。最適化のために、オーバーライドロジック396は、オーバーライドを遅延させ、複数のオーバーライドをバッチ処理のために収集できるようにする。
自動プロデューサグラフ発生モジュール340と同様に、自動プロデューサグラフ発生モジュール365は、1)プロデューサ依存性宣言320及び問題とするプロデューサの現在セット325を受け取り、そして2)プロデューサ依存性宣言に基づいて、問題とする現在選択されたプロデューサの入力に直接的及び間接的に貢献する出力を伴うプロデューサを発見し、且つ問題とする現在選択されたプロデューサから、発見された非ソースプロデューサを経て、ソースプロデューサ(独特プロデューサ及び現在オーバーライドされたプロデューサ)である発見されたプロデューサのものまで、プロデューサの互いの入力依存性を表すプロデューサの現在グラフを構築するよう試みる。プロデューサグラフ(1つ又は複数)は、プロデューサグラフ(1つ又は複数)構造380に記憶される。
プロデューサグラフ実行モジュール345と同様に、プロデューサグラフ実行モジュール370は、自動グラフモジュール365からの現在プロデューサグラフ及びソースプロデューサ350の出力を受け取り、そして現在プロデューサグラフのプロデューサを実行して、問題とする現在選択されたプロデューサの現在出力を決定する。プロデューサグラフ実行モジュール370は、プロデューサ出力キャッシング384により示されたように、プロデューサグラフ構造380にプロデューサの現在出力をキャッシュ記憶する。
上述したように、実行中にプロデューサ出力をキャッシュ記憶することで同期をとることができる(例えば、図4Bのプロデューサ2をいつ実行すべきか決定するために個別のソースコードを書き込む必要がなく、むしろ、ランタイムは、プロデューサ出力キャッシング384において必要な出力が利用できることをチェックすることによりプログラマーに対してこの同期判断を実行し、換言すれば、このような同期が自動化される)。更に、実行中にプロデューサ出力をキャッシュ記憶することで、プロデューサ実行をパラレル化することができる。というのは、ランタイムは、プロデューサ出力キャッシング384において必要な出力が利用できることをチェックすることによりどのプロデューサが実行の準備ができたか判断できるからである。実行の準備ができたプロデューサは、パラレルに実行することができる。換言すれば、パラレル化も自動化することができる。従って、どのプロデューサをパラレルに実行すべきか決定し又は指示するのに、個別のソースコードが必要とされない。更に、このプロデューサ出力キャッシング384は、増分的実行に使用される。より詳細には、プロデューサグラフが最初に発生されて実行された後に、現在プロデューサグラフにおけるプロデューサをオーバーライドするのに、ある程度の再実行レベルが要求される。本発明のある実施形態は、グラフ全体を単純に再実行するが、本発明の別の実施形態は、増分的実行をサポートする(オーバーライドにより影響されるプロデューサグラフの部分のみを再実行する)。増分的実行をサポートするある例示的実施形態は、どのプロデューサが再実行を要求するか決定する上で助けとなるように、プロデューサグラフ(1つ又は複数)構造380に増分的実行マーキング382を使用する。従って、プロデューサグラフを維持することは、複数の実行にわたって必要に応じてプロデューサグラフのリンクを変更して、それらを現在状態(最新状態)に保持することを指し、一方、増分的実行は、プロデューサグラフ(1つ又は複数)を維持し、且つ現在(最新)プロデューサグラフを使用して、オーバーライドにより影響されるプロデューサグラフの部分のみを再実行することを指す。
図3Aと同様に、ダイナミック依存性に対する任意のサポートを表すために、プロデューサグラフ実行モジュール370から自動プロデューサグラフ実行モジュール365へと矢印付き破線が延びている。ダイナミック依存性は、プロデューサグラフの再実行中に変化し得ることに注意されたい。
図4Cは、本発明の一実施形態により図4Bのプロデューサグラフの増分的実行を示すブロック図である。図4Cにおいて、プロデューサ5の出力は、明確に変更されているが、プロデューサ3及びプロデューサ4の出力は、変更されていない。プロデューサグラフにおける出力対入力依存性の追跡と、プロデューサ5の出力のみが明確に変更されていることに基づいて、プロデューサ2及びプロデューサ1だけがこの変更により影響されることが決定される。その結果、プロデューサ1の更新された出力を決定するのに、プロデューサ5の新たな出力と、プロデューサ4及びプロデューサ3の以前の出力とでプロデューサ2及びプロデューサ1を再実行することしか要求されない。プロデューサグラフのこの部分的な再実行は、図4Cにおいて、プロデューサ5からプロデューサ2へそしてプロデューサ2からプロデューサ1への矢印付き曲線が存在するが、プロデューサ4からプロデューサ2へ又はプロデューサ3からプロデューサ1へは存在しないことにより示される。プロデューサ4からプロデューサ2へ及びプロデューサ3からプロデューサ1への矢印付き曲線が存在しないことは、プロデューサ3及びプロデューサ4の出力が必要ないことを指示するのではなく、むしろ、プロデューサ3及びプロデューサ4の以前の出力が(例えば、プロデューサグラフの以前の実行からキャッシュ記憶されて)利用できる場合には、それらプロデューサを再実行する必要がないことを指示する。
図4Cの比較的簡単な例は、増分的実行の結果として処理リソースを節約できることを示している。このような節約は、多数のファクタ(例えば、再実行する必要のないプロデューサの数、それらプロデューサが要求する処理の量、等)に依存する。増分的実行を遂行する本発明の一実施形態が例示されたが、別の実施形態を別の仕方で具現化することもできる(例えば、別の実施形態は、変更に応答して全てのプロデューサを再実行することができる)。
図4Dは、本発明の一実施形態により従属プロデューサ2がオーバーライドされた後の図4Bのプロデューサグラフの増分的実行を示すブロック図である。図4Dにおいて、プロデューサ2の出力は、明確に変更されているが、プロデューサ3の出力は、変更されていない。プロデューサグラフと、プロデューサ2の出力のみが明確に変更されたこととに基づいて、この変更によりプロデューサ1だけが影響されると決定される。その結果、プロデューサ1の更新された出力を決定するのに、プロデューサ2のオーバーライドされた出力と、プロデューサ3の以前の出力とでプロデューサ1を再実行することしか要求されない。プロデューサグラフのこの部分的再実行は、図4Dにおいて、プロデューサ2からプロデューサ1への矢印付き曲線が存在するが、プロデューサ4及び5からプロデューサ2へ又はプロデューサ3からプロデューサ1へは存在しないことにより示される。
図4Eは、本発明の一実施形態により従属プロデューサ2がオーバーライドされそして独立ソースプロデューサ3が変更された後の図4Bのプロデューサグラフの増分的実行を示すブロック図である。プロデューサグラフと、プロデューサ2及びプロデューサ3の出力のみが変更されたこととに基づいて、この変更によりプロデューサ1だけが影響されると決定される。その結果、プロデューサ1の更新された出力を決定するのに、プロデューサ2のオーバーライドされた出力と、プロデューサ3の以前の出力とでプロデューサ1を再実行することしか要求されない。プロデューサグラフのこの部分的再実行は、図4Eにおいて、プロデューサ2及び3からプロデューサ1への矢印付き曲線が存在するが、プロデューサ4及び5からプロデューサ2へは存在しないことにより示される。
オーバーライドプロデューサ出力をサポートする本発明の一実施形態は、非オーバーライドプロデューサ出力もサポートするが、本発明の別の実施形態は、そのようにしない。非オーバーライドプロデューサをサポートする本発明の一実施形態は、オーバーライドされたプロデューサを、それが特に非オーバーライドされるまで、オーバーライドされたままにするが、本発明の別の実施形態は、異なる仕方で具現化されてもよい(例えば、オーバーライドされたプロデューサを、その子孫の1つがオーバーライドされるときに非オーバーライド化する)。
本発明の一実施形態において、プロデューサグラフ指向のプログラミングフレームワークは、プロデューサ依存性宣言と共に書かれていないプログラムとインターフェイスするのに使用される外部インターフェイスを含む。この外部フレームワークは、1)発呼部分(ランタイムクライアントと称される)、及び2)被呼部分(外部データソースと称される)を含む。プロデューサが外部データソースから直接データを読み取る場合には、プロデューサが生成されるときにデータを読み取るだけでよく、又、そのように命令されたときにデータを読み取る(手動リフレッシュ)か、又はそれにサブスクライブするだけでよい。手動リフレッシュ及びサブスクライブの場合には、外部データソースが変化した結果、プロデューサのセットメソッドがインボークされ且つプロデューサの出力が変更される(オーバーライドされたプロデューサと同じものが処理される)。
プロデューサグラフ構築及び実行
本発明の異なる実施形態は、プロデューサグラフを発見して、異なる程度に構築するように具現化することができる(例えば、根ノードからの全ての経路が独立プロデューサにおいて終了するまでプロデューサグラフを構築し(このケースでは、プロデューサグラフの終了ノードが独立プロデューサであり、オーバーライドされたプロデューサが中間ノードであるおそれがある);根ノードからの各経路が、オーバーライドされたプロデューサ又は独立プロデューサのいずれか最初に到着する方で終了するまで、プロデューサグラフを構築する(このケースでは、プロデューサグラフの各終了ノードが独立プロデューサ又はオーバーライドされたプロデューサのいずれかである))。
「実行スタートプロデューサ」とは、プロデューサグラフのプロデューサであって、そこからプロデューサグラフの所与の実行が開始されるプロデューサを指す。プロデューサグラフの初期実行に対して、異なる実施形態は、異なるプロデューサからスタートすることができる(例えば、根ノードからの全ての経路が独立プロデューサにおいて終了するまでプロデューサグラフを構築する本発明の実施形態では、終了ノード(これは独立プロデューサである)から;ソースプロデューサ(これは、独立プロデューサノード及び任意のオーバーライドされたプロデューサノードを含む)から;少なくとも1つの経路を間に伴う独立プロデューサと、オーバーライドされたプロデューサを含まない根プロデューサと、オーバーライドされたプロデューサとの組合せより成るソースプロデューサのサブセットから;或いはオーバーライドされた子孫を伴わないオーバーライドされたプロデューサと、少なくとも1つの経路を間に伴う独立プロデューサと、オーバーライドされたプロデューサを含まない根プロデューサとの組合せより成るソースプロデューサのサブセットから;実行をスタートすることができ、更に、オーバーライドされたプロデューサの下でのプロデューサグラフが、そのようなプロデューサが非オーバーライドである場合及び非オーバーライドにされるまで構築されないような本発明の実施形態では、終了ノード(独立プロデューサ及び/又はオーバーライドされたプロデューサである)から実行をスタートすることができ、等々である)。
プロデューサグラフのその後の実行に対して、異なる実施形態は、異なるプロデューサからスタートすることができる(例えば、プロデューサグラフの独立プロデューサから(例えば、増分的実行をサポートしない本発明の実施形態において);プロデューサグラフのソースプロデューサから(例えば、増分的実行をサポートしない本発明の実施形態において);最後の実行以来オーバーライドされ及び/又は追加されたソースプロデューサより成るソースプロデューサのサブセットから(例えば、増分的実行をサポートする本発明の実施形態において);最後の実行以来オーバーライドされ及び/又は追加されたソースプロデューサのうち、オーバーライドされた子孫を伴わないオーバーライドされたプロデューサと、少なくとも1つの経路を間に伴う追加されたプロデューサと、オーバーライドされたプロデューサを含まない根プロデューサとの組合せから(例えば、増分的実行をサポートする本発明の実施形態において);等)。
実行スタートプロデューサの前記概念に関して、プロデューサグラフの実行の処理フローも、異なる実施形態の間で相違する。例えば、本発明の一実施形態では、実行スタートプロデューサの祖先が決定されて集合に入れられ、実行スタートプロデューサが実行され、そして全ての依存性が実行されたところのプロデューサに対して集合が繰り返しスキャンされ、最終的には、根ノードに到達する。別の例として、本発明の一実施形態では、実行スタートプロデューサが実行され、実行スタートプロデューサの親が識別され、それらの親が実行され、そしてそれらの親が識別されて実行され、等々となる。本発明の後者の実施形態を、一例として、非限定的に、以下に使用する。
依存性の例示的形式
例示的なダイナミックプロデューサ依存性
ダイナミックプロデューサ依存性は、ランタイム中に変化するプロデューサ依存性である。プロデューサ依存性を解明するための基準は、ソースコードに存在し、従って、プロデューサ依存性を解明できるプロデューサが制限される。図3Aを参照すれば、プロデューサグラフ実行モジュール345から自動プロデューサグラフ発生モジュール340への矢印付き破線は、現在プロデューサグラフ全体を発見し構築するのに必要な現在プロデューサグラフにおける1つ以上のプロデューサを実行するためのサポートを表す。換言すれば、ダイナミックプロデューサ依存性をサポートする本発明の実施形態は、プロデューサグラフ全体が発見され、構築され、解明され及び実行されるまで、自働プロデューサグラフ発生モジュール340とプロデューサグラフ実行モジュール345との間を繰り返す(即ち、1)そのとき解明できる現在プロデューサグラフの部分を発見し構築するために自動プロデューサグラフ発生モジュールをインボークすることと、2)現在プロデューサグラフのプロデューサを実行するためにプロデューサグラフ実行モジュールをインボークすること、との間を繰り返す)。この意味で、発見とは、プロデューサ依存性宣言にアクセスし、それらが識別するプロデューサを決定することを指し、構築とは、プロデューサをインスタンス生成し、それらをプロデューサグラフに追加することを意味し、そして解明とは、現在解明されていないダイナミックプロデューサ依存性を決定することを指す。
図5Aは、本発明の一実施形態により未解明の依存性を含む例示的プロデューサグラフの発見及び構築を示すブロック図である。図5Aは、プロデューサ1より成る、問題とするプロデューサの現在セットを示す。プロデューサ1及びそのプロデューサ依存性宣言に基づいて、プロデューサ2及びプロデューサ3が発見される。換言すれば、プロデューサ1の依存性宣言は、プロデューサ1がプロデューサ2及びプロデューサ3の出力を入力として要求することを示す。又、図5Aは、プロデューサ3は、独立プロデューサ(従って、ソースプロデューサ)であるが、プロデューサ2は、そうでないことも示している。その結果、プロデューサ2の依存性宣言に基づいて、プロデューサ4及びプロデューサ5が発見される。更に、図5Aは、プロデューサ4は、独立プロデューサ(従って、ソースプロデューサ)であるが、プロデューサ5は、そうでないことも示している。その結果、プロデューサ5の依存性宣言に基づいて、プロデューサ6及び現在未解明の依存性が発見される。又、図5Aは、現在未解明の依存性がプロデューサ7A及び/又はプロデューサ7Bに対するものであることも示している。
図5Bは、本発明の一実施形態により、図5Aのプロデューサグラフの初期の実行と、未解明の依存性の解明とを示すブロック図である。図5Bは、図5Aのプロデューサグラフを示すもので、矢印付きの曲線は、プロデューサの実行と、それら出力の、従属親プロデューサへの付与とを示している。更に、図5Bは、プロデューサ5の未解明の依存性がプロデューサ7Aに対する依存性として解明され、そしてプロデューサ7Aが独立プロデューサであることを示している。プロデューサ7Aは、それ自身で実行されてもよいし、又はプロデューサ6とパラレルに実行されてもよいし、又はプロデューサ4とパラレルに実行されてもよいし、プロデューサ3とパラレルに実行されてもよいし、又はプロデューサ3、4及び6の組合せとパラレルに実行されてもよいことに注意されたい。このようなパラレル実行が許されるのは、プロデューサ7Aがプロデューサ3、4及び6と独立しているからである。
図5Cは、本発明の一実施形態により、図5Aのプロデューサグラフの初期の実行及び/又は図5Bのプロデューサグラフの再実行を示すブロック図である。図5Cは、図5Aのプロデューサグラフを示すもので、矢印付きの曲線は、プロデューサの実行と、それら出力の、従属親プロデューサへの付与とを示している。更に、図5Cは、プロデューサ5の未解明の依存性がプロデューサ7Bに対する依存性として解明され、そしてプロデューサ7Bが独立プロデューサであることを示している。その結果、プロデューサ7Bの依存性宣言に基づいて、プロデューサ8が発見される。プロデューサ8は、独立プロデューサ(従って、ソースプロデューサ)である。図5Cが、図5Aのプロデューサグラフの初期実行を表すと仮定すれば、図5Cにおける全ての矢印付き曲線が使用される。しかしながら、図5Cが、図5Bのプロデューサグラフの再実行を表すと仮定すれば、再実行の結果、ダイナミック依存性が異なる仕方で解明される(プロデューサ5がプロデューサ7Aに依存することからプロデューサ7Bに依存することへとスイッチする)。更に、再実行が増分的実行を伴わずに行われる場合には、図5Cにおける全ての矢印付き曲線が使用されるが、増分的実行が使用される場合には、矢印付き非破線曲線しか使用されない(プロデューサ8からプロデューサ7Bへ、プロデューサ7Bからプロデューサ5へ、プロデューサ5からプロデューサ2へ、及びプロデューサ2からプロデューサ1へ)。又、図5Cに示す依存性のダイナミック変化は、例示に過ぎず、従って、多数の異なる状況が生じ得ることも理解されたい(例えば、ダイナミックな変化が決して生じない;プロデューサ5が最初はプロデューサ7Bに依存し、次いで、プロデューサ7Aへと変化する;プロデューサ5が最初はプロデューサ7Bに依存し、且つダイナミックな変化は、ずっと生じない;プロデューサ5が図5Dに示すようにプロデューサ7A及び7Bの両方に依存することが分かる;等々)。異なる実施形態では、異なる仕方でダイナミックプロデューサ依存性を解明できるが、幾つかの例について以下に述べる。
従って、プロデューサグラフの自動再実行は、プロデューサが変更され且つその直接的な親が再実行されることに制限されず、むしろ、変化が、ランタイムによりプロデューサグラフを通して自動的に波及されて、適切なプロデューサ及び依存性に影響を及ぼす。というのは、プロデューサグラフが維持される(且つ増分的実行がサポートされるところでそれが使用される)からである。従って、変化は、必要な付加的な発見、構築、解明及び実行を生じさせる。従って、プロデューサグラフの再実行は、プロデューサグラフのどのプロデューサが影響されるかユーザ/プログラマーが決定しておそらく手動でグラフを修正する必要がないという意味で、自動的である。
スタティックプロデューサ依存性
スタティック依存性とは、ランタイム中に変化しないものである。従って、コンティンジェント及びサブスクリプションダイナミック依存性をサポートする実施形態では、非コンティンジェント及び非サブスクリプション依存性がスタティック依存性である。図4Aの例示的なプロデューサグラフは、スタティック依存性のプロデューサグラフを示している。
プロデューサグラフ形状
オブジェクト指向のプログラミング言語におけるプロデューサは、少なくともクラス、そのクラスのインスタンス、及びそのインスタンスに関連したメソッドであるから、プロデューサグラフは、クラス、インスタンス及びメソッド中心である。従って、プロデューサグラフは、インスタンス及びそれらインスタンスに関連したメソッドを表すグラフであり、従って、プロデューサグラフは、少なくともインスタンス及びメソッド中心である。プロデューサが少なくともクラス、メソッド及びインスタンスである本発明の実施形態では、プロデューサグラフは、少なくともクラス、メソッド及びインスタンス中心である。
プロデューサグラフは、種々の異なる形状(例えば、プロデューサの単一チェーン、ツリー、等)をとり得ることを理解されたい。図5Bの例示的プロデューサグラフは、プロデューサ1の根ノードがあって、そこから、プロデューサ2及びプロデューサ3の各々へ2つの分岐があるツリーである。プロデューサ3が葉ノードである場合には、プロデューサ2は、そこから、プロデューサ4及びプロデューサ5の各々へ延びる2つの分岐を有する。プロデューサ5は、そこから、プロデューサ6及びプロデューサ7Aへ各々延びる2つの分岐を有する。図5Bの例示的プロデューサグラフは、マルチレベルと言われ、レベル1は、根ノードプロデューサ1を含み、レベル2は、プロデューサ2及びプロデューサ3を含み、レベル3は、プロデューサ4及びプロデューサ5を含み、レベル4は、プロデューサ6及びプロデューサ7Aを含む(図5Cでは、レベル4は、プロデューサ7Bを含み、そしてレベル5は、プロデューサ8を含む)。ある実施形態では、パラレル化は、各レベルのプロデューサをパラレルに実行することにより具現化できる。プロデューサの実行は、図5Cにおけるレベル5のような最低レベルのプロデューサで始まり、次いで、レベルごとにアップ方向に移動する。あるレベルにおけるプロデューサの実行をスタートする前に、ランタイムは、手前の低いレベルにおける全てのプロデューサがレディとなり、即ち手前の低いレベルにおけるプロデューサの出力が返送されるまで、待機する。プロデューサ2を伴うプロデューサ1からの分岐を考慮するときには、分岐の第1プロデューサは、プロデューサ2であり、そして分岐の最後のプロデューサは、図5Bにおいて、プロデューサ4、プロデューサ6及びプロデューサ7Aである。
図5Bは、問題とするプロデューサの現在セットが単一プロデューサを含むようなプロデューサグラフを示すが、問題とする2つ以上の現在プロデューサをサポートする本発明の実施形態は、その各々に対してプロデューサグラフを発見し構築する。問題とするプロデューサが同時に複数ある場合には、それにより得られるプロデューサグラフは、独立でもよいし、又は交差してもよいことを理解されたい。プロデューサグラフが交差する場合には、本発明の実施形態は、次のように具現化できる。即ち、1)個別のプロデューサグラフを維持するようにプロデューサを複製する;又は2)このような複製を回避し、交差するプロデューサグラフを維持する。又、このような交差するプロデューサグラフは、別のプロデューサグラフのサブセットであるプロデューサグラフを含んでもよいことも理解されたい。例えば、プロデューサ5が、問題とするプロデューサの現在セットにプロデューサ1と共に含まれた場合には、プロデューサ5の根ノードを伴う第1プロデューサグラフと、プロデューサ1の根ノードを伴う第2プロデューサグラフとがあり、ここで、第2プロデューサグラフが第1プロデューサグラフを含む。例えば、プロデューサ7Bが、問題とするプロデューサの現在セットにプロデューサ1及びプロデューサ5と共に含まれた場合には、第1及び第2のプロデューサグラフとは個別で、図5Bにおけるプロデューサ7Bの根ノードを伴う第3のプロデューサグラフがある。更に、プロデューサ5のダイナミック依存性がプロデューサ7Aからプロデューサ7Bへと変化した場合には(図5C)、この変化の結果、第2プロデューサグラフ及び第3プロデューサグラフが残され(第1プロデューサグラフはそのようにならないが)、第3プロデューサグラフは、残っている第2プロデューサグラフのサブセットとなり、そして第2プロデューサグラフは、第1プロデューサグラフのサブセットとなる。上述したように、本発明の実施形態は、プロデューサグラフ(1つ又は複数)の合併及び分割を容易にするために、(グラフの集合ではなく)グラフを形成するように互いにリンクされるプロデューサの集合としてプロデューサグラフ(1つ又は複数)を記憶し操作することができる。一例として、これに限定されないが、プロデューサの集合としてプロデューサグラフ(1つ又は複数)を記憶し操作する本発明の実施形態をここに説明する。
例示的実行フロー
図6は、本発明の一実施形態により、ランタイムクライアントの論理的実行フローと、プロデューサグラフ指向のプログラミングサポートを伴うランタイムに対するその関係とを示すフローチャートである。図6において、破線の分割線600は、ランタイムクライアント610の論理的実行フローを、プロデューサグラフ指向のプログラミングサポートを伴うランタイム640から分離している。
ランタイムクライアント610の論理的実行フローは、ブロック615、620、625及び630を含み、一方、プロデューサグラフ指向のサポートを伴うランタイム640は、ブロック645、650、660及び任意の655を含む。矢印付きの実線は、ブロック630からブロック660への直接的因果関係を示す。対照的に、矢印付きの点線は、ランタイムクライアント610の論理的実行フローにおけるブロック615及び625から、プロデューサグラフ指向のサポートを伴うランタイムにおけるブロック645及び650への因果関係を各々示し、本発明の実施形態に基づき、この因果関係は、直接的でも間接的でもよい。例えば、図6は、破線600の、プロデューサグラフ指向のサポートを伴うランタイム640の側で、破線楕円におけるコマンドログ665の使用により任意の間接的な因果関係を示す。コマンドログ665は、コマンドログ665は、ランタイムクライアント610の論理的実行フローのブロック615及び625から生じるコマンドを収集し、そしてコマンドログ665は、ブロック630に応答して、処理ブロック660により消費される。従って、コマンドログ665は、コマンドを遅延させて、複数のコマンドを一緒に収集し、それらを最適化のためにバッチ処理できるようにする。従って、コマンドログ665は、図3Bのオーバーライドログ396と同様であり、実際上、本発明の幾つかの実施形態にはオーバーライドログ396が含まれる。
ブロック615において、問題とする1つ以上のプロデューサのセットは、問題とするプロデューサの現在セットとして決定され、制御がブロック620へ通される。ブロック615とブロック645との間の因果関係に応答して、ブロック645は、問題とするプロデューサの現在セットがインスタンス生成されることを示すと共に、ランタイムクライアント610におけるプロデューサ依存性宣言に基づき、インスタンス及びそのプロデューサを必要に応じてインスタンス生成することも含めて、各々プロデューサグラフ(1つ又は複数)を発見し、構築し、且つ解明するよう試みる(ダイナミック依存性がサポートされ且つその1つ以上がプロデューサグラフにおいて発見される場合に)ことを示す。図3A及び3Bを参照すれば、自動プロデューサグラフ発生モジュール340及び365が各々インボークされる。
ブロック620において、プロデューサ出力オーバーライドがあるかどうか決定される。もしあれば、制御がブロック625へ回され、さもなければ、制御がブロック630へ回される。
ブロック625において、1つ以上のプロデューサ出力オーバーライドが、1つ以上のプロデューサのセットに対して受け取られ、制御がブロック630へ回される。ブロック625とブロック650との間の因果関係に応答して、ブロック650は、オーバーライドされたプロデューサの現在セットがインスタンス生成され(ブロック645においてまだインスタンス生成されていない場合)、それらの出力が変更され、そしてそれらが追跡されることを示す。オーバーライドされたプロデューサは、ブロック645においてプロデューサグラフ(1つ又は複数)の一部分であることが既に発見されているので、既にインスタンス生成されているかもしれない。しかしながら、オーバーライドされたプロデューサは、未解明のダイナミック依存性のものであるので、ブロック645においてまだ発見されていないかもしれない。従って、このオーバーライドされたプロデューサは、ダイナミック依存性が解明されたときにプロデューサグラフに追加されることを予想して、インスタンス生成されオーバーライドされる。又、既に述べたように、図3Bのオーバーライドログ396は、それが具現化された場合に、ブロック625とブロック650との間に存在し、そしてコマンドログ665の一部分となる。更に、オーバーライドされたプロデューサのセットは、増分的実行をサポートする本発明の幾つかの実施形態において追跡される。オーバーライドログ396/コマンドログ665をサポートする本発明の実施形態において、追跡はログの一部分であるが、本発明の別の実施形態では、追跡は、異なるメカニズムを伴うブロック650において個別に遂行される。
ブロック630において、プロデューサグラフ実行モジュールがインボークされ、そして制御がブロック615及び/又はブロック625へ任意に戻される。ブロック630とブロック660との間の因果関係に応答して、ブロック660は、現在プロデューサグラフ(1つ又は複数)がウォーキングされ、そして実行を要求するプロデューサが、追跡に基づいて実行される。プロデューサグラフのプロデューサを実行するための種々の技術が上述され、それらをここに適用することができる。図3A及び3Bを参照すれば、プロデューサグラフ実行モジュール345及び370が各々インボークされる。更に、コマンドログ665が具現化される本発明の実施形態では、因果関係は、コマンドログ665を消費し、そしてブロック660の前に処理ブロック645及び650を遂行することを含む。更に、未解明の依存性の可能性をサポートする本発明の実施形態では、制御が必要なときにブロック660からブロック665へ流れる。
ブロック655において、未解明の依存性を解明し、そしてインスタンス及びそのプロデューサをインスタンス生成することを含めて、プロデューサグラフ(1つ又は複数)の残りを発見し構築するように試みられる。ブロック655から、制御は、ブロック660へ戻される。
プロデューサ依存性宣言の例示的形態
図7A−Fは、本発明の一実施形態によるプロデューサ依存性宣言に対する幾つかの例示的形態を示す。図7A−Fは、引数、フィールド及びシーケンス依存性をサポートする実施形態を示すが、異なる実施形態が、3つの依存性形態のうちの1つ又は2つだけをサポートしてもよいことが理解されよう。図7A−Fに示す本発明の実施形態では、プロデューサ依存性宣言は、プロデューサ依存性宣言ステートメント、及び任意のものとして、明示的プロデューサ依存性宣言コードで構成される。非ショートカット宣言プロデューサ依存性は、明示的プロデューサ依存性宣言コードが使用されるものであり、一方、ショートカット宣言プロデューサ依存性は、明示的プロデューサ依存性宣言コードが使用されない(むしろ、ランタイムがプロデューサ依存性宣言コードを使用せず、及び/又はそれを、プロデューサ依存性宣言ステートメントの情報に基づいてオンザフライで具現化する)ものである。
本発明の異なる実施形態は、プロデューサ依存性を宣言するために異なるシンタックスを使用することができる。例えば、本発明の異なる実施形態は、生成できるプロデューサ依存性の形式を強く制約し、弱く制約し、及び/又は制約しない異なるシンタックを、プロデューサ依存性宣言ステートメントに使用するために含ませることができる。強く制約されるプロデューサ依存性は、生成できるプロデューサ依存性の形式を実質的に制限するシンタックスがプロデューサ依存性宣言ステートメントに使用されるというものであり、弱く制約されるプロデューサ依存性は、生成できるプロデューサ依存性の形式をあまり制限しないシンタックスがプロデューサ依存性宣言ステートメントに使用されるというものであり、そして非制約のプロデューサ依存性は、生成できるプロデューサ依存性の形式を制限しないシンタックスがプロデューサ依存性宣言ステートメントに使用されるというものである。
例えば、これに限定されないが、以下に述べる本発明の実施形態は、次のものを含む。即ち、1)引数に対して強く制約されたプロデューサ依存性のためのシンタックス(ArgumentDependency=強く制約され下方に宣言された引数[スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント及び/又はアブソーブサブスクリプション]依存性);2)フィールドに対して強く制約されたプロデューサ依存性のためのシンタックス(FieldDependency=強く制約され下方に宣言されたフィールド[スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント及び/又はアブソーブサブスクリプション]依存性);3)シーケンス依存性に対して強く制約されたプロデューサ依存性のためのシンタックス(SequencingDependency=強く制約され下方に宣言されたシーケンス[スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント及び/又はスティッキーサブスクリプション]依存性);4)引数、フィールド又はシーケンス依存性に対して弱く制約され上方に宣言されたプロデューサ依存性のためのシンタックス(UpwardDependency=弱く制約され上方に宣言されたフィールド、引数、又はシーケンス[スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント]依存性);及び5)弱く制約されたプロデューサ依存性のためのシンタックス(WeaklyConstrainedDependency=a)下方に宣言されたシーケンスのみ[スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント及び/又はスティッキーサブスクリプション]依存性、又はb)上方に宣言された[引数、フィールド又はシーケンス][スタティック又はダイナミックそしてダイナミックの場合にはコンティンジェント]依存性)。本発明の幾つかの実施形態は、下方に宣言された引数依存性、下方に宣言されたフィールド依存性、上方に宣言された依存性(上方に宣言された引数、フィールド又はシーケンス依存性を返送できる)、及び弱く制約される依存性(下方に宣言されたシーケンス依存性、上方に宣言された引数、フィールド、又はシーケンス依存性を返送できる)を区別するプロデューサ依存性宣言ステートメントのためのシンタックスをサポートするが、本発明の別の実施形態は、異なるシンタックスを採用してもよい(例えば、サポートされた依存性(下方及び上方に宣言された引数、フィールド及びシーケンス依存性)を返送できる依存性決定プロデューサで全ての依存性を非制約の依存性にさせるシンタックスを有し;サポートされた全ての依存性を区別するシンタックスを有し;下方及び上方に宣言された引数及びフィールド依存性を区別すると共に、上方及び下方に宣言されたシーケンス依存性しか返送できない弱く制約された依存性を区別するシンタックスを有し;下方に宣言された引数及びフィールド依存性を区別すると共に、上方に宣言されたシーケンス依存性しか返送できない上方に宣言された依存性を区別するシンタックスを有し;下方に宣言された引数、フィールド、及びシーケンス依存性を区別する(スティッキーサブスクリプション及び上方に宣言された依存性はサポートされない)シンタックスを有し;等々)。
プロデューサ依存性宣言ステートメントのシンタックスは、必ずしも、プロデューサグラフに生成されたプロデューサ依存性(例えば、リンク)に等しくないことを理解されたい(例えば、ArgumentDependencyは、引数依存性を生成するが、UpwardDependencyは、引数、フィールド又はシーケンス依存性を生成することができる)。従って、理解のために適切である場合に、修飾子(例えば、引数、フィールド又はシーケンス)と語「依存性」との間のスペースは、ランタイムにより生成される依存性を指すのに使用され、一方、スペースの欠落は、シンタックスを指すのに使用される。
図7Aは、本発明の一実施形態によりショートカット宣言依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図7Bは、本発明の一実施形態による例示的プロデューサのブロック図である。図7Aは、次のものを示す。1)ArgumentDependencies 1-N、FieldDependencies 1-M、SequencingDependencies 1-L、UpwardDependencies 1-P、及びWeaklyConstrainedDependencies 1-Qを含むプロデューサ依存性宣言ステートメント705;及び2)プロデューサ依存性宣言ステートメント705からの引数1−Nを有するメソッドアルファ710。本発明の一実施形態では、プロデューサ依存性宣言ステートメントの引数は、追跡のために各々引数IDを与えるように番号付けされる。図7Bは、次のものに対する子依存性を有するプロデューサ720を示している。1)引数ID 1に対するプロデューサ725;2)引数ID Nに対するプロデューサ730;3)FieldDependencies 1-Mに対するプロデューサ740−745;4)SequencingDependencies 1-Lに対するプロデューサ746−747;及び5)UpwardDependencies 1-Pに対するプロデューサ748−749(注:WeaklyConstrainedDependencies 1-Qは、図示されていないが、図7Gを参照して詳細に説明する)。従って、プロデューサ依存性宣言ステートメント705の引数は、メソッドアルファ710の引数に対応し、そしてプロデューサ依存性宣言ステートメント705における引数の引数IDは、それらが識別する子プロデューサに関して追跡される。
図7Cは、本発明の一実施形態により非ショートカット宣言依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示すと共に、例示的プロデューサのブロック図である。図7Cは、図7Aのプロデューサ依存性宣言ステートメント705及びメソッドアルファ710を示すと共に、図7Bのプロデューサ720及び725を示す。更に、図7Cは、引数依存性1に関連したプロデューサ依存性宣言コード715も含む。ランタイム中に、ランタイムは、プロデューサ依存性宣言ステートメント705の引数依存性1に応答してプロデューサ依存性宣言コード715にアクセスして実行する。プロデューサ依存性宣言コード715の実行は、プロデューサ725を引数依存性1のためのプロデューサ依存性として返送する。従って、図7Cは、プロデューサ依存性宣言コード715が(メソッドアルファ710以外の)メソッドの一部分でよいが、プロデューサの一部分ではないような本発明の実施形態を示す。
図7Dは、本発明の一実施形態により非ショートカット宣言依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図7Eは、 本発明の一実施形態による例示的プロデューサのブロック図である。図7Dは、図7Aのプロデューサ依存性宣言ステートメント705及びメソッドアルファ710を示し、一方、図7Eは、図7Bからのプロデューサ720及び725を示す。更に、図7Dは、1)プロデューサ依存性宣言ステートメント750、及び2)プロデューサ依存性宣言コード760を含むメソッドベータ755も示している。又、図7Dは、プロデューサ依存性宣言ステートメント705の引数依存性1が、引数依存性1に対して依存性を返送するメソッドベータ755に基づいてプロデューサ(図7Eにプロデューサ765として示された)を識別することも示している。ランタイム(run time)中に、ランタイム(runtime)は、プロデューサ依存性宣言ステートメント705の引数依存性1に応答して、プロデューサ765を実行し、引数依存性1に対するプロデューサ依存性がプロデューサ725であるという識別を返送する。従って、プロデューサ765は、依存性決定プロデューサと称され(その出力は、プロデューサ依存性であり、従って、プロデューサグラフ指向のプログラミングサポートを伴うランタイムにより特殊な処理(プロデューサグラフ(1つ又は複数)の操作)に対して監視されるクラス/インスタンスを使用して返送され)、一方、プロデューサ725は、標準的プロデューサと称される(その出力がもしあれば、それは、プロデューサグラフを操作するようにランタイムによって直接処理されず;その出力がもしあれば、それは、親プロデューサ(依存性決定プロデューサ又は別の標準的プロデューサ)により消費することができ、及び/又はプロデューサグラフの出力として与えることができる(標準的なプロデューサが問題とするプロデューサであり、従って、根ノードである場合)。
従って、図7D−Eは、プロデューサ依存性宣言コード715が、依存性決定プロデューサと称される別のプロデューサの一部分であるような本発明の実施形態を示す。図7D−Eにおいて、オブジェクト指向のソースコードは、メソッドに明示的プロデューサ依存性宣言コードを含み、そこから、ランタイムに、非ショートカット宣言依存性に対してランタイムにより依存性決定プロデューサがインスタンス生成されるが、本発明の別の実施形態は、それに加えて又はそれとは別に、ショートカット宣言依存性に対してオンザフライで1つ以上の一般的な依存性決定プロデューサとしてインボークされる一般的なプロデューサ依存性宣言コードを含むようにランタイムを具現化する。又、図7C−Eは、ArgumentDependenciesに関して示されているが、図示された技術は、他の形式の下方に宣言された依存性に適用することができる。更に、図7F−Gは、UpwardDependencies及びWeaklyConstrainedDependenciesに対する依存性決定プロデューサの使用も示している。
図7Fは、本発明の一実施形態により依存性決定プロデューサを伴うUpwardDependencyの使用による例示的依存性を示すブロック図である。図7Fは、依存性決定プロデューサ772に対するシーケンスプロデューサ依存性を有するプロデューサ720を示している。依存性決定プロデューサは、プロデューサ720に対する親プロデューサ748の非サブスクリプションの上方に宣言された引数、フィールド又はシーケンス依存性を返送することができる。更に、このような依存性決定プロデューサは、ダイナミック依存性(例えば、以下に述べるように、異なる引数ID間を含めて、データ値に基づき前記のものの間で選択するコンティンジェント依存性)を具現化することができる。本発明のある実施形態は、全てのこれら可能性をサポートするが、本発明の別の実施形態は、サブセットのみ(例えば、非サブスクリプションの上方に宣言されたシーケンス依存性のみ)をサポートする。
図7Gは、本発明の一実施形態により依存性決定プロデューサを伴うWeaklyConstrainedDependencyの使用により考えられる例示的依存性を示すブロック図である。図7Gは、依存性決定プロデューサ775に対するシーケンスプロデューサ依存性を有するプロデューサ720を示している。本発明のある実施形態では、依存性決定プロデューサは、次のいずれかを返送することができる。1)子プロデューサ780に対する非サブスクリプションの下方に宣言されたシーケンス依存性;2)プロデューサ720に対する親プロデューサ785の非サブスクリプションの上方に宣言された引数、フィールド又はシーケンス依存性;及び3)スティッキーサブスクリプション(以下に述べる)。更に、このような依存性決定プロデューサは、ダイナミック依存性(例えば、以下に述べるように、異なる引数ID間を含めて、データ値に基づき前記のものの間で選択するコンティンジェント依存性)を具現化することもできる。本発明のある実施形態は、全てのこれら可能性をサポートするが、本発明の別の実施形態は、サブセットのみ(例えば、非サブスクリプションの上方に宣言されたシーケンス依存性のみ)をサポートする。
上述したように、シーケンス依存性は、ランタイムが気付かない仕方でデータを変更するプロデューサと、そのデータを消費するプロデューサとの間で実行順序を確保すること等を含めて、種々の目的で使用することができる(子プロデューサは、その出力にアクセスするコードを含ませるために親プロデューサのメソッドを要求する仕方でその出力を書き込むことができる(例えば、普通のプロデューサ出力でなく、従って、ランタイムにより検出されない出力に作用することにより環境に影響するメソッド、例えば、グローバル変数をセットし、プロデューサ出力でないインスタンスにフィールドをセットし、外部データソースに影響する、等のメソッド))。ランタイムが気付かないソース(例えば、グローバル変数又は外部データソース)に影響しそしてそれらソースから読み取ることは、パラレル化能力が要求されるプロデューサにおいて回避されるべき特徴である。
異なる実施形態は、プロパティプロデューサに対してプロデューサ依存性を宣言するための1つ以上の方法をサポートすることができる。より詳細には、本発明の幾つかの実施形態において、フィールドを読み取るプロデューサは、ゲットプロパティ(get property)プロデューサに依存しなければならず、一方、ゲットプロパティプロデューサは、ゲットプロパティメソッドが責任を負うところのフィールドをセットするプロデューサに依存しなければならない。シーケンスプロデューサ依存性をサポートする本発明の実施形態に使用できるこの状況を取り扱う1つの技術は、ゲットプロパティメソッドに対し、そのゲットプロパティメソッドが責任を負うところのフィールドをセットする各メソッドに対するシーケンスプロデューサ依存性を生成するプロデューサ依存性宣言ステートメントを与えることである(例えば、図7Gに関して、プロデューサ780がフィールドをセットするプロデューサであり、且つプロデューサ720がそのフィールドに対して責任のあるゲットプロパティプロデューサである場合には、依存性決定プロデューサ775は、プロデューサ780に対するプロデューサ720の下方に宣言されたシーケンス依存性を返送するように書かれる)。シーケンスプロデューサ依存性及び上方に宣言されたプロデューサ依存性の両方をサポートする本発明の実施形態に使用できるこの状況を取り扱う第1の技術は、フィールドをセットするメソッドに対するプロデューサ依存性宣言ステートメント/コードにおいて、そのフィールドについて責任を負うゲットメソッドに対する上方に宣言されたシーケンスプロデューサ依存性(例えば、UpWardDependency又はWeaklyConstrainedDependenciesを使用する)を含ませることである(例えば、図7Gに関して、プロデューサ720がフィールドをセットするプロデューサであり、且つプロデューサ785がそのフィールドに対して責任のあるゲットプロパティプロデューサである場合には、依存性決定プロデューサ775は、プロデューサ720に対する親プロデューサ785の上方に宣言されたシーケンス依存性を返送するように書かれる)。この第2の技術は、フィールドをセットするメソッドのプログラマーが、適切なゲットメソッドに対するプロデューサ依存性を与える責任をもてるようにするもので、プログラマーがゲットメソッドへと進んでそのプロデューサ依存性宣言ステートメント/コードを変更することを要求するのではない。
シーケンス依存性を使用するとき、所与のプロデューサが所与の変数に依存するときには、その変数は、プロデューサグラフ(1つ又は複数)の所与の実行においてそのプロデューサの子孫プロデューサの2つ以上により変更されてはならない(コンティンジェント依存性(以下に述べる)により、現在プロデューサグラフ(1つ又は複数)の異なる実行中に、異なる子孫プロデューサがその変数を変更し得ることに注意されたい)。例えば、ゲットプロパティプロデューサは、現在プロデューサグラフ(1つ又は複数)の所与の実行においてそのゲットプロパティプロデューサが責任を負うフィールドをセットする1つの他のプロデューサのみに依存するものでなければならない。
本発明の異なる実施形態は、図7A−Fに示す本発明の実施形態の1つ以上を具現化できることを理解されたい。例えば、本発明の一実施形態は、依存性決定プロデューサを使用してショートカット及び非ショートカット宣言依存性をサポートし、より詳細には、本発明のこの実施形態では、1)オブジェクト指向のソースコードは、メソッドに明示的プロデューサ依存性宣言コードを含み、そこから、ランタイムに、非ショートカット宣言依存性に対してランタイムにより依存性決定プロデューサがインスタンス生成され;2)ランタイムは、ショートカット宣言コンティンジェント依存性(以下に述べる)に対してオンザフライで1つ以上の一般的な依存性決定プロデューサとしてインボークされる一般的なプロデューサ依存性宣言コードを含み;そして3)ランタイムは、ショートカット宣言非コンティンジェントプロデューサ依存性(以下に述べる)を直接リンクするためのサポートを含む。
別の例として、本発明の一実施形態は、依存性決定プロデューサを使用して非ショートカット及びショートカットプロデューサ依存性をサポートし、より詳細には、本発明のこの実施形態では、1)オブジェクト指向のソースコードは、メソッドに明示的プロデューサ依存性宣言コードを含み、そこから、ランタイムに、非ショートカット宣言依存性に対してランタイムによって依存性決定プロデューサがインスタンス生成され、そして;2)ランタイムは、ショートカット宣言依存性に対して(形式に関わりなく)オンザフライで1つ以上の一般的な依存性決定プロデューサとしてインボークされる一般的な依存性決定コードを含む。この後者の実施形態は、プロデューサ依存性の一貫した処理を許し、従って、ランタイムを簡単にする。
更に、本発明の一実施形態では、メソッドに対するプロデューサ依存性宣言ステートメントは、オブジェクト指向のソースコードにおけるそのメソッドの真上に位置されるが、本発明の別の実施形態では、別のところに位置される(例えば、あるクラスの全てのメソッドに対するプロデューサ依存性宣言ステートメントが、そのクラス内で一緒にグループ化され、全てのクラスの全てのメソッドに対するプロデューサ依存性宣言ステートメントが個別のデータテーブルとして一緒にグループ化され、等々)。又、本発明の一実施形態では、プロデューサ依存性宣言コードがプロデューサ依存性宣言ステートメントとは別個であるが、本発明の別の実施形態では、それらが合成される(例えば、プロデューサ依存性宣言コードがプロデューサ依存性宣言ステートメントのカッコ内にあり、プロデューサ依存性宣言コードがプロデューサ依存性宣言ステートメントの真下にあってランタイムにより単一のユニットとして処理され、等々である)。
図7H−Iは、依存性決定プロデューサのためにプロデューサグラフに存在し得る異なるサブグラフ間の区別を示す。図7Hは、本発明の一実施形態による標準的プロデューサのプロデューサグラフを例示する。より詳細には、図7Hは、根ノードS1を伴うプロデューサグラフ、根ノードS5を伴うプロデューサグラフ、及び根ノードS11を伴うプロデューサグラフを示す。標準的プロデューサS1は、子の標準的プロデューサS2、S3及びS4を有し、標準的プロデューサS2及びS3は、子の標準的プロデューサS7及びS8を有し、標準的プロデューサS5は、子の標準的プロデューサS4及びS6を有し、そして標準的プロデューサS11は、子の標準的プロデューサS6及びS10を有する。図7Hの例示的プロデューサグラフは、多数のプロデューサ依存性及び依存性決定プロデューサを使用して発見し、構築し、解明することができる。図7Iは、図7Hのプロデューサグラフを発見し、解明し、構築するためのプロデューサ依存性及び依存性決定プロデューサの一例を示す。より詳細には、図7Iは、図7Hのグラフが、プロデューサグラフの大きなセットのうちのサブグラフであることを示している。換言すれば、図7Iのプロデューサグラフは、図7Hのグラフ(「ターゲットサブグラフ」と称され、矢印付き実線及び実線の楕円を使用して示されている)と、ターゲットサブグラフの発見、解明、構築を助成するグラフ(「判断サブグラフ」と称され、矢印付き破線及び破線の楕円を使用して示されている)とを含む。図7Hの判断サブグラフは、依存性決定プロデューサ(DDP)1−11及び標準的プロデューサS9−10を含む。図7Hにおいて、S1は、DDP1−3に依存するとして示され、これらは、各々、S2、S3及びS4に対するS1の下方に宣言されたプロデューサ依存性を返送し、S4は、DDP4に依存するとして示され、これは、S4に対するS5の上方に宣言されたプロデューサ依存性を返送し、S5は、DDP5に依存するとして示され、これは、S6に対するS5の下方に宣言されたプロデューサ依存性を返送し、S3は、DDP6に依存するとして示され、これは、次いで、DDP8に依存し、これは、S9及びS10に対するDDP6の下方に宣言されたプロデューサ依存性を返送し、これは、DDP6が、S7に対するS3の下方に宣言された依存性を返送するようにさせ、S3は、DDP7に依存するとして示され、これは、S8に対するS3の下方に宣言されたプロデューサ依存性を返送し、S8は、DDP9に依存するとして示され、これは、S6がトリガープロデューサで且つS11が生成された親であるところのスティッキーサブスクリプション(従って、S6に対するS11のプロデューサ依存性)を返送し、S2は、DDP10に依存するとして示され、これは、S7及びS8に対するS2の下方に宣言されたプロデューサ依存性の集合を返送し、そしてS11は、DDP11に依存するとして示され、これは、S10に対するS11の下方に宣言されたプロデューサ依存性を返送する。標準的プロデューサは、ターゲットサブグラフ及び判断サブグラフの両方の一部分でよい(例えば、S10を参照)ことを理解されたい。ターゲットサブグラフは、データが、グラフを上るように、ある標準的プロデューサから別の標準的プロデューサへ流れるという意味で、データ駆動されることに注意する価値がある。
例示的プログラミング及び実行フレームワーク
図8Aは、本発明の一実施形態によりアプリケーションがエンドユーザに与えられるところの第1の例示的フレームワークを示すブロック図である。図8Aに示すフレームワークは、3つの基本的な区分を含む。第1区分は、プロデューサグラフ指向のプログラミングサポートを伴うランタイム810の生成を含む。この第1区分は、非常に高度なプログラミングスキルをもつプログラマーによって遂行される。この区分で作業するときには、プログラマーは、ランタイムプログラマーと称される。プロデューサグラフ指向のプログラミングサポートを伴うランタイムを生成するときには、ランタイムプログラマーは、プロデューサグラフに対するサポートと、変換コード、インスタンス生成コード及びデータ準備コードに使用される種々の形式のコマンドを実行するためのサポートとを含む。
第2区分は、ランタイムによって実行されるオブジェクト指向のアプリケーションソースコード820の生成を含む。オブジェクト指向のアプリケーションソースコード820は、2つの基本的区分を含む。即ち、1)プロデューサ依存性宣言を伴うメソッドで表現されたビジネスロジックを含むクラス定義822(これは、グラフィックユーザインターフェイスのような他のファンクションを任意に含むことができ、このケースでは、グラフィックユーザインターフェイスは、プロデューサ及びプロデューサ依存性宣言を使用して書かれ);及び2)メソッドで表現されたクライアントコードを含むクラス定義824。これは、更に、インスタンス生成コード(プロデューサグラフ(1つ又は複数)を発生させるための、問題とするクラス、インスタンス及びプロデューサ(1つ又は複数))824A、データ準備コード(例えば、プロデューサ出力のオーバーライドをトリガーするセットコマンドのようなセットコマンド)824B、プロデューサグラフ(1つ又は複数)を実行させるグローバル実行コマンド(例えば、実行及びゲットコマンド)824C、及び必要なグラフィックユーザインターフェイス(822には含まれず)824Dを含む。プロデューサ依存性宣言は、クラスのインスタンスが生成された後ではなく、ビジネスロジックを含むクラスの定義中に、プロデューサ間の連結を定義するのに使用される。オブジェクト指向のソースコード820は、コンパイルされて実行されるハードコード化クラス、インスタンス、及びメソッドである。
本発明の一実施形態では、グローバル実行コマンドが具現化され、これを実行すると、プロデューサグラフ(1つ又は複数)構造380に現在ある全てのプロデューサグラフ(1つ又は複数)の実行が試みられるが、本発明の別の実施形態では、それとは別に又はそれに加えて、実行されるべき現在プロデューサグラフ(1つ又は複数)の所与のグラフの識別を要求するグラフ特有の実行コマンドが具現化される。更に、グローバルな実行コマンドは、ランタイムの具現化に基づき、明示的(例えば、セット、セット、セット、実行、ゲット、ゲット)でもよいし、又は暗示的でもよい。例えば、暗示的なグローバル実行コマンドは、1)問題とするプロデューサに対する第1ゲットコマンド(例えば、セット、セット、セット、ゲット(暗示的実行)、ゲット)によりトリガーすることができ、2)各データ操作(セット(暗示的実行)、セット(暗示的実行)、セット(暗示的実行))によりトリガーすることができ、等々である。
第2区分も、高度なプログラミングスキルをもち且つアプリケーションのビジネスオブジェクトを理解するプログラマーによって遂行される。この区分で作業するときには、プログラマーは、ランタイムプログラマーと称される。その一部分として、アプリケーションがグラフィックユーザインターフェイスを要求する場合には、アプリケーションプログラマーは、特定のアプリケーションに対してグラフィックユーザインターフェイスの設計及びコード化も行い、従って、アプリケーションデザイナーとも称される。
第3区分は、ランタイムにより実行されるアプリケーションプログラムの使用を含む。第3区分は、プログラミングスキルをもつ必要のないエンドユーザによって遂行される。アプリケーションプログラムは、種々の仕方で配布することができる(例えば、ソースコードとして;ソースコードを変換したもの、例えば、バイトコードとして;バイナリーとして;等々)。更に、アプリケーションプログラムは、スタンドアローン使用830(このケースでは、全アプリケーションプログラム(及びまだ存在しなければランタイム)がコンピュータシステムに与えられる)及び/又はクライアント/サーバー使用に対して配布することもできる。本発明の一実施形態では、クライアント/サーバー配布は、サーバー使用832に対してプロデューサ依存性宣言を伴うメソッドで表現されたビジネスログを含むクラス定義822(及びまだ存在しなければランタイム)と、クライアント使用834に対してメソッドで表現されたクライアントコードを含むクラス定義824(及びまだ存在しなければランタイム)とを配布することを含み、コンピュータシステムにおけるクライアント使用834は、サーバーシステムにおけるサーバー使用832との通信を生じさせる。
又、図8Aは、スタンドアローン使用830及びクライアント使用834に対して設けられた任意の構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840も示している。オブジェクト指向のソースコード820は、プロデューサグラフ(1つ又は複数)を発生するためにランタイムによって実行され、そして構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840は、プロデューサグラフからの出力をグラフ表示し且つプロデューサグラフと対話できるようにする。より詳細には、構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840は、次のものを含む。即ち、1)レイアウトの構成及び選択されたプロデューサ出力のマッピング(例えば、使用すべきスクリーンのエリア、データをどのように表示するか、等)を許すための構成及びマッピンググラフィックユーザインターフェイスモジュール844;及び2)構成されたレイアウトをレンダリングしそしてプロデューサ出力のオーバーライドを許す(その結果、グローバルな実行コマンドを通してプロデューサグラフの更新が生じる)ためのレンダリング及び対話グラフィックユーザインターフェイスモジュール864。構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840は、ランタイム810を書く同じエンティティにより生成されてもよいし、そうでなくてもよいことを理解されたい。
図8Bは、本発明の一実施形態によりアプリケーションがエンドユーザに与えられるところの第2の例示的フレームワークを示すブロック図である。図8Bは、次のことを除いて、図8Aと同じである。即ち、1)スタンドアローン使用830が存在しない;2)オブジェクト指向のソースコード820がサーバー使用832に与えられ、一方、クライアントコード824は、クライアント使用834に与えられない;3)構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840は、サーバー使用832に与えられ、クライアント使用834には与えられない;そして4)一般的な構成可能なインタラクティブなプロデューサ出力レイアウトクライアントインターフェイス885がクライアント使用834に与えられる。この構成可能なインタラクティブなプロデューサ出力レイアウトクライアントインターフェイス885は、構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840とインターフェイスするのに使用される。
使用するフレームワークに関わりなく、本発明の一実施形態では、プロデューサグラフ指向のプログラミングフレームワークは、プロデューサ依存性宣言と共に描かれていないプログラムとインターフェイスする能力を与える。プロデューサ依存性宣言と共に描かれていないプログラムとインターフェイスするこの能力は、1)発呼部分(プロデューサグラフ指向のプログラミングに基づいて書かれないグラフィックユーザインターフェイスのような);及び2)被呼部分(プロデューサグラフ指向のプログラミングに基づいて書かれない外部データソースのような)を含む。発呼部分は、クライアントコードを通して、プロデューサグラフ指向のプログラミングコマンドを発行することができる。被呼部分は、被呼部分を取り巻くプロデューサ(「ラッピングプロデューサ」と称される)の一部分として具現化される。被呼部分を実行すると(例えば、データソースからデータを読み取るか又は外部データソースにおけるデータの変化にサブスクライブすると)、インスタンスの変更をトリガーすることができる。これらの変化は、ラッピングプロデューサのコードにおいてプロパティセットメソッドをコールすることにより生じ得る。ゲットプロパティプロデューサ(ゲッター)は、外部データソースに生じる変化によりトリガーされるインスタンス変更がプロデューサグラフを通して適切に伝播されるよう保証するために、これらラッピングプロデューサに対する依存性を有するようにされる。上述したように、異なる実施形態は、プロパティプロデューサに関してプロデューサ依存性を宣言するための1つ以上の仕方をサポートすることができる。例えば、シーケンスプロデューサ依存性をサポートする本発明の幾つかの実施形態では、ラッピングプロデューサに対する非サブスクリプション下方宣言シーケンスプロデューサ依存性を宣言するためにSequencingDependenciesを使用することができる。更に別の例では、シーケンスプロデューサ依存性及び非サブスクリプション上方宣言プロデューサ依存性をサポートする本発明の幾つかの実施形態では、プロパティプロデューサに対する非サブスクリプション上方宣言シーケンスプロデューサ依存性を生成するために、ラッピングプロデューサのプロデューサ依存性宣言にUpwardDependencies及び/又はWeaklyConstrainedDependenciesを入れることができる。
図8C−Fは、本発明の一実施形態により構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840のスクリーンショット及び使用を例示する。本発明の実施形態は、スプレッドシートの形態において現在プロデューサグラフ(1つ又は複数)の選択された出力で構成、マッピング及び対話を与える構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840を参照して説明するが、本発明の別の実施形態は、それに加えて又はそれとは別に、別の形態のサポートを与えるように具現化することもできる。更に、スプレッドシートの形態で構成、マッピング及び対話を遂行する例示的な仕方を、幾つかの実施形態に基づいて説明するが、本発明の他の実施形態は、これらのオペレーションを、異なるインターフェイス及び/又は異なるスクリーンレイアウトを伴う別の仕方で遂行することができる。更に、スプレッドシートは、スプレッドシートに関連した既知のファンクションのいずれもサポートすることができる(例えば、カラー選択、フォント選択、バー/パイ/ラインチャート、ピボットテーブル、セービングレイアウト、ローディングレイアウト、等)。
図8C−Dは、本発明の一実施形態による自由セル選択のスクリーンショット及び使用を例示し、一方、図8E−Fは、本発明の一実施形態によるテーブル生成のスクリーンショット及び使用を例示している。図8C−Fの各々は、スクリーンの頂部に沿ったメニューバー850と、スクリーンの左側に沿った現在プロデューサグラフにおけるプロデューサ及びそれらの出力のクラス(ゲットプロパティメソッドを伴う)のリスト852と、スプリットシート状のレイアウトでスクリーンの残りを埋める構成及びマッピングビューア854とを含む。更に、図8C−Fは、リスト852におけるゲットプロパティメソッドを伴うクラスの、次の例示的リストも示している。1)クラス「個人(PERSON)」;2)名(FIRSTNAME)(例えば、ストリング)、氏(LASTNAME)(例えば、ストリング)、性別(GENDER)(例えば、ストリング)、家の住所(HOMEADDRESS)(クラス「住所(ADDRESS)」のインスタンス)、職場の住所(PROFESSIONALADDRESS)(クラス「住所」のインスタンス)、誕生日(DATEOFBIRTH)(例えば、日付)、及び年齢(AGE)(例えば、整数);3)クラス「住所」;及び4)都市(CITY)(例えば、ストリング)、州(STATE)(例えば、ストリング)、郵便番号(ZIPCODE) (例えば、ストリング)を含むクラス「住所」のゲットプロパティメソッド。従って、現在プロデューサグラフは、クラス「個人」及び「住所」のプロデューサと、出力がクラス「個人」及び「住所」のものであるプロデューサとを含む。又、ゲットプロパティメソッド「年齢」は、ゲットプロパティメソッド「誕生日」の出力に基づいて年齢を計算し、従って、ゲットプロパティメソッド「年齢」からインスタンス生成されるプロデューサは、ゲットプロパティメソッド「誕生日」からインスタンス生成されるプロデューサに依存する。
図8C−Dは、ビューアの第1列の連続セルに入れられた次の自由テキスト、即ち「顧客(CUSTOMER」、「名(FIRST NAME)」、「氏(LAST NAME)」、「誕生日(DATE OF BIRTH)」及び「年齢(AGE)」を示し、一方、図8E−Fは、次のもの、即ち、1)ビューアの第1行に入れられた自由テキスト「顧客リスト(CUSTOMER LIST」;及び2)ビューアの第2行の連続セルに入れられた自由テキスト「名(FIRST NAME)」、「氏(LAST NAME)」、「誕生日(LAST NAME)」及び「年齢(AGE)」を示している。
図8Cは、本発明の一実施形態により構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840での自由セル選択の例示的スクリーンショット及び使用を示す。図8Cは、クラス「個人」及びクラス「個人」の選択されたゲットプロパティメソッドの、ビューアの異なるクラスへのマッピング856のセットを示す。より詳細には、クラス「個人」は、自由テキスト「顧客」の右のセルへマップされる。このアクションの一部分として、本発明の幾つかの実施形態は、ユーザが多数のサポートされたフィルタの1つから選択するように促す(フィルタ選択858として示す)(例えば、リストをドロップダウンし、スクロール矢印を形成し、等)。これらのフィルタは、選択されたクラスのプロデューサの1つ以上のインスタンスキー、又は出力クラスが選択されたクラスであるプロデューサの1つ以上のインスタンスキーを選択できるようにする。本発明の幾つかの実施形態は、多数のフィルタをサポートするが、本発明の他の実施形態は、1つにデフォールトする(そしてユーザが異なるものを選択すべきかどうか選べるようにする)か、又は1つのみをサポートして、フィルタ選択858を行う必要がないようにする。又、マッピング856は、クラス「個人」のゲットプロパティメソッド「名」、「氏」、「誕生日」及び「年齢」が、各々、対応する自由テキストをもつセルに隣接するセルへマップされることも示す。このようなマッピングは、ドラグ及びドロップ、GUIフィールドへのタイプイン、等を含む多数の良く知られた技術で行うことができる。
図8Dは、本発明の一実施形態により構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840での自由セル選択の別の例示的スクリーンショット及び使用を示す。図8Dは、インスタンス選択854を許すためにクラス「個人」がマップされたセルを示している。より詳細には、このセルに使用されるフィルタに基づいて、ユーザには、クラス「個人」のプロデューサのインスタンスキー(1つ又は複数)及びクラス「個人」を生成するプロデューサのインスタンスキーを含むリストからクラス「個人」のインスタンスを選択する機会が与えられる。クラス「個人」のインスタンス(又は単一インスタンスの存在)を選択すると、クラス「個人」のゲットプロパティメソッドがマップされたセルに、そのインスタンスの対応ゲットプロパティメソッドの出力が自動的にポピュレートされる。クラス「個人」のインスタンスに基づくテーブルのこのようなポピュレーションが858で示されている。図8Dの例では、クラス「個人」のゲットプロパティメソッド「名」、「氏」、「誕生日」及び「年齢」がマップされたセルに、JOHN、SMITH、7/20/1990及び16が各々ポピュレートされる。
又、図8Dは、ゲットプロパティメソッドがマップされたビューアのセルがオーバーライドされることも示している。例えば、図8Dは、ゲットプロパティメソッド「誕生日」がマップされたセルがオーバーライドされた場合に、出力が現在そのセルにポピュレートしているプロデューサの出力のオーバーライド、グローバルな実行コマンドのインボケーション(これは、ゲットプロパティメソッド「年齢」がマップされたセルに出力が現在ポピュレートしているプロデューサの再実行を生じさせる)、及びディスプレイの必要な更新を引き起こすことを示している。
図8Eは、本発明の一実施形態による構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840でのテーブル生成の例示的スクリーンショット及び使用を示す。図8Eは、自由テキスト「名(FIRST NAME)」、「氏(LAST NAME)」、「誕生日(DATE OF BIRTH)」及び「年齢(AGE)」を伴うセル(セルの周りを太い破線で示した)の真下に3行の垂直テーブルを識別するようにオペレーションが行われるゾーン及びオリエンテーション選択864を示している。本発明の異なる実施形態は、ユーザがこのオペレーションを多数の仕方(次のものを含む:1)マウスのような入力装置でエリアを選択し;及び2)複数のオリエンテーションがサポートされると仮定すれば、ポップアップメニューのようなインターフェイスで垂直、水平又はピボットテーブル間を選択する)で行うのをサポートすることができる。又、図8Eは、クラス「個人」の選択されたゲットプロパティメソッドの、ビューアの異なるセルへのマッピング866のセットも示している。より詳細には、マッピング866は、クラス「個人」のゲットプロパティメソッド「名」、「氏」、「誕生日」及び「年齢」が、それに対応する自由テキストを伴うセルの真下にあるセルへ各々マップングされることを示している。
図8Fは、本発明の一実施形態による構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840でのテーブル生成の別の例示的スクリーンショット及び使用を示す。マッピング866は、クラス「個人」のゲットプロパティメソッドがマップされたテーブルの列に、そのクラスのインスタンスの対応ゲットプロパティメソッドの出力を自動的にポピュレートさせる。クラス「個人」のインスタンスに基づくテーブルのこのようなポピュレーションが868で示されている。図8Dの例では、クラス「個人」のゲットプロパティメソッド「名」、「氏」、「誕生日」及び「年齢」がマップされた列に、次のデータ行がポピュレートされる。即ち、1)STEVE、COLLINS、7/20/1990及び16;2)JENNIFER、ADAMS、7/20/1990及び16;及び3)JOHN、SMITH、7/20/1985及び21。
図8Dの場合と同様に、図8Eは、ゲットプロパティメソッドがマップされたビューアのセルがオーバーライドされることも示している。例えば、図8Fは、ゲットプロパティメソッド「誕生日」がマップされた列の第2行のセルがオーバーライドされた場合、出力が現在そのセルにポピュレートしているプロデューサの出力のオーバーライド、グローバルな実行コマンドのインボケーション(これは、ゲットプロパティメソッド「年齢」がマップされたセルに出力が現在ポピュレートしているプロデューサの再実行を生じさせる)、及びディスプレイの必要な更新を引き起こすことを示している。
図8C−Fは、構成及びマッピンググラフィックユーザインターフェイスモジュール842により発生されるスクリーンを例示している。レンダリング及びインタラクティブなグラフィックユーザインターフェイスモジュール846により発生されるスクリーンは、(ゲットプロパティメソッドを伴う)クラス852のリスト、構成及びマッピングビューア854が、表示される構成及びマッピングビューア854と同じ映像を含むレンダリング及びインタラクティブなビューア(図示せず)に置き換えられることを除いて、同じである(相違は、マッピング特徴がもはや得られないことである)。
例示的ランタイム配布スキーム
図9A−Cは、本発明の一実施形態によるプロデューサグラフ指向のプログラミングサポートを伴うランタイムを配布するための種々のスキームを示す。これらの配布スキームは、例示に過ぎず、従って、本発明の範囲内で他のスキームも考えられる。
図9Aは、本発明の一実施形態によるプロデューサグラフ指向のプログラミングサポートを伴うランタイムを配布するための第1のスキームを示すブロック図である。図9Aにおいて、オブジェクト指向のソースコード905(プロデューサ依存性宣言を含む)が、プロデューサグラフ指向のプログラミングサポートを伴うランタイム910の上に示されており、このランタイムは、クラスローディング、ダイナミッククラスインスタンス生成、ダイナミック単一メソッドインボケーション、及びクラス/メソッドイントロスペクションを伴うランタイム915の上にあり、そしてこのランタイムは、オペレーティングシステム920の上にある。図9Aにおいて、ランタイム910は、ランタイム915と共に働く。ランタイム910をランタイム915と共に働かせるのに多数のメカニズムを使用できるが、一例として、メタデータファシリティについて説明する。メタデータファシリティは、付加的な情報をソースコードに追加することができ、この情報は開発ツールにより使用される。例えば、Java仕様のメタデータファシリティは、開発ツール、配備ツール又はランタイムライブラリーにより特殊な仕方で処理されねばならないことを指示する特殊な属性を有するとしてフィールド、メソッド及びクラスにアノテーション付けするためのAPIを定義する(Java仕様要求175)。この例では、オブジェクト指向のソースコード905をプログラミングするプログラマーは、プロデューサ依存性宣言の形態でメソッドにアノテーションを追加する。これらアノテーションは、ランタイム915によりランタイム910へハンドオフされるので、ランタイム910は、プロデューサ依存性宣言のシンタックスを指令する。図9Aにおいて、ランタイム910及び915は、異なる組織によって開発され及び/又は配布されてもよい。
図9Bは、本発明の一実施形態によるプロデューサグラフ指向のプログラミングサポートを伴うランタイムを配布するための第2のスキームを示すブロック図である。図9Bにおいて、オブジェクト指向のソースコード925(プロデューサ依存性宣言を含む)がランタイム(クラスローディング、ダイナミッククラスインスタンス生成、ダイナミック単一メソッドインボケーション、及びクラス/メソッドイントロスペクション、並びにプロデューサグラフ指向のプログラミングサポートを伴う)930の上に示されており、そしてこのランタイムは、オペレーティングシステム935の上にある。図9Aとの比較において、ランタイム910及び915が単一のランタイム930へと合成されている。この合成の結果として、ランタイム930は、プロデューサ依存性宣言のシンタックスを指令する。従って、オブジェクト指向のソースコード925をプログラミングするプログラマーは、要求されるシンタックスにプロデューサ依存性宣言を追加する。
図9Cは、本発明の一実施形態によるプロデューサグラフ指向のプログラミングサポートを伴うランタイムを配布するための第3のスキームを示すブロック図である。図9Cにおいて、オブジェクト指向のソースコード940(プロデューサ依存性宣言を含む)がオペレーティングシステムランタイム(クラスローディング、ダイナミッククラスインスタンス生成、ダイナミック単一メソッドインボケーション、及びクラス/メソッドイントロスペクション、並びにプロデューサグラフ指向のプログラミングサポートを伴う)945の上に示されている。図9Bと比較して、ランタイム920及びオペレーティングシステム935が単一エンティティへと合成されている。この合成の結果として、オペレーティングシステムランタイム945は、プロデューサ依存性宣言のシンタックスを指令する。従って、オブジェクト指向のソースコード940をプログラミングするプログラマーは、要求されるシンタックスにプロデューサ依存性宣言を追加する。
ランタイムが、クラスローディング、ダイナミッククラスインスタンス生成、ダイナミック単一メソッドインボケーション、及びクラス/メソッドイントロスペクションを有するような実施形態を説明したが、別の実施形態は、より多くの又はより少ない特徴を含んでもよい(例えば、インスタンスクローンニング、ダイナミックプロキシー、プリミティブ形式変換、等)。
例示的効果
本発明の一実施形態においては、手動インボケーションシーケンスコードを使用せずに適切なインスタンスを使用して(ここで、適切なインスタンスは、引数として使用すべきインスタンス、インスタンスメソッドにより使用されるべきインスタンス、及びクラスメソッドにより使用されるメタクラスインスタンスを含む)メソッドインボケーションシーケンスを指定する仕方としてメソッドに対してプロデューサ依存性が宣言された。実際に、手動インボケーションシーケンスコードの幾つか又は全部を発生する作業は、次のものに置き換えられる。即ち、1)プロデューサ依存性宣言を書き込むためにアプリケーションプログラマーによって行われる作業;及び2)プロデューサグラフ(1つ又は複数)を発見及び構築し、そしてこれらプロデューサグラフ(1つ又は複数)のプロデューサを実行するためにランタイムにより行われる作業。換言すれば、手動インボケーションシーケンスコードに以前に含まれていたロジックは、プロデューサ依存性宣言に基づき、ランタイム中に、ランタイムにより発見することができる。従って、プロデューサ依存性宣言は、どんな引数を伴うどんなインスタンスのどんなメソッドを同期のためにいつ実行すべきかランタイムへ通知する。ランタイムを書くための努力は、比較的多大であるが、ランタイムに対して書かれたオブジェクト指向のアプリケーションを実行するのに使用できるという点で、一度書くだけでよく、対照的に、典型的なアプリケーションの場合、プロデューサ依存性宣言を書くための努力は、手動インボケーションシーケンスコードを書くことに比べて比較的僅かである。
プログラミングミステークの減少
プロデューサグラフ指向のプログラミングは、典型的に、手動インボケーションシーケンスコードのデバッグ及び/又は性能同調に関するコストを減少する。これは、少なくとも、アプリケーションプログラムのインフラストラクチャーが、概念的に、特定入力に対して動作するオブジェクトの変換メソッドの非公式化グラフのセットである(オブジェクトの1つのメソッドの出力は、別のメソッドへの入力となり、等々)という理由で言えることである。プロデューサ依存性宣言、及びプロデューサグラフ指向のプログラミングサポートを伴うランタイムは、これらのグラフをプロデューサグラフとして公式化する。従って、データが変化する機会のたびに、アプリケーションプログラマーは、適切なインスタンスの適切な変換メソッドを適切な入力と共に適切な順序でインボークさせるために、その作用を考慮して手動インボケーションシーケンスコードを書き込む必要がない。換言すれば、データが変化する機会のたびに、アプリケーションプログラマーは、どのグラフが影響を受けるか、及びそれらグラフ内のインスタンスのどの変換メソッドが影響を受けるか考慮する必要がない。むしろ、自動プロデューサグラフ発生モジュールがプロデューサグラフを発見及び構築し、そしてプロデューサグラフ実行モジュールが、データの変化を反映するように、必要に応じてプロデューサグラフを再実行する。この自動化は、次のようなミステークを回避する上でアプリケーションプログラマーの助けとなる。1)適切なインスタンスの適切な変換メソッドを間違った順序でインボークし、2)グラフにおけるインスタンスの1つ以上の要求された変換メソッドをあるデータの変化に応答してインボークさせるためのコマンドを入れ忘れ、3)あるデータの変化に応答してインスタンスの不必要な変換メソッドをインボークさせるコマンドを含ませる(例えば、データの変化により影響されるグラフの部分でないインスタンスの変換メソッドをインボークするコマンドを含ませ;データの変化により影響されるグラフの部分であるが、それ自身は影響のないインスタンスの変換メソッドをインボークするコマンドを含ませ;等々)。
同期
上述したように、実行中にプロデューサ出力をキャッシュ記憶することで、同期をとることができる。従って、オブザーバーパターンとの比較に関して、プロデューサ依存性宣言は、プロデューサグラフ指向のプログラミングサポートを伴うランタイムに依存性を通知し、そしてランタイムは、どんなプロデューサがいつコールバックするか決定する。
結果を完全に説明する能力
本発明の一実施形態では、ドリル/ビュー(drilling/viewing)モジュール(図示せず)がランタイムの一部分として含まれる。このドリル/ビューモジュールは、エンドユーザによる対話を通して、プロデューサグラフまで掘削して(根ノードからプロデューサグラフまでウォーキングして)、プロデューサグラフの種々のプロデューサの出力を見ることができるようにするグラフィックユーザインターフェイスをなす。これは、エンドユーザが、データ値及び依存性(依存性決定プロデューサにより返送された)を含めて、問題とするプロデューサの出力に貢献した種々の出力を見ることができるようにする。更に、本発明の一実施形態では、このドリル/ビューモジュールは、エンドユーザが、プロデューサのメソッド内のコード、プロデューサのインスタンスの値、及び/又はプロデューサのクラスのコンテンツを見る能力を与える。
従って、ドリル/ビューモジュールは、デバッグ、出力の説明、等を含む種々の後処理アクティビティを与える。
例示的な実際のアプリケーション/技術的影響/産業上の利用性
本発明の異なる態様及び実施形態には種々の例示的な実際のアプリケーションがある。例えば、ランタイムは、アプリケーションプログラムの実行の一部分として、マシン記憶媒体から情報を検索し(例えば、プロデューサ依存性宣言を含むオブジェクト指向のソースコードにアクセスし)、マシン記憶媒体に情報を記憶し(例えば、プロデューサグラフ(1つ又は複数)構造、等に類似したデータ構造を記憶し)、ハードウェア処理リソースを動作させ、問題とするプロデューサ(1つ又は複数)の出力を与え(例えば、グラフィックユーザインターフェイスを通して、マシン記憶媒体への記憶、送信、等)、等々を行う。ある意味においては、前処理アクティビティは、このようなアプリケーションプログラムの書き込み及び/又はデータの付与を含み(このデータは、多数の物理的及び/又は実際的なアイテム、例えば、金融的な値、地理的な値、気象学的な値、保険的な値、統計学的な値、物理学的な尺度、マシン状態値、等を表す)、一方、後処理アクティビティは、結果の付与を含む(この結果は、多数の物理的及び/又は実際的なアイテム、例えば、金融的な分析、地理的な分析、気象学的な分析、保険的な分析、統計学的な分析、工業的な尺度、マシン制御情報、等)。特定の例として、後処理アクティビティは、次のものにより与えることができる。1)ランタイムにより発生される現在プロデューサグラフ(1つ又は複数)の表現をグラフ表示するための図10のプロデューサグラフビューアモジュール1062;及び/又は2)プロデューサグラフからの出力をグラフ表示しそしてそれと対話するための構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840(図10の構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール1085も参照されたい)。
別の例として、ランタイムにより実行されたとき、プロデューサ依存性宣言それ自体を伴うアプリケーションプログラムは、物理的/実際的なアイテムを表し、そして上述したオペレーションを生じさせる。特定例として、これらのプロデューサ依存性宣言は、ランタイムによる実行に応答してデータ構造をマシン記憶媒体に形成するようにさせる。又、プロデューサ依存性宣言は、アプリケーションプログラムと共にマシン記憶媒体に記憶されそしてそこから検索される。更に、これらプロデューサ依存性宣言は、プロデューサ間の関係を表し、一方、プロデューサは、実行されるべきオペレーション(メソッド)及びインスタンスを表す。オブジェクト指向のプログラミングにおけるインスタンスは、物理的及び/又は実際的アイテムを表現するのに使用でき、一方、プロデューサは、それらの表現に対して遂行されるべきオペレーションを表現する。
別の例として、1つ以上のアプリケーションプログラム及びランタイムのセットは、外国為替、総資産、利子、信用、インフレーション、物価、及びクロスアセット複合商品をカバーするクロスアセットリスク管理ソフトウェアを具現化する。これらの商品は、現金及び物理的にプレーンなバニラ商品から、エキゾチックで複雑なデリバティブ商品までの範囲である。又、これらの商品に対する数学的評価モデルのセット、並びにそれらに関連したマーケットデータ、支払及び会計エントリー発生ルーチン及びそれらに関連した観察可能な校正モデル及びそれに関連した生の入力も含まれる。
別の例として、1つ以上のアプリケーションプログラム及びランタイムのセットは、ワードプロセッサ、スプレッドシート、通信/e−メールソフトウェア、フォトビューイングソフトウェア、ウィルススキャンソフトウェア、メディアプレーヤ、データベースサーバー、ゲーム、産業上のアプリケーション、及び/又はオペレーティングシステムを具現化することができる。もちろん、アプリケーションプログラムは、種々の他のタスクを遂行するように具現化することもできる。
例示的具現化
例示として、依存性、ダイナミックな依存性(コンティンジェント(contingent)依存性及びサブスクリプション(subscription)依存性を含む)、ショートカット宣言依存性及び非ショートカット宣言依存性に対する明示的依存性決定プロデューサ、ショートカット宣言依存性に対するオンザフライ依存性決定プロデューサ、クラスキー、インスタンスキー、メソッドキー、プロデューサオーバーライド/非オーバーライドコマンド(セットコマンドの形式である)、及びグローバル実行コマンドをサポートする本発明の実施形態について説明する。更に、これら実施形態は、任意であるが、プロデューサグラフのインタラクティブなビューアモジュール及び増分的実行もサポートする。もちろん、本発明の別の実施形態は、より多くの特徴、より少ない特徴及び/又は異なる特徴を具現化することができる。
図10は、本発明の一実施形態による例示的具現化のブロック図である。図10において、破線の分割線1000は、ランタイムクライアント1002を、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004から分離している。
ランタイムクライアント1002の論理的実行フローは、ブロック1010、1020、1025、1030及び1035を備え、そしてプロデューサグラフ指向のプログラミングサポートを伴うランタイム1004は、対応するブロック1095、1098、1040、1045、1070及び1082を各々備え、一方、矢印付きの実線は、ランタイムクライアント1002の論理的実行フローのブロック1035から、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004のブロック1070への直接的因果関係を表し、矢印付き点線は、ランタイムクライアント1002のブロック1010、1020、1025及び1030から、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004のブロック1095、1098、1040及び1045への因果関係を示している。本発明の実施形態に基づき、これら後者の因果関係は、直接的でも、間接的でもよい。例えば、図6と同様に、コマンドログ(図示せず)及び/又はオーバーライドログ1047の使用による任意の間接的因果関係を使用してもよい。更に、ブロック1095及び1098は、本発明の実施形態に基づき異なるブロックの一部分であるのも任意であるから、破線にされている(例えば、ブロック1095は、ブロック1098の一部分でよく、ブロック1090は、ブロック1040の一部分でよく、ブロック1095及び1090は、ブロック1040の一部分でよい)。同様に、ブロック1045は、本発明の実施形態に基づき異なるブロックの一部分であるのも任意であるから、破線にされている(例えば、ブロック1045は、ブロック1070の一部分でもよい)。同様に、ブロック1049は、本発明の実施形態に基づき異なるブロックの一部分であるのも任意である(例えば、ブロック1049は、ブロック1040の一部分でもよい)。ある実施形態では、ランタイム1004は、メトリック取得モジュール1082を含む。メトリック取得モジュール1082は、ブロック1070の一部分であるのも任意である。
図10において、ランタイム1002は、ビジネスロジックを含むクラス定義1010を備え、これは、データ1012、メソッド1014、実行モード設定1015、プロデューサ依存性宣言1016、及び任意のクラスキー1090を有する。クラス定義1010は、オブジェクト指向のプログラミング言語のクラスであり、従って、データ及びメソッド1014に対する定義を含む。実行モード設定1015は、この実行モード設定が後でオーバーライドされない場合にメソッドを実行すべき実行モードをコードレベルにおいて指定することができる。更に、これらのクラス定義1010は、上述したように、メソッド1014に対するプロデューサ依存性宣言1016を含む。更に、本発明の一実施形態では、各クラスは、追跡のためのクラスキー1090を有する。
ランタイム1004の新クラスモジュール1095は、クラス定義1010をロードし、イントロスペクトする(例えば、新クラスコマンドに応答して)。このようにロードしてイントロスペクトすることは、最適化の目的でクラスを選択的にロードするためのものを含めて、多数の良く知られた技術又は将来開発される技術を使用して行うことができる。新クラスモジュール1095によりクラスをロードすることは、ランタイム1004のクラス1054で示されている。クラス1054をロードしてイントロスペクトする一部分として、新クラスモジュール1095は、クラス1054におけるメソッド及びプロデューサ依存性宣言1056により示されたように、プロデューサ依存性宣言1016もロードし、イントロスペクトする。又、新クラスモジュール1095は、クラスキーを使用してクラスを追跡するのに使用されるクラス追跡構造1092も維持する。従って、クラス追跡構造1092は、クラスキーとクラス1054へのリファレンスとの間の対応性を維持する。更に、新クラスモジュール1095は、メソッドキーを使用してメソッドを追跡するのに使用されるメソッド追跡構造1058も維持する。従って、メソッド追跡構造1058は、メソッドキーとメソッドへのリファレンスとの間の対応性、並びにプロデューサ依存性宣言に関する情報を維持する。更に、新クラスモジュール1095は、実行モード設定1015を、プロデューサベースの構成可能な判断構造1049へ入力し、これは、プロデューサに対する実行モードを維持する。
又、ランタイムクライアント1002は、インスタンスキーを伴うインスタンスインスタンス生成コマンド1020も備えている。ランタイム1004の新インスタンスモジュール1098は、(例えば、新インスタンスコマンドに応答して)インスタンスキーを伴うインスタンスインスタンス生成コマンド1020により指定されたインスタンスをインスタンス生成する。このようにインスタンスをインスタンス生成することは、最適化の目的でインスタンスを選択的にインスタンス生成するためのものを含めて、多数の良く知られた技術又は将来開発される技術を使用して行うことができる。インスタンスをこのようにインスタンス生成する一部分として、新インスタンスモジュール1098は、クラス1054から適切なクラスにアクセスするために、クラスキーを使用してクラス追跡構造1092にアクセスする。新インスタンスモジュール1098によりインスタンスをインスタンス生成することは、ランタイム1004のインスタンス1052によって示される。又、新インスタンスモジュール1095は、インスタンスキーを使用してインスタンスを追跡するのに使用されるインスタンス追跡構造1065も維持する。従って、インスタンス追跡構造1065は、インスタンスキーとインスタンス1052へのリファレンスとの間の対応性を維持する。上述したように、新クラスモジュール1095は、クラス1054が、個別の新クラスコマンドではなく、インスタンスインスタンス生成コマンド1020に応答してインスタンス生成されるという点で、新インスタンスモジュール1098の一部分であってもよい。
又、ランタイムクライアント1002は、プロデューサキーを伴うプロデューサインスタンス生成コマンド1025も備えている。ランタイム1004の自動プロデューサグラフ発生モジュール1040は、プロデューサキーを伴うプロデューサインスタンス生成コマンド1025により指定されたプロデューサをロードする(例えば、問題とするプロデューサの現在セットを指定する新プロデューサコマンドに応答して)。更に、自動プロデューサグラフ発生モジュール1040は、上述した問題とするプロデューサの現在セットに応答してプロデューサグラフ(1つ又は複数)を発見し、構築し、及び任意なこととして、解明もする。本発明の一実施形態では、プロデューサキーは、クラスキー、インスタンスキー、及びメソッドキーで構成される。プロデューサのこのインスタンス生成の一部分として、自動プロデューサグラフ発生モジュール1040は、1)クラス1054から適切なクラスにアクセスするために、クラスキーを使用してクラス追跡構造1092にアクセスし;2)インスタンス1052から適切なインスタンスにアクセスするために、インスタンスキーを使用してインスタンス追跡構造1065にアクセスし;そして3)適切なプロデューサ依存性宣言ステートメントにアクセスするために、メソッドキーを使用してメソッド追跡構造1058にアクセスする。プロデューサキーを伴うプロデューサインスタンス生成コマンドにより指定されたプロデューサをインスタンス生成し、発見されたプロデューサをインスタンス生成し、そしてプロデューサグラフを構築することが、ランタイム1004のプロデューサグラフ(1つ又は複数)構造1060で示されている。従って、本発明の一実施形態では、プロデューサキーを伴うプロデューサインスタンス生成コマンドにより識別されたプロデューサキー、及びプロデューサグラフ発生を通して発見されたプロデューサキーは、現在プロデューサグラフ(1つ又は複数)を表す追加情報と共に、プロデューサグラフ(1つ又は複数)構造1060に記憶される。
上述したように、ブロック1095及び1098は、ブロック1040の一部分でもよく、従って、どのクラス、インスタンス及びプロデューサをロード/インスタンス生成のためにどんなプロデューサにより駆動するかの判断は、現在プロデューサグラフ(1つ又は複数)において行われる。本発明のこのような実施形態では、クラス、インスタンス、及びプロデューサのロード/インスタンス生成が最適化され、プロデューサ中心となる。
又、ランタイムクライアント1002は、プロデューサ出力オーバーライド/非オーバーライドコマンドを含むデータ準備コマンド1030も備えている。オーバーライド/非オーバーライドコマンドは、オーバーライド/非オーバーライドされるべきプロデューサのプロデューサキーと、オーバーライドされるときのオーバーライド値とを含む。ランタイム1004のオーバーライドプロデューサ出力モジュール1045は、プロデューサオーバーライド/非オーバーライドコマンドにより指定されたプロデューサをオーバーライド/非オーバーライドさせる。この因果関係は、間接的でも、直接的でもよい。
間接的な因果関係の場合に、オーバーライドプロデューサ出力モジュール1045は、プロデューサグラフ実行モジュール1070によって消費するためにオーバーライドログ1047をポピュレートする。直接的な因果関係の場合には、オーバーライドプロデューサ出力モジュール1045は、プロデューサグラフ(1つ又は複数)構造1060のプロデューサ出力キャッシング1097及びインスタンス1052にアクセスする。より詳細には、オーバーライドプロデューサ出力モジュール390を参照すれば、一実施形態において、プロデューサは、プロパティプロデューサ又はメソッドプロデューサとして分類することができ、従って、オーバーライドプロデューサ出力モジュール1045は、オーバーライドされたプロパティプロデューサのためのオーバーライドプロパティプロデューサ出力モジュールと、オーバーライドされたメソッドプロデューサのためのオーバーライドメソッドプロデューサ出力モジュール(図示せず)とを含み、プロパティメソッドをオーバーライドすると、オーバーライドされた値を、プロデューサグラフ(1つ又は複数)構造1060のプロデューサ出力キャッシング1097に記憶させると共に、インスタンス1052の適切なインスタンスに記憶させ、一方、メソッドプロデューサをオーバーライドすると、オーバーライドされた値をプロデューサ出力キャッシング1097に記憶させる。
本発明の一実施形態では、プロデューサは、それが一部分であるところのプロデューサグラフが最初に実行されるまでオーバーライドされない(従って、プロデューサは、問題とするプロデューサとして指定される結果、又は自動プロデューサグラフ発生モジュール1040により発見される結果として予めインスタンス生成される)。しかしながら、図10に示す実施形態では、プロデューサは、初期実行の前に、プロデューサオーバーライドコマンドでインスタンス生成されオーバーライドされることにより、オーバーライドすることができる。このようなオーバーライドされたプロデューサは、通常、最終的に、発見プロセスを通してプロデューサグラフの一部分となる(例えば、ダイナミック依存性が解明されるとき)。本発明のある実施形態では、このデータ準備は、他の形式のセットコマンドも含み得る。オーバーライドプロデューサ出力モジュール1045は、本発明の別の実施形態では存在しないことがあるので、破線のボックスとして示されている。
又、プロデューサグラフ(1つ又は複数)構造1060は、任意であるが、増分的実行をサポートする本発明の幾つかの実施形態に対して増分的実行マーキング1080も含む。図3Bの増分的実行マーキング382を参照して上述したように、増分的実行マーキング1080は、初期実行のものを越えた実行においてプロデューサグラフ(1つ又は複数)の増分的実行を助けるのに使用される。増分的実行マーキング382を使用する本発明の異なる実施形態は、それらを異なる仕方で使用する。例えば、コマンドログを有する本発明の1つのこのような実施形態では、どのプロデューサが追加され及び/又は変更されるか追跡するのにログが使用され、そして増分的実行マーキング382は、影響を受けるプロデューサ(変更又は追加されたプロデューサの先祖であり、従って、それらに依存する)をマークするのに使用される。別の例として、コマンドログをもたない本発明の1つのこのような実施形態では、増分的実行マーキング382は、追加又は変更されるプロデューサ、並びに変更又は追加されるプロデューサの先祖である(従って、それらに依存する)プロデューサをマークするのに使用される。別の例として、コマンドログをもたない本発明の1つのこのような実施形態では、プロデューサの変更及び追加が直ちに行われ、そして増分的実行マーキング382は、変更又は追加されるプロデューサの先祖である(従って、それらに依存する)プロデューサをマークするのに使用される。増分的実行をサポートしそして増分的実行マーキングを使用する本発明の実施形態を説明したが、本発明の他の実施形態は、増分的実行マーキングを使用しない増分的実行をサポートする(例えば、どのプロデューサが追加又は変更されたか追跡するのにコマンドログが使用され、そして実行スタートプロデューサのリストが実行スタートログに維持され、ここで、プロデューサグラフ実行モジュール1070は、実行スタートプロデューサからスタートし、そしてプロデューサグラフの先祖を最上位まで上るように働き、例えば、これに限定されないが、本発明のこの実施形態は、図15−25を参照して、以下に説明する。
又、ランタイムクライアント1002は、本発明のある実施形態による実行モード選択コマンド1036も含む。ユーザは、実行モード選択コマンド1036を使用して、ランタイム設定構造1048、プロデューサベースの構成判断構造1049、及び/又はプロデューサグラフ構造1060を変化させることにより、実行モード設定(1つ又は複数)を変化させることができる。一実施形態では、実行モード選択コマンド1036は、プロデューサベースの構成判断構造1049を変化させて、特定クラス、特定インスタンス、特定メソッドの実行モード設定、又はそれらの組合せを変更させる。例えば、第1実行モード選択コマンドは、特定クラスの全てのメソッドの実行モード設定を第1実行モードへ変化させ、第2実行モード選択コマンドは、特定クラスの特定インスタンスの実行モード設定を変化させ、第3実行モード選択コマンドは、特定メソッドの実行モード設定を変化させ、第4実行モード選択コマンドは、特定メソッド及び特定インスタンスの実行モード設定を変化させ、等々となる。或いは又、ユーザは、実行モード選択コマンド1036を使用して、プロデューサグラフ構造1060を変化させることにより、実行モード設定(1つ又は複数)をプロデューサごとに変化させることができる。プロデューサグラフ構造1060における各プロデューサがプロデューサ実行モード設定を有するので、実行モード選択コマンド1036は、特定のプロデューサを識別するプロデューサキーと、特定のプロデューサに対する希望の実行モード設定とを与え、ランタイム1004が特定のプロデューサに対する実行モード設定を希望の実行モード設定へ変化させることができる。
又、ランタイムクライアント1002は、グローバルな実行コマンド1035も含む。ランタイム1004のプロデューサグラフ実行モジュール1070は、プロデューサグラフ(1つ又は複数)を実行する。プロデューサ実行モジュール1070は、プロデューサベースの構成構造1049からのプロデューサの対応実行モードに基づいてプロデューサグラフ(1つ又は複数)における各プロデューサを実行することができる。ある実施形態では、プロデューサ実行モジュール1070は、プロデューサベースの構成構造1049からの所定のプロデューサの実行モードをオーバーライドすることができる。例えば、プロデューサベースの構成構造1049からの実行モードがランタイム1004によってサポートされない場合には、プロデューサ実行モジュール1070は、このような実行モードをオーバーライドすることができる。
ある実施形態において、ランタイム1004は、3つの実行モード、即ちマルチプロセッシング、マルチスレッディング、及びローカル実行をサポートする。従って、プロデューサ実行モジュール1070は、パラレル化モジュール1076、マルチプロセッシングモジュール1077、マルチスレッディングモジュール1078、及びローカル実行モジュール1079を備えている。各プロデューサに対して、自動プロデューサグラフ発生モジュール1040は、プロデューサベースの構成判断構造1049から対応実行モードを見出し、そしてその対応実行モードがランタイム設定構造1048におけるランタイム設定によりオーバーライドされない場合に、プロデューサグラフ構造1060においてプロデューサ実行モード設定を適宜にセットすることができる。プロデューサグラフ構造1060におけるプロデューサ実行モード設定に基づいて、パラレジ化モジュール1076は、マルチプロセッシングモジュール1077、マルチスレッディングモジュール1078、及びローカル実行モジュール1079の対応する1つへプロデューサを送信することができる。次いで、マルチプロセッシングモジュール1077、マルチスレッディングモジュール1078、及び/又はローカル実行モジュール1079においてプロデューサに対してタスクをインスタンス生成することができる。タスクは、計算作業の論理的高レベルの、個別の、独立区分である。タスクは、典型的に、プロセッサによりプログラムとして実行される。
ある実施形態において、実行モードがマルチプロセッシングである場合には、パラレル化モジュール1076は、マルチプロセッシングモジュール1077へプロデューサを送ることができる。マルチプロセッシングモジュール1077は、プロデューサ及びプロデューサへの入力に対応するタスクをシリアル化し、そしてそのシリアル化されたタスク及び入力をジョブに追加することができる。マルチプロセッシングの実行モードを有する全ての実行準備されたプロデューサに対応するタスクがジョブに追加されると、マルチプロセッシングモジュール1077は、そのジョブをグリッドディスパッチャー1081へ送り、プロセッサのグリッドへ転送できるようにする。次いで、グリッドにおけるプロセッサの幾つか又は全部がジョブにおけるタスクを遠隔から実行することができる。実行モードがマルチスレッディングである場合には、パラレル化モジュール1076は、マルチスレッディングモジュール1078へプロデューサを送ることができる。マルチスレッディングモジュール1078は、スレッドプールメカニズムを開始し、そして実行されるべき利用可能なスレッドに、プロデューサに対応するタスクを供給することができる。実行モードがローカル実行である場合には、パラレル化モジュール1076は、ローカルモジュール1079にプロデューサを送ることができる。次いで、ローカルモジュール1079は、現在ランタイムスレッド内のタスクを実行することができる。
ある実施形態において、パラレル化モジュール1076は、プロデューサに対して実行モードが指定されない場合には、デフォールトにより、マルチプロセッシングモジュール1077、マルチスレッディングモジュール1078、及びローカル実行モジュール1079の所定の1つへプロデューサを送ることができる。他方、プロデューサのクラス定義1010がプロデューサに対する実行モード設定1015を含む場合には、パラレル化モジュール1076は、実行モード設定1015がオーバーライドされない限り、実行モード設定1015に基づいてプロデューサを送ることができる。実行モード設定1015は、種々の仕方でオーバーライドすることができる。一実施形態では、実行モード選択コマンド1036は、プロデューサベースの構成判断構造1049における実行モード設定を、クラスベース、メソッドベース、インスタンスベース又はその組合せで変化させ、実行モード設定1015をオーバーライドする。一実施形態では、実行モード選択コマンド1036は、実行モード設定をプロデューサグラフ構造1060においてプロデューサごとのベースで変化させ、プロデューサベースの構成判断構造1049を使用して決定された実行モード設定をオーバーライドする。一実施形態では、実行モード選択コマンド1036は、ランタイム設定構造1048においてランタイムグローバルレベルで実行モード設定を変化させ、プロデューサグラフ構造1060において実行モード設定をオーバーライドする。
従って、プロデューサグラフ実行モジュール1070は、プロデューサ出力キャッシング1097を変更し(プロパティプロデューサ及びメソッドプロデューサの場合に)、増分的実行マーキング1080(もしあれば)を使用し、そしてインスタンス1052のデータを変更する(プロパティメソッドの場合に)。ある実施形態では、メトリック取得モジュール1082は、プロデューサの実行中にメトリックを取得することができる。取得したメトリックは、プロデューサグラフ(1つ又は複数)構造1060におけるメトリック1083に記憶することができる。メトリックは、プロデューサベースで取得することができ、そしてプロデューサは、クラス、メソッド及びインスタンスの独特の組合せを含むので、取得されるメトリックは、クラス・インスタンス・メソッドベースとなることに注意されたい。更に、取得されるメトリックは、タスクベース及び/又はジョブベースでもよい。
ある実施形態では、取得されるメトリックは、異なる使用のための、例えば、コンピューティング環境を監視するための、遠隔実行時間を監視するための、ローカル実行時間を監視するための、データストリームを監視するための、全実行時間を監視するための、異なる形式の実行をベンチマーキングするため、等々の異なる形式のメトリックを含む。例えば、コンピューティング環境を監視するために、マルチプロセッシングに使用され且つプロデューサの実行に専用とされるリモートグリッドに利用可能なプロセッサ又はエンジンの数、並びにローカル処理時間と遠隔処理時間との間に観察される経験的な比のようなメトリックを取得することができる。例えば、ローカルプロセッサ及び遠隔プロセッサが他のタスクで過負荷にならない場合、この経験的な比は、2つのプロセッサ間の周波数比に近いものとなる。遠隔実行時間を監視するためには、遠隔処理時間、遠隔デシリアル化時間、及び遠隔シリアル化時間のようなメトリックを取得することができる。ローカル実行時間を監視するためには、ローカル実行時間、ローカルデシリアル化時間、及びローカルシリアル時間のようなメトリックを取得することができる。データストリームを監視するためには、シリアル化入力オブジェクトのサイズ及びシリアル化出力オブジェクトのサイズのようなメトリックを取得することができる。遠隔プロセッサでデータを処理するときには、入力及び出力データがネットワークを経て交換される。遠隔処理の効率は、交換されるデータボリュームに直接リンクされる。データストリームのサイズを監視することで、データ構造が冗長な又は無用な情報と交換される過負荷状態を減少又は回避する上で助けとなるように、有用な情報を与えることができる。全実行時間を監視するためには、特定のプロデューサを実行するための全時間のようなメトリックを取得することができる。ある実施形態では、特定のプロデューサを実行するための全時間は、ローカルシリアル化時間、遠隔デシリアル化時間、遠隔処理時間、遠隔シリアル化時間、及びローカルデシリアル化時間の和である。この時間は、タスクごとのベースで測定することができ、そして単一のジョブに関する全てのタスクにわたって非常に一貫したものとなる(即ち、時間が非常に接近したものとなる)。異なる形式の実行をベンチマーキングするために、スピードアップ及び効率のような比較メトリックを、取得した他のメトリックから導出することができる。スピードアップは、パラレルのアルゴリズムが、それに対応するシーケンシャルなアルゴリズムよりどれほど高速であるかの尺度である。スピードアップは、特定のジョブに対して、そのジョブに関する全タスク(ローカルで実行される場合)のローカル処理時間の和を、マルチプロセッシングのようなパラレル実行解決策を使用するジョブ実行時間(ジョブ全時間)で除算したものとして定義される。理論的には、スピードアップがプロセッサの数に実質的に等しいとき、即ちシリアル化時間及びデシリアル化時間がゼロに近いか又は好ましいプロセッサ効率比によって補償されるときに、理想的なスピードアップに到達する。効率は、100*スピードアップ/プロセッサの数、に等しい。この場合も、ローカル及び遠隔プロセッサが同一である理論的に理想的な状況では、理想的な効率が100%に近い。
プロデューサグラフのプロデューサを実行するための種々の技術が、上述され、ここに適用することができる。例えば、コマンドログが具現化される実施形態では、コマンドログが消費され、次いで、プロデューサグラフ(1つ又は複数)が実行される。更に、未解明の依存性の可能性をサポートする本発明の実施形態では、プロデューサグラフ実行モジュール1070は、ダイナミック依存性モジュール1075を含み、これは、自動プロデューサグラフ発生モジュール1040をインボークすることができる。
又、図10は、プログラマー/ユーザが、プロデューサグラフ(1つ又は複数)構造のプロデューサグラフ(1つ又は複数)及びプロデューサ出力を見ることができるようにするメカニズム(例えば、GUI)を与える任意のプロデューサグラフビューアモジュール1062も示している。更に、図10は、構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840を表すグラフィックユーザインターフェイス(GUI)(ブロック1030及び1035のダイナミックインボケーションを含む)を与えるための任意の構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール1085も示している。
コマンドログを使用する本発明の実施形態では、異なるトリガーを使用して、異なるアクションをトリガーすることができる。例えば、プロデューサインスタンス生成コマンドは、明示的コマンド(ロギング開始及びロギング終了)、明示的グローバル実行コマンド(スタート時及び各明示的グローバル実行コマンドの後にロギングが自動的にスタートし、そしてそれに続く明示的グローバル実行コマンドに応答して各ログが処理される)、明示的データ準備コマンド、等に応答して、ログされ、バッチ処理される。同様に、データ準備コマンドは、明示的グローバル実行コマンド、第1ゲットコマンド、各ゲットコマンド、等に応答して、ログされ、バッチ処理される。
例示的追跡構造
図11A−Gは、本発明の一実施形態による図10のデータ構造の例示的コンテンツを示すブロック図である。図11A−Gは、これらのデータ構造をテーブルとして示すが、適当なデータ構造(例えば、ハッシュマップ、セット、リスト、等)を使用できることを理解されたい。
図11Aは、本発明の一実施形態による図10のクラス追跡構造1092の一例を示すブロック図である。図11Aにおいて、クラスキー列1110及びクラスリファレンス列1115は、各々、ロードされるクラスに対するクラスキー及びその対応リファレンスを記憶するように示されている。
図11Bは、本発明の一実施形態による図10のインスタンス追跡構造1065の一例を示すブロック図である。図11Bにおいて、インスタンスキー列1120及びインスタンスリファレンス列1125は、各々、インスタンスに対するインスタンスキー及びその対応リファレンスを記憶するように示されている。インスタンスキーが全てのクラスにわたって独特である必要のない本発明の実施形態では、インスタンス追跡構造は、インスタンスのクラスに対するクラスキー又はリファレンスも含む。
図11Cは、本発明の一実施形態による図10のプロデューサグラフ(1つ又は複数)構造1060の一例を示すブロック図である。図11Cにおいて、クラスリファレンス列1135、インスタンスリファレンス列1140、及びメソッドリファレンス列1145は、現在プロデューサグラフ(1つ又は複数)の現在プロデューサを作り上げるリファレンスを各々記憶するように示されている。これらのリファレンスは、種々の形態をとり得る。例えば、これらの列は、クラス1054(或いは1092)、インスタンス1052(或いは1065)、及びメソッド1056(或いは1058)に対するリファレンスを記憶する。本発明の一実施形態では、これらの列はリファレンスを記憶するが、本発明の別の実施形態では、これら列の1つ以上がキーを記憶してもよい。
更に、図11Cは、親プロデューサ(1つ又は複数)リンク(1つ又は複数)列1150(各リンクに対して親プロデューサリファレンス及び依存性決定プロデューサリファレンスを含む)と、子プロデューサ(1つ又は複数)リンク(1つ又は複数)列1160(各リンクに対して、子プロデューサリファレンス(1つ又は複数)、依存性決定プロデューサリファレンス、リンクモード、及びスティッキーリンクインジケータを含む)とを含む。各プロデューサは、0以上の子プロデューサリンクを列1160に有する。列1160の各子プロデューサリンクは、次のものを含む。1)プロデューサ依存性宣言によりプロデューサ依存性を表すためにプロデューサグラフ(1つ又は複数)構造の他の行に対するリファレンスである子プロデューサリファレンス(1つ又は複数);2)プロデューサグラフ(1つ又は複数)構造の別の行に対するリファレンスであり且つ子リンクを生成した依存性決定プロデューサを表す依存性決定プロデューサリファレンス;3)プロデューサ依存性が引数、フィールド又はシーケンス依存性の結果であるかどうか識別するプロデューサ依存性形式(図7A−Fに関する説明を参照)と、引数の場合には、プロデューサ依存性の引数IDとを伴うリンクモード;及び4)リンクモードが、上方に宣言された依存性の結果(上方に宣言された依存性をサポートする本発明の実施形態における)であるか、又はスティッキーサブスクリプションの結果(スティッキーサブスクリプションをサポートする本発明の実施形態における)であることを指示し、且つこのプロデューサ(即ち、スティッキーインジケータを含む列の行に記憶されたプロデューサ)のプロデューサ引数依存性宣言を通して変更されてはならないスティッキーインジケータ。各プロデューサは、0以上の親プロデューサリンクを列1150に有してもよい。列1150の各親プロデューサリンクは、次のものを含む。1)別のプロデューサの子プロデューサリファレンスに基づくリファレンスを記憶して戻す親プロデューサリファレンス(即ち、このプロデューサに依存する親プロデューサを表すためのプロデューサグラフ(1つ又は複数)構造の別の行に対するリファレンス);2)プロデューサグラフ(1つ又は複数)構造の別の行に対するリファレンスであり且つ親リンクを生成した依存性決定プロデューサを表す依存性決定プロデューサリファレンス。従って、リンクが生成されるときには、子プロデューサ行の親プロデューサリンク列、及び親プロデューサ行の子プロデューサリンク列がそのリンクを表すように変更される(そして依存性決定プロデューサリファレンスは、両方において同じである)。本発明の一実施形態では、あるプロデューサグラフ又は異なるプロデューサグラフにおける複数の経路が所与のプロデューサを含むので、所与のプロデューサに対して複数の親プロデューサリンクが存在し得る。
更に、図11Cは、現在プロデューサ出力、プロデューサがオーバーライドされたかどうかの指示、及びオーバーライドされた出力値を記憶するためのプロデューサ出力キャッシング及びオーバーライドプロデューサ出力変更列1170も含む。又、図11Cは、上述した増分的実行マーキングを記憶するための増分的実行マーキング列1180も含む。
ある実施形態では、図11Cは、プロデューサグラフ構造1060における各プロデューサの実行モード設定を記憶するためのプロデューサ実行モード設定列1173を含む。例えば、実行モード設定は、マルチプロセッシング、マルチスレッディング及びローカル実行の1つでよい。
更に、図11Cは、プロデューサグラフ構造1060における各プロデューサのメトリックを記憶するためのプロデューサメトリック列1175も含む。プロデューサメトリックは、メトリック取得モジュール1082を使用してプロデューサごとに取得される。メトリックを取得するためのプロセスの幾つかの実施形態を以下に詳細に述べる。
図11Dは、本発明の一実施形態による図10のメソッド追跡構造1058の一例を示すブロック図である。図11Dにおいて、メソッドキー列1190及びメソッドリファレンス列1192は、各々、ロードされるクラスのメソッドに対するメソッドキー及びその対応リファレンスを記憶するように示されている。更に、図11Dは、ArgumentDependencies列1194、FieldDependencies列1196、SequencingDependencies列1195、UpwardDependencies列1193、WeaklyConstrainedDependencies列1199、出力クラス列1197、及びデフォールト実行モードを含む任意の付加的なアノテーション列1198も示している。ArgumentDependencies列1194、SequencingDependencies列1195、UpwardDependencies列1193、WeaklyConstrainedDependencies列1199、及びFieldDependencies列1196は、メソッドのプロデューサ依存性宣言ステートメント(図7Aの705を参照)から構文解析されたプロデューサ依存性情報を記憶し、一方、出力クラス列1197は、メソッドの出力の出力クラス(メソッドのシグネチュアにより決定できる−例えば、図7Aの710を参照)に関する情報を記憶する。本発明の幾つかの実施形態で使用されるArgumentDependencies列1194、FieldDependencies列1196、SequencingDependencies列1195、UpwardDependencies列1193、及びWeaklyConstrainedDependencies列1199の例示的なコンテンツは、以下で述べる。
図11Eは、本発明の一実施形態によるシリアル化形態のローカルマップの一例を示すブロック図である。図11Eのシリアル化形態ローカルマップは、シリアル化形態識別子(ID)列1112、入力プロデューサキー列1113、基礎的なクラスキー及びインスタンスキー列1114、シリアル化形態1116、シリアル化形態サイズ1117、及びシリアル化時間1118を含む。ある実施形態では、シリアル化形態ID、入力プロデューサキー、基礎的なインスタンスキー、及びシリアル化形態は、ランタイム1004によりパラレル化を具現化するのに使用される。具現化の詳細は、以下で述べる。幾つかの実施形態では、ランタイム1004は、プロデューサベースでメトリックを取得するためのインスツルメンテーションを具現化する。従って、ランタイム1004は、シリアル化形態サイズ及びシリアル化時間を、シリアル化形態ローカルマップにおいて破線で示された列に記憶することができる。インスツルメンテーションの詳細は、以下に述べる。
図11Fは、本発明の一実施形態による図10のランタイム設定構造1048の一例を示すブロック図である。テーブルは、オリジナル実行モード列1121、及び最終的実行モード列1123を含む。実行モードがランタイムグローバルレベルでオーバーライドされない場合には、最終的実行モードは、オリジナル実行モードと同じである。他方、実行モードがランタイムグローバルレベルでオーバーライドされる場合には、最終的実行モードがオリジナル実行モードと異なる。例えば、ランタイム1004がマルチプロセッシングをサポートしない場合には、ローカル実行をマルチプロセッシングの最終的実行モードであると指定することにより、マルチプロセッシングを、ランタイムグローバルレベルでオーバーライドすることができる。
図11Gは、図10のプロデューサベースの構成判断構造1049の一例を示すブロック図である。テーブルは、クラスキー列1182、メソッドキー列1184、インスタンスキー列1186、実行モード設定列1188を含む。実行モード選択コマンド1036は、プロデューサベースの構成判断構造における実行モード設定を、クラス、メソッド、インスタンス、又はその組合せに基づいて変更することができる。従って、本発明の一実施形態によれば、クラスキー列1182、メソッドキー列1184及びインスタンスキー列1186の1つ以上が特定の行において空となり得る。
遠隔コンピューティング
上述したように、本発明の一実施形態は、マルチプロセッシングの実行モードをサポートする。マルチプロセッシングをサポートするために、ランタイムは、プロデューサのタスク並びに各プロデューサの入力及び/又は基礎的インスタンスをシリアル化し、そしてそのシリアル化された形態をグリッドへ送ってグリッド内のプロセッサで処理することにより、プロセッサのグリッドと対話することができる。
図12Aは、本発明の一実施形態によりマルチプロセッシングをサポートするための図10の付加的な細部を示すブロック図である。破線の分割線1200の左側は、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004である。破線の分割線1200の右側は、グリッド1290である。ランタイム1004の側で、図12Aは、図10から、プロデューサグラフ実行モジュール1070(パラレル化モジュール1076、マルチプロセッシングモジュール1077、マルチスレッディングモジュール1078、及びローカル実行モジュール1079を含む)と、グリッドディスパッチャー1081とを含む。グリッド1290の側で、図12Aは、遠隔コンピューティングモジュール1270を含む。
本発明の一実施形態によれば、プロデューサの実行モードがマルチプロセッシングである場合には、パラレル化モジュール1076は、プロデューサをマルチプロセッシングモジュール1077へ送る。マルチプロセッシングモジュール1077は、複数のタスクを含み得るジョブをインスタンス生成する。マルチプロセッシングモジュール1077は、プロデューサに対してタスクをインスタンス生成することができる。マルチプロセッシングモジュール1077は、更に、タスク、並びにプロデューサへの入力及び/又はプロデューサの基礎的インスタンスをシリアル化することができる。次いで、マルチプロセッシングモジュール1077は、タスクのシリアル化された形態をジョブに追加することができる。マルチプロセッシングモジュール1077は、ジョブをグリッドディスパッチャー1081へ送ることができる。次いで、グリッドディスパッチャー1081は、ジョブをグリッド1290の遠隔コンピューティングモジュール1270へ送ることができる。グリッド1290によるジョブの処理の詳細は、以下に述べる。
ジョブが処理された後に、ジョブ内のタスクのシリアル化出力及び/又はインスタンスがグリッドディスパッチャー1081へ返送される。グリッドディスパッチャー1081は、ジョブ内のタスクのシリアル化出力及び/又はインスタンスを、デシリアル化させるべくマルチプロセッシングモジュール1077へ転送することができる。
ダイナミックプロデューサ依存性
上述したように、本発明の一実施形態は、非ダイナミック及びダイナミックプロデューサ依存性をサポートする。異なる実施形態は、異なる形式のダイナミックプロデューサ依存性をサポートするが、本発明の一実施形態は、コンティンジェント及びサブスクリプション形式のダイナミックプロデューサ依存性をサポートする。従って、非コンティンジェント、非サブスクリプション依存性は、非ダイナミック(スタティック)依存性である。
図12Bは、本発明の一実施形態によりコンティンジェント及びサブスクリプション形式のダイナミックプロデューサ依存性をサポートするための図10の付加的な細部を示すブロック図である。図12Bは、図10から、破線の分割線1000、ビジネスロジックを含むクラス定義1010(これは、データ1012、メソッド1014、及びプロデューサ依存性宣言1016を含む)、新クラスモジュール1095、クラス1054(メソッド及びプロデューサ依存性宣言1056を含む)、新インスタンスモジュール1098、インスタンス1052、インスタンス追跡構造1065、自動プロデューサグラフ発生モジュール1040、プロデューサグラフ(1つ又は複数)構造1060、及びプロデューサグラフ実行モジュール1070(ダイナミック依存性モジュール1075を含む)を含む。
図12Bは、プロデューサ依存性宣言1016が、任意であるが、コンティンジェント依存性1210、サブスクリプション依存性1220、及び複数のプロデューサ1215を含むことを示している。ここで、複数のプロデューサ1215は、プロデューサの集合を返送するためのプロデューサ依存性の能力を指す。更に、図12Bは、コンティンジェント依存性1210及びサブスクリプション依存性1220を処理するために自動プロデューサグラフ発生モジュール1040にサブスクリプションモジュール1240及びコンティンジェンシーモジュール1230を含む。又、図12Bは、サブスクリプションモジュール1240がサブスクリプションログ1250にアクセスすることも示している。更に、ダイナミック依存性モジュール1075は、コンティンジェント依存性1210及びサブスクリプション依存性1220を処理するためにコンティンジェンシーモジュール1260及びサブスクリプションモジュール1265を備えている。サブスクリプションモジュール1265は、サブスクリプションログ1250にアクセスする。
コンティンジェント及びサブスクリプション依存性の以下の説明は、依存性決定プロデューサによりインスタンスが返送されてプロデューサグラフ指向のプログラミングサポートを伴うランタイムにより分析されるところのクラスDEP(依存性の省略形)を使用する本発明の実施形態の環境で行われる。クラスDEPは、次のフィールドを含む。1)サブスクリプション、非サブスクリプション下方宣言(サブスクリプションでない子プロデューサ)又は非サブスクリプション上方宣言(サブスクリプションでない親プロデューサ)にセットすることのできるTYPE;2)非サブスクリプション下方宣言依存性に使用され且つ子プロデューサの集合である(従って、0以上のプロデューサを記憶できる)PROD;3)サブスクリプション依存性に使用され且つサブスクリプション依存性の形式を指示するようにセットされるSUB TYPE(複数の形式のサブスクリプションをサポートする本発明の実施形態に使用されるが、ここに述べる本発明の実施形態は、スティッキー及びアブソーブの2つの形式をサポートし、別の実施形態は、より多くの、より少ない及び/又は異なるサブスクリプション形式をサポートしてもよい);4)サブスクリプション依存性に使用され且つサブスクリプション基準を指示するようにセットされるSUB CRIT;5)スティッキーサブスクリプション依存性及び非サブスクリプション上方宣言依存性に使用され且つ親プロデューサのどんなリンクモードでなければならないか指示するようにセットされるPAR LINK MODE;6)スティッキーサブスクリプション依存性及び非サブスクリプション上方宣言依存性に使用され且つ親プロデューサのどんなクラス(例えば、クラスキー)でなければならないか指示するようセットされるPAR CLASS;7)スティッキーサブスクリプション依存性及び非サブスクリプション上方宣言依存性に使用され且つ親プロデューサのどんなメソッド(例えば、メソッドキー)でなければならないか指示するようにセットされるPAR METHOD;及び8)スティッキーサブスクリプション依存性及び非サブスクリプション上方宣言依存性に使用され且つ親プロデューサのどんなインスタンス(例えば、インスタンスキー)でなければならないか指示するようにセットされるPAR INSTANCE(PARINSTANCEをブランクのままにすると、子プロデューサのインスタンスキーが親プロデューサに対して使用される)。別の実施形態は、スティッキーサブスクリプション依存性及び/又は非サブスクリプション上方宣言依存性の場合に、親プロデューサの集合を使用する(集合の各アイテムは、PAR_CLASS、PAR_INSTANCE、PAR_METHOD、PAR_LINK MODEを保持する)。もちろん、本発明の他の実施形態は、異なる構造を使用して、依存性を返送することができる。
コンティンジェント依存性
本発明の一実施形態において、非コンティンジェント及びコンティンジェントの両プロデューサ依存性がサポートされる。非コンティンジェントのプロデューサ依存性は、他のプロデューサの出力とは独立したものであり、一方、コンティンジェントのプロデューサ依存性は、他のプロデューサの出力に依存したものである。本発明の一実施形態は、非コンティンジェント及びコンティンジェントの両プロデューサ依存性をサポートするが、別の実施形態は、非コンティンジェント又はコンティンジェントしかサポートしない(どちらかのコンティンジェントのプロデューサ依存性がデフォールト値によって最初に駆動されてもよい)。
上述したように、プロデューサは、指定の粒度の付加的なレベルごとに1つある、複数の識別子のセットとして見ることができる。本発明の実施形態では、コンティンジェントのプロデューサ依存性は、識別子のセットの中のいずれか1つ又は全部を現在データ値に基づいて条件付きで決定できるという意味で、コンティンジェントである。例えば、第1のコンティンジェントのプロデューサ依存性は、インスタンス識別子しか条件付きで決定できず(クラス及びメソッド識別子は固定であり)、一方、第2のコンティンジェントのプロデューサ依存性は、クラス、インスタンス及びメソッドの識別子を条件付きで決定することができる。本発明の一実施形態では、コンティンジェントのプロデューサ依存性の複数の識別子が全て条件付きであるが、本発明の別の実施形態は、異なる仕方で具現化されてもよい(例えば、複数の識別子のうちのサブセットのみを条件付きとすることができる)。
図13A−Jは、本発明の実施形態による擬似コード及び例示的プロデューサを示すブロック図である。更に、図13A−Jに示す実施形態は、コンティンジェント及び非コンティンジェントの両依存性に対して同じ依存性決定メカニズムを使用するものである。従って、説明上、図13A−Jにおける幾つかの例は、非コンティンジェントプロデューサ依存性の例であり、一方、他のものは、コンティンジェントプロデューサ依存性の例である。更に、非コンティンジェントプロデューサ依存性とは、依存性が、独立プロデューサである依存性決定プロデューサに対するものであり(例えば、本発明の一実施形態では、プロデューサ依存性宣言が空であるために依存性形式が識別可能であり)、一方、コンティンジェントのプロデューサ依存性とは、依存性が、従属プロデューサである依存性決定プロデューサに対するものである(例えば、本発明の一実施形態では、プロデューサ依存性宣言が空でないので依存性形式が識別可能である)。
更に、丸内の番号及び文字は、図13A−Jでは、本発明の一実施形態に基づいてオペレーションが遂行される順序を示す。又、表記X::Y::Zは、図13A−Jでは、クラスキー(X)、インスタンスキー(Y)及びメソッドキー(Z)で形成されるプロデューサキーを表すのに使用される。更に、破線の丸及び矢印付きの線は、本発明のある実施形態では遂行されないオペレーションを表す。特に、所与の依存性に対する独立した依存性決定プロデューサの実行が、常に、同じ依存性(例えば、独立した依存性決定プロデューサ)を返送する場合には、本発明のある実施形態ではそのような依存性決定プロデューサが実行されるが、プロデューサグラフ(1つ又は複数)においてはインスタンス生成もリンクもなされない。
明示的依存性決定プロデューサ
図13Aは、本発明の一実施形態による非ショートカット宣言、非ダイナミック(非コンティンジェント、非サブスクリプション)依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図13Bは、本発明の一実施形態による例示的非ショートカット宣言、非ダイナミック(非コンティンジェント、非サブスクリプション)プロデューサ依存性を示すプロデューサのブロック図である。図13Aは、次のものを示す。1)メソッドアルファ1305に対するプロデューサ依存性宣言ステートメント1300、ここで、プロデューサ依存性宣言ステートメント1300は、プロデューサCW::IY::BETAに対するプロデューサ依存性を含む;及び2)メソッドベータ1315に対するプロデューサ依存性宣言ステートメント1310、ここで、プロデューサ依存性宣言ステートメント1310は空であり、且つメソッドベータ1315は、クラスDEPのインスタンスを引数として返送する。メソッドベータ1315は、プロデューサ依存性宣言コード1320を含み、これは、DEP.TYPEを非サブスクリプション下方宣言にセットし、DEP.PRODをプロデューサ13にセットし、そしてDEPを返送する。
図13Aにおいて、丸1は、プロデューサ依存性宣言1300がアクセスされることを指示する(例えば、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサとして指定する結果として、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサの子孫として自動的に発見する結果として、等々)。図13Bにおける丸2は、メソッドアルファ1305に基づきプロデューサC0::I0::ALPHAがインスタンス生成されることを示している。図13Aにおける丸3は、プロデューサCW::IY::BETAに対するプロデューサ依存性が処理されて、プロデューサ依存性を決定することを指示し、その結果、丸4は、プロデューサ依存性宣言1310がアクセスされることを指示する。図13Bにおける破線の丸5は、プロデューサCW::IY::BETAが依存性決定プロデューサ1380としてインスタンス生成されることを示している。図13Bにおける破線の丸6は、プロデューサC0::I0::ALPHAがプロデューサグラフにおいてリンクされることを指示し、プロデューサCW::IY::BETAが子プロデューサであることを指示する。図13Bにおける丸7は、プロデューサCW::IY::BETAが実行されることを指示し、そしてプロデューサ13を識別するためにDEPを返送する。丸8は、プロデューサ13がインスタンス生成されることを指示し、一方、丸9は、プロデューサ13がプロデューサグラフにおいて子プロデューサとしてプロデューサC0::I0::ALPHAへリンクされることを指示する。図13Bにおいて、プロデューサC0::I0::ALPHA及びプロデューサ13は、標準的プロデューサ1385である(それらは、依存性決定プロデューサではない)。
図13Cは、本発明の一実施形態による非ショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図13Dは、本発明の一実施形態による例示的非ショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性を示すプロデューサのブロック図である。更に、図13Dは、ず5Aのプロデューサ5、7A及び7Bと、プロデューサ7Aに対するプロデューサ5のダイナミック依存性の解明とを指す。
図13Cは、次のものを示している。1)メソッドアルファ1305に対するプロデューサ依存性宣言ステートメント1300、ここで、プロデューサ依存性宣言ステートメント1300は、プロデューサCW::IY::BETAに対するプロデューサ依存性を含み;2)メソッドベータ1315に対するプロデューサ依存性宣言ステートメント1325、ここで、プロデューサ依存性宣言ステートメント1325は、プロデューサCU::IV::DELTAに対するプロデューサ依存性を含み、そしてメソッドベータ1315は、クラスDEPのインスタンスを引数として返送し;3)メソッドデルタ1334に対するプロデューサ依存性宣言ステートメント1332、ここで、プロデューサ依存性宣言ステートメント1332は空であり、そしてメソッドデルタ1334は、クラスDEPのインスタンスを引数として返送し;及び4)メソッドガンマ1340に対するプロデューサ依存性宣言ステートメント1338、ここで、プロデューサ依存性宣言ステートメント1338は、空であり、そしてメソッドガンマ1340は、変数Xを返送する(ここで、Xは、外部ソースからのもの、デフォールト値(明示的、又はクラスにおける定数)。メソッドベータ1315は、プロデューサ依存性宣言コード1330を含み、これは、DEP.TYPEを非サブスクリプション下方宣言にセットし、DEP.PRODを、プロデューサCX::IZ::GAMMAの出力に基づいてプロデューサ7A又は7Bにセットし、そしてDEPを返送する。メソッドデルタ1332は、プロデューサ依存性宣言コード1336を含み、これは、DEP.TYPEを非サブスクリプション下方宣言にセットし、DEP.PRODをプロデューサCX::IZ::GAMMAにセットし、そしてDEP.PRODを返送する。
図13Cにおいて、丸1は、プロデューサ依存性宣言1300がアクセスされることを指示する(例えば、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサとして指定する結果として、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサの子孫として自動的に発見する結果として、等々)。図13Dの丸2は、メソッドアルファ1305に基づきプロデューサ5がインスタンス生成されることを示している。図13Cの丸3は、プロデューサCW::IY::BETAに対するプロデューサ依存性が処理されてプロデューサ依存性を決定することを示し、その結果、丸4は、プロデューサ依存性宣言1325がアクセスされることを示している。図13Bの丸5は、プロデューサCW::IY::BETAが依存性決定プロデューサ1380としてインスタンス生成されることを示している。図13Dの丸6は、プロデューサ5がプロデューサグラフにおいてリンクされることを指示し、プロデューサCW::IY::BETAが子プロデューサであることを指示する。
図13Cの丸7は、プロデューサCU::IV::DELTAに対するプロデューサ依存性が処理されてプロデューサ依存性を決定することを指示し、その結果、丸8は、プロデューサ依存性宣言1332がアクセスされることを指示する。図13Dの破線の丸9は、プロデューサCU::IV::DELTAが依存性決定プロデューサ1380としてインスタンス生成されることを示す。図13Dの破線の丸10は、プロデューサCW::IY::BETAがプロデューサグラフにおいてリンクされることを指示し、プロデューサCU::IV::DELTAが子プロデューサであることを指示する。図13Dの丸11は、プロデューサCU::IV::DELTAが実行され、そしてCX::IZ::GAMMAを識別するためにDEPを返送することを指示する。丸12は、プロデューサCX::IZ::GAMMAがインスタンス生成されることを指示し、一方、丸13は、プロデューサCX::IZ::GAMMAがプロデューサグラフにおいてプロデューサCW::IY::BETAに対して子プロデューサとしてリンクされることを指示する。
図13Dにおいて、丸Aは、プロデューサCX::IZ::GAMMAが実行され、XをプロデューサCW::IY::BETAへ返送することを指示し、一方、丸Bは、プロデューサCW::IY::BETAがプロデューサ7Aを識別するためにDEPを返送することを指示し、丸Cは、未解明の残部(メソッドベータ)1390が今や解明されそしてプロデューサ7Aがインスタンス生成されることを指示し、一方、丸Dは、プロデューサ5をプロデューサ7Aにリンクすることを指示する。図13Dにおいて、プロデューサCX::IZ::GAMMA、5及び7Aは、標準的プロデューサ1385である。
オンザフライの依存性決定プロデューサ
図13Eは、本発明の一実施形態による非ショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性、及びショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性の両方を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図13Fは、本発明の一実施形態による非ショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性、及びショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性を示すプロデューサのブロック図である。図13Dと同様に、図13Fは、図5Aのプロデューサ5、7A及び7Bと、プロデューサ7Aに対するプロデューサ5のダイナミック依存性の解明とを指す。
図13E−Fは、次のことを除いて、図13C−Dと同じである。1)プロデューサ依存性宣言ステートメント1342がプロデューサ依存性宣言ステートメント1325に置き換わり;2)メソッドフライ(fly)1344がメソッドデルタ1334に置き換わり;及び3)プロデューサCW::IY::FLYがプロデューサCU::IV::DELTAに置き換わる。プロデューサ依存性宣言ステートメント1342は、CX::IZ::GAMMAに対するショートカット宣言プロデューサ依存性を含む。従って、図13Eの丸4は、今度は、プロデューサ依存性宣言1342がアクセスされることを指示する。図13Eの丸7は、今度は、プロデューサCX::IZ::GAMMAに対するショートカット宣言プロデューサ依存性が処理されてプロデューサ依存性を決定し、その結果、ランタイムがメソッドフライ1344に基づいてオンザフライで依存性決定プロデューサCW::IY::FLYをインボークすることを指示する。丸8は、今度は、プロデューサ依存性宣言1332がアクセスされることを指示する。図13Fの破線の丸9は、今度は、プロデューサCW::IY::FLYがインスタンス生成されることを示す。図13Fの破線の丸10は、プロデューサCW::IY::BETAがプロデューサグラフにおいてリンクされることを指示し、プロデューサCW::IY::FLYが子プロデューサであることを指示する。図13Fの丸11は、プロデューサCW::IY::FLYが実行されそしてCX::IZ::GAMMAを識別するためにDEPを返送することを指示する。図13E−Fの残り部分は、図13C−Dと同じである。
依存性決定プロデューサCW::IY::FLYのランタイムによるオンザフライ発生は、アプリケーションプログラマーが、明示的プロデューサ依存性宣言コードを書き込みそしてそれに基づいて依存性決定プロデューサをインスタンス生成しなければならないことから軽減する。更に、アプリケーションプログラマーが、依存性決定プロデューサCU::IV::DELTAを指定するのではなく、メソッドベータ1315に対するプロデューサ依存性宣言ステートメントにおいてプロデューサCX::IZ::GAMMAに対する依存性を直接指定することを許す。
ショートカット技術は、種々の状況において使用することができ、更に、種々のフォーマットを有してもよい。例えば、図13E−Fにおいて、ショートカット宣言依存性は、非コンティンジェント依存性に対するものであり(子プロデューサを直接識別し)、そして依存性決定プロデューサのベースとなるメソッドに対するプロデューサ依存性宣言ステートメント内にあるが、他の状況及びフォーマットは、次のように示される。1)図13G−Hは、2つのショートカットの使用を示し、その一方は、コンティンジェントなもので、標準的なプロデューサのベースとなるメソッドに対するプロデューサ依存性宣言ステートメントの一部分であり、そしてその他方は、非コンティンジェントなもので、依存性決定プロデューサのベースとなるメソッドに対するプロデューサ依存性宣言ステートメントの一部分であり;そして2)図13I−Jは、非コンティンジェントなショートカットであって、親の標準的プロデューサのベースとなるメソッドに対するプロデューサ依存性宣言ステートメント内にあるショートカットの使用を示す。
図13Gは、本発明の一実施形態によるショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性、及びショートカット宣言、非コンティンジェント、非サブスクリプションのプロデューサ依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図13Hは、本発明の一実施形態による例示的ショートカット宣言、コンティンジェント、非サブスクリプションのプロデューサ依存性、及びショートカット宣言、非コンティンジェント、非サブスクリプションのプロデューサ依存性を示すプロデューサのブロック図である。図13Gは、次のものを示す。1)メソッドアルファ1305に対するプロデューサ依存性宣言ステートメント1345、ここで、プロデューサ依存性宣言ステートメント1345は、プロデューサ<P>GETC1::I1::M1に対するショートカット宣言、コンティンジェントのプロデューサ依存性を含み;2)メソッドフライ1 1355に対するプロデューサ依存性宣言ステートメント1350、ここで、プロデューサ依存性宣言ステートメント1350は、プロデューサC0::I0::GETC1に対するショートカット宣言、非コンティンジェントのプロデューサ依存性を含み、且つメソッドフライ1 1355は、DEPのインスタンスを引数として返送し;3)メソッドフライ2 1362に対するプロデューサ依存性宣言ステートメント1322、ここで、メソッドフライ2 1362は、DEPのインスタンスを引数として返送し;及び4)メソッドgetc1 1370に対するプロデューサ依存性宣言ステートメント1365、ここで、メソッドgetc1 1370は、CX又はCYの値と共にC1を返送する。
メソッドFLY1 1355及びそのプロデューサ依存性宣言ステートメント1350は、ショートカット宣言依存性<P>GETC1::I1::M1(これは、クラスキーに対してショートカットが使用されることを指示する)に応答して、ランタイムにより与えられる。メソッドフライ1 1355は、プロデューサ依存性宣言コード1360を含み、これは、DEP.TYPEを非サブスクリプション下方宣言にセットし、DEP.PRODを、プロデューサC0::I0::GETC1により出力されるC1の値に基づいてプロデューサCX::I1::M1又はCY::I1::M1にセットし、そしてDEPを返送する。図13Hの例において、<P>は、コンティンジェントであるプロデューサのクラスキーであることを示すのに使用されるが、本発明の別の実施形態では、他のシンタックスを使用することもできる。更に、図13Hの例では、<P>は、コンティンジェントであるプロデューサのクラスキーであることを示すのに使用されるが、本発明の一実施形態は、このようにコンティンジェントとして指示されるプロデューサキーを作り上げるより多くの及び/又は異なる識別子をもつこともサポートする。
図13Gにおいて、丸1は、プロデューサ依存性宣言1345がアクセスされることを指示する(例えば、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサとして指定する結果として、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサの子孫として自動的に発見する結果として、等々)。図13Hにおける丸2は、メソッドアルファ1305に基づきプロデューサC0::I0::ALPHAがインスタンス生成されることを示している。図13Gにおける丸3は、ショートカット宣言プロデューサ依存性が処理されて、プロデューサ依存性を決定することを指示し、その結果、丸4は、プロデューサ依存性宣言1350がアクセスされることを指示する。
図13Hの丸5は、プロデューサC0::I0::FLY1が依存性決定プロデューサ1380としてインスタンス生成されることを示している。図13Hの丸6は、プロデューサC0::I0::ALPHAがプロデューサグラフにおいてリンクされることを指示し、プロデューサC0::I0::FLY1が子プロデューサであることを指示する。図13Gの丸7は、プロデューサC0::I0::GETC1に対するショートカット宣言プロデューサ依存性が処理されてプロデューサ依存性を決定し、そしてランタイムがメソッドフライ2 1362を与えることを指示し、その結果、丸8は、プロデューサ依存性宣言1332がアクセスされることを指示する。図13Hの破線の丸9は、プロデューサC0::I0::FLY2がインスタンス生成されることを示す。図13Hの破線の丸10は、プロデューサC0::I0::FLY1がプロデューサグラフにおいてリンクされることを指示し、プロデューサC0::I0::FLY2が子プロデューサであることを指示する。
図13Hの丸11は、プロデューサC0::I0::FLY2が実行され、そしてプロデューサC0::I0::GETC1を識別するためにDEPを返送することを指示する。丸12は、プロデューサC0::I0::GETC1がインスタンス生成されることを指示し、一方、丸13は、プロデューサC0::I0::GETC1がプロデューサグラフにおいて子プロデューサとしてプロデューサC0::I0::FLY1にリンクされることを指示する。
図13Hにおいて、丸Aは、プロデューサC0::I0::GETC1が実行され、そしてC1=CXをプロデューサC0::I0::FLY1へ返送することを指示し、一方、丸Bは、プロデューサC0::I0::FLY1が実行され、そしてプロデューサCX::I1::M1を識別するためにDEPを返送することを指示し、又、丸Cは、未解明の残部(メソッドフライ1)1390が今や解明されたことを指示し、そして丸Dは、プロデューサC0::I0::ALPHAをプロデューサCX::I1::M1にリンクすることを指示する。図13Hにおいて、プロデューサC0::I0::GETC1、C0::I0::ALPHA、及びCX::I1::M1は、標準的プロデューサ1385である。
依存性決定プロデューサC0::I0::FLY1及びC0::I0::FLY2のランタイムによるオンザフライ発生は、アプリケーションプログラマーが、明示的プロデューサ依存性宣言コードを書き込みそしてそれに基づいて依存性決定プロデューサをインスタンス生成しなければならないことから軽減する。更に、アプリケーションプログラマーが、依存性決定プロデューサCW::IY::BETAを指定するのではなく、メソッドアルファ1305に対するプロデューサ依存性宣言ステートメントにおいてメソッドgetC1を通してプロデューサ**::I1::M1に対するコンティンジェント依存性を直接指定することを許す。
図13Iは、本発明の一実施形態によるショートカット宣言、非ダイナミック(非コンティンジェント、非サブスクリプション)プロデューサ依存性を使用するメソッドに対するプロデューサ依存性宣言の擬似コードを示し、一方、図13Jは、本発明の一実施形態による例示的ショートカット宣言、非ダイナミックプロデューサ依存性を示すプロデューサのブロック図である。図13Iは、次のものを示す。1)メソッドアルファ1305に対するプロデューサ依存性宣言ステートメント1372、ここで、プロデューサ依存性宣言ステートメント1372は、プロデューサ10に対するショートカット宣言プロデューサ依存性を含み;及び2)メソッドフライ1376に対するプロデューサ依存性宣言ステートメント1374、ここで、プロデューサ依存性宣言ステートメント1374は、空であり、そしてメソッドフライ1376は、DEPのインスタンスを引数として返送する。メソッドフライ1776及びそのプロデューサ依存性宣言ステートメント1374は、ショートカット宣言依存性に応答してランタイムにより与えられる。メソッドフライ1376は、プロデューサ依存性宣言コード1378を含み、これは、DEP.TYPEを非サブスクリプション下方宣言にセットし、DEP.PRODをプロデューサ10にセットし、そしてDEPを返送する。
図13Iにおいて、丸1は、プロデューサ依存性宣言1372がアクセスされることを指示する(例えば、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサとして指定する結果として、メソッドアルファ1305に基づくプロデューサを、問題とするプロデューサの子孫として自動的に発見する結果として、等々)。図13Jの丸2は、メソッドアルファ1305に基づきプロデューサC0::I0::ALPHAがインスタンス生成されることを示している。図13Iの丸3は、ショートカット宣言プロデューサ依存性が処理されてプロデューサ依存性を決定し、そしてランタイムがメソッドフライ1376を与えることを指示し、その結果、丸4は、プロデューサ依存性宣言1374がアクセスされることを指示する。図13Jの破線の丸5は、プロデューサC0::I0::FLYが依存性決定プロデューサ1380としてインスタンス生成されることを示す。図13Jの破線の丸6は、プロデューサC0::I0::ALPHAがプロデューサグラフにおいてリンクされることを指示し、プロデューサC0::I0::FLY1が子プロデューサであることを指示する。
図13Jの丸7は、プロデューサC0::I0::FLY1が実行され、そしてプロデューサ10を識別するためにDEPを返送することを指示する。丸8は、プロデューサ10がインスタンス生成されることを指示し、一方、丸9は、プロデューサC0::I0::ALPHAがプロデューサグラフにおいてリンクされることを指示し、プロデューサ10が子プロデューサであることを指示する。図13Jにおいて、プロデューサC0::I0::ALPHA及びプロデューサ10は、標準的プロデューサ1385である。
ランタイムプログラマーは、本発明の一実施形態において、サポートされる全てのシンタックス及び組合せ(例えば、メソッドフライ1334、メソッドフライ1 1355、メソッドフライ2 1362、メソッドフライ1376)を解釈するために単一フライメソッドを書き込み、そしてそれをランタイムに含ませることを理解されたい。これは、アプリケーションプログラマーが、フライメソッドが使用される依存性決定プロデューサに対してコードの書き込みを回避できるだけでなく、ランタイムプログラマーは、一般的なフライメソッド(サポートされる全ての状況に対する単一フライ)を一度書き込むだけでよい。更に、ショートカット宣言依存性は、依存性決定プロデューサを使用するランタイムを許すと同時に、アプリケーションプログラマーがプロデューサ依存性宣言において標準的プロデューサを指示するのを許すことも理解されたい(例えば、図13G−J)。
メソッド追跡構造
図11Dのメソッド追跡構造に戻って、ArgumentDependencies列1194、FieldDependencies列1196、SequencingDependencies列1195、UpwardDependencies列1193、及びWeaklyConstrainedDependencies列1199の例示的コンテンツについて以下に説明する。より詳細には、ArgumentDependencies列1194は、各ArgumentDependenciesに1つづつあるアイテムの集合を記憶する。本発明の一実施形態では、各アイテムは、次のものを含む。1)引数ID;2)明示的クラス、同じクラス、及びコンティンジェントクラスの1つであるクラスキーネイチャー識別子;3)クラスキーネイチャー識別子が明示的クラスを指示するときにポピュレートされる明示的クラスキー識別子;4)クラスキーネイチャー識別子がコンティンジェントクラスを指示するときにポピュレートされるコンティンジェントクラス決定メソッドキー識別子;5)明示的インスタンス、同じインスタンス、及びコンティンジェントインスタンスの1つであるインスタンスキーネイチャー識別子;6)インスタンスキーネイチャー識別子が明示的インスタンスを指示するときにポピュレートされる明示的インスタンスキー識別子;7)インスタンスキーネイチャー識別子がコンティンジェントインスタンスを指示するときにポピュレートされるコンティンジェントインスタンス決定メソッドキー識別子;8)明示的メソッド、同じメソッド、及びコンティンジェントメソッドの1つであるメソッドキーネイチャー識別子;9)メソッドキーネイチャー識別子が明示的メソッドを指示するときにポピュレートされる明示的メソッドキー識別子;10)メソッドキーネイチャー識別子がコンティンジェントメソッドを指示するときにポピュレートされるコンティンジェントメソッド決定メソッドキー識別子;及び11)プロデューサ依存性宣言ステートメントの引数に対するプロデューサ依存性宣言がショートカットの指示を含むかどうか指示するショートカット識別子(即ち、プロデューサ依存性宣言ステートメントは、依存性決定プロデューサではなく、標準的な子プロデューサを直接識別する)。
種々のキーネイチャー識別子の「・・・明示的」指示は、プロデューサ依存性宣言ステートメントにおいてプロデューサ依存性に対して明示的キーが設けられる場合に使用される。例えば、図13Aのプロデューサ依存性宣言ステートメント1300のプロデューサ依存性「CW::IY::BETA」は、明示的クラス、インスタンス及びメソッドキーを与える。
本発明の幾つかの実刑形態では、プロデューサ依存性宣言ステートメントに対して速記(shorthand)技術が次のようにサポートされる。1)所与のプロデューサ依存性に対してクラスが設けられない場合には、親プロデューサと同じクラスが使用され;及び2)所与のプロデューサ依存性に対してクラス及びインスタンスが設けられない場合には、親プロデューサと同じクラス及びインスタンスが使用される。本発明の他の実施形態では、クラス、インスタンス及びメソッドの組合せを親と同じにする(全部が同じであることを除いて)のを許すためにシンタックスが使用される(例えば、クラス、インスタンス及びメソッドの各々を指定するのにセパレータが使用され、このようなセパレータがないと、親と同じであることを指示し、特定例によれば、シンタックスは、“#C:”、“#I”及び“#M:”であり、プロデューサ依存性宣言ステートメントにおけるプロデューサ依存性は、#C:”クラスキー”::#I:”インスタンスキー”::#M:”メソッドキー”となる)(引用符は、値又は変数のプレースホルダーを示す)。この速記技術がプロデューサ依存性宣言ステートメントに使用される場合には、種々のキーネイチャー識別子の「・・・同じ」指示が使用される。
上述したように、本発明のある実施形態では、コンティンジェントプロデューサ依存性の指示は、プロデューサ依存性宣言ステートメントそれ自体に使用されるシンタックス(例えば、<P>)を通してサポートされ(図13Gの1345を参照)、そしてこのようなシンタックスは、プロデューサ依存性のクラス、インスタンス及びメソッドの1つ以上に使用することができる。種々のキーネイチャー識別子の「・・・コンティンジェント」指示は、このようなコンティンジェントプロデューサ依存性がいつ生じるか識別するのに使用され、一方、「コンティンジェント・・・決定メソッドキー識別子」は、子プロデューサのメソッドキーを指示する(クラス及びインスタンスは、親プロデューサのものと同じである)。例えば、図13Gのプロデューサ依存性宣言1345に対するプロデューサ依存性“<P>GETC1::I1::M1”は、コンティンジェントクラス(コンティンジェントクラス決定メソッドキーがGETC1である場合)、明示的インスタンスキー、及び明示的メソッドキーを与える。
SequencingDependencies列1195、UpwardDependencies列1193、及びWeaklyConstrainedDependencies列1195の各々は、SequencingDependencies、UpwardDependencies及びWeaklyConstrainedDependenciesの各々に1つづつの、アイテムの集合を記憶する。本発明の一実施形態では、このような各アイテムは、引数IDを含まないことを除いて、ArgumentDependenciesに対する集合のアイテムと同じ構造を有する。更に、図13A−Jは、依存性決定プロデューサから生じる非サブスクリプション下方宣言依存性を示しているが、上方宣言依存性又は弱い制約の依存性の場合には、依存性決定プロデューサは、図7F−Gを参照して述べた他の依存性を返送することができる。
FieldDependencies列1196は、各FieldDependencyに1つづつあるアイテムの集合を記憶する。本発明の一実施形態では、各アイテムは、プロパティメソッドキーを含むが、本発明の別の実施形態では、SequencingDependenciesからの集合のアイテムと同じ構造を有してもよい。
サブスクリプション依存性
本発明の一実施形態において、非サブスクリプション及びサブスクリプションの両プロデューサ依存性がサポートされる。所与のメソッドに対してサブスクリプションプロデューサ依存性が宣言され、且つその所与のメソッドから所与のプロデューサがインスタンス生成されるときには、ランタイムは、サブスクリプションの基準を満足する0以上のプロデューサのセットを(他のプロデューサの存在に基づいて)ランタイム中に解明することができる。本発明の一実施形態は、非サブスクリプション及びサブスクリプションの両プロデューサ依存性をサポートするが、別の実施形態は、非サブスクリプションしかサポートしない。更に、本発明の一実施形態では、2つの形式のサブスクリプション依存性(アブソービング及びスティッキー)がサポートされるが、本発明の別の実施形態は、それより多い、それより少ない、及び/又は異なる形式のサブスクリプションプロデューサ依存性をサポートする。
図14A−Cは、本発明の一実施形態によるアブソービング及びスティッキーサブスクリプションを示すブロック図である。図14Aは、本発明の一実施形態による図12Bのサブスクリプションログ1250の一例を示すブロック図である。図14Aは、このログ構造をテーブルとして示しているが、いかなる適当なデータ構造(例えば、ハッシュマップ)が使用されてもよいことを理解されたい。図14Bは、本発明の一実施形態による非コンティンジェント、アブソーブサブスクリプションプロデューサ依存性を示す例示的プロデューサのブロック図である。図14Cは、本発明の一実施形態による非コンティンジェント、スティッキーサブスクリプションプロデューサ依存性を示す例示的プロデューサのブロック図である。図14Aのテーブルの2つの行は、図14B−Cの例で使用されるコンテンツがポピュレートされて示されている。丸付き番号は、図14B−Cでは、本発明の一実施形態によりオペレーションが遂行される順序を示すのに使用される。
図14Aにおいて、サブスクライバープロデューサキー列1400、サブスクリプション形式列1405、及びトリガープロデューサ用サブスクリプション基準列1410が、各々、列の名前に対応するコンテンツを記憶するように示されている。更に、図14Aは、サブスクリプション依存性の親プロデューサに対するリンクモードを記憶するための親リンクモード列1425も示しており、この情報は、図14B−Cを参照して詳細に説明する。
又、図14Aは、アブソービングサブスクリプションに使用されるマッチングプロデューサ列1415及び完了列1420も示している。マッチングプロデューサ列1415は、アブソービングサブスクリプションのサブスクリプション基準を満足するトリガープロデューサのプロデューサキーを記憶するのに使用され、一方、完了列1420は、プロデューサグラフの現在セットの所与の実行中にアブソービングサブスクリプションが完了したかどうか追跡するのに使用される。マッチングプロデューサ列1415及び完了列1420は、インスタンス生成されたプロデューサをスキャンする作業を、以下に述べる自動プロデューサグラフ発生とプロデューサグラフ実行との間で分割できるようにする付加的な任意の最適化を与える。
又、図14Aは、スティッキーサブスクリプションに使用される親クラス列1430、親メソッド列1435、及び親インスタンス列1437も示している。これら親クラス列1430、親メソッド列1435、及び親インスタンス列1437は、各々、スティッキーサブスクリプションに対して生成されるべき親プロデューサのクラスキー、メソッドキー、及びインスタンスキーを記憶する。更に、図14Aは、サブスクリプションを生成する依存性決定プロデューサに対するリファレンスを記憶する依存性決定プロデューサリファレンス列1421も示している。
アブソービングサブスクリプション
アブソービングサブスクリプションプロデューサ依存性において、依存性は、アブソービングサブスクリプション基準を満足する現在プロデューサグラフ構造の全プロデューサの集合に対するものである。図14Bを参照すれば、丸1は、プロデューサ1450がインスタンス生成される(例えば、プロデューサ1450を、問題とするプロデューサとして指定する結果として、プロデューサ1450を、問題とするプロデューサの子孫として自動的に発見する結果として、等々)ことを指示する。プロデューサ1450は、プロデューサ依存性宣言がプロデューサ依存性を含む(例えば、引数ID Xと共に)ところのメソッドに基づく。丸2は、プロデューサ1450のプロデューサ依存性がプロデューサ1455を識別するように処理されることを指示する。
丸3は、プロデューサ1450がプロデューサグラフにおいてプロデューサ1455へ子プロデューサとして(上記例では、引数ID Xを通して)リンクされることを指示する。丸4は、プロデューサ1455の実行を指示する。プロデューサ1455は、アブソービングサブスクリプションプロデューサ依存性を指示すると共にアブソービングサブスクリプション基準を指示するプロデューサ依存性宣言コードを含む依存性決定プロデューサである。従って、プロデューサ1455の実行は、サブスクリプションログのポピュレーションを生じさせる。図14Aの第1行における例に関して、サブスクライバープロデューサキー列1400、サブスクリプション形式列1405、トリガープロデューサ用サブスクリプション基準列1410、親リンクモード列1425、及び依存性決定プロデューサリファレンス列1421には、各々、プロデューサ1450のプロデューサキー、サブスクリプションがアブソービング形式のものであるという指示、プロデューサ1455内に含まれたアブソービングサブスクリプション基準、プロデューサ1455にリンクされたプロデューサ1450のリンクモード(これは、アブソービングサブスクリプションの場合には、引数依存性であり、引数IDを含むが、そのスティッキーインジケータは、スティッキーでないものを指示し、前記の例では、引数ID Xを指示する)、及びプロデューサ1455(サブスクリプションを生成する依存性決定プロデューサ)に対するリファレンスがポピュレートされる。
丸5A−Nは、プロデューサ1460A−Nのインスタンス生成を指示する。この例では、プロデューサ1460A−Nは、アブソービングサブスクリプション基準を満足し、従って、トリガープロデューサである。従って、丸6A−Nは、プロデューサ1450をプロデューサ1460A−Nにリンクする(前記例では、引数ID Xを通して)ことを指示する。丸7は、プロデューサグラフ(1つ又は複数)の現在実行に対してアブソービングサブスクリプション依存性が完了したことを指示し、次いで、プロデューサ1450が実行される。
本発明の一実施形態では、アブソービングサブスクリプション基準は、プロデューサキーを作り上げるキーのいずれか1つ以上である。従って、プロデューサキーが、クラスキー、インスタンスキー、及びメソッドキーを含む本発明の実施形態では、サブスクリプション基準は、1つ以上のそのようなキーである。例えば、図11Cを参照すれば、サブスクリプション基準を満足するものについてのインスタンス生成されたプロデューサを通るスキャンは、インスタンス生成されたプロデューサのキーがアブソービングサブスクリプション基準のキーに一致するかどうか決定するための、プロデューサグラフ構造の最初の3列の1つ以上を通るスキャンである。本発明の一実施形態では、アブソービングサブスクリプション基準は、プロデューサキーを作り上げるキーのいずれか1つ以上であるが、本発明の別の実施形態では、アブソービングサブスクリプション基準は、プロデューサを作り上げるキーのサブセットに制限される。
スティッキーサブスクリプション
スティッキーサブスクリプションプロデューサ依存性において、この依存性は、スティッキーサブスクリプション基準を満足するプロデューサごとに親プロデューサをインスタンス生成させる。図14Cを参照すれば、丸1は、プロデューサ1470がインスタンス生成されることを指示する(例えば、プロデューサ1470を、問題とするプロデューサとして指定する結果として、プロデューサ1470を、シーケンス依存性を通して問題とするプロデューサの子孫として自動的に発見する結果として(例えば、SequencingDependency又はWeaklyConstrainedDependencyの結果として、等々)。プロデューサ1470は、スティッキーサブスクリプション、トリガープロデューサのためのスティッキーサブスクリプション基準、及び生成されるべき親プロデューサのためのスティッキーサブスクリプション特性を指示するプロデューサ依存性宣言コードを含む依存性決定プロデューサである。
プロデューサ1470の実行は、サブスクリプションログのポピュレーションを生じさせる。図14Aの第2行における例に関して、サブスクライバープロデューサキー列1400、サブスクリプション形式列1405、及びトリガープロデューサ用サブスクリプション基準列1410には、各々、プロデューサ1470のプロデューサキー、サブスクリプションがスティッキー形式のものであるという指示、及びプロデューサ1470内に含まれるトリガープロデューサに対するスティッキーサブスクリプション基準がポピュレートされる。更に、トリガープロデューサにリンクされるべき親プロデューサの親クラス列1430、親メソッド列1435、親インスタンス列1437、及びリンクモード列1425には、生成されるべき親プロデューサに対するスティッキーサブスクリプション特性がポピュレートされ、即ち、本発明のこの実施形態では、インスタンス生成されるべき親プロデューサのクラス、インスタンス生成されるべき親プロデューサのメソッド、インスタンス生成されるべき親プロデューサのインスタンス(ブランクのままにされた場合は、トリガープロデューサのインスタンスキーに等しい)、リンクモード(これは、スティッキーサブスクリプションの場合には、1)引数、フィールド又はシーケンス依存性;2)引数依存性の場合の引数ID、即ちトリガープロデューサにリンクされるべき親プロデューサの引数ID(例えば、引数ID Y))がポピュレートされる。更に、依存性決定プロデューサリファレンス列1421には、サブスクリプションを生成した依存性決定プロデューサ(図14Cでは、プロデューサ1470)に対するリファレンスがポピュレートされる。
図14Cを参照すれば、丸2は、プロデューサ1475がインスタンス生成されることを指示する(例えば、プロデューサ1475を、問題とするプロデューサとして指定する結果として、プロデューサ1475を、問題とするプロデューサの子孫として自動的に発見する結果として、等々)。更に、プロデューサ1475がトリガープロデューサに対するスティッキーサブスクリプション基準を満足するかどうか決定される。丸3は、トリガープロデューサ1475に応答して、プロデューサ1480が、生成されるべき親プロデューサに対するスティッキーサブスクリプション特性に基づいてインスタンス生成されることを指示する。図14Cの例示的な第2行を参照すれば、クラスキー、メソッドキー、インスタンスキー、及びリンクモードは、親クラス列1430、親メソッド列1435、インスタンス列1437、及び親リンクモード列1425から各々アクセスされる。親プロデューサは、アクセスされたクラスキー、アクセスされたインスタンスキー(ブランクのままにした場合は、トリガープロデューサ(図14Cでは、プロデューサ1475)のインスタンスキー)、及びアクセスされたメソッドキーより成るプロデューサキーを有し、即ち図14Cの例では、これは、プロデューサ1480である。丸4は、インスタンス生成された親プロデューサ1480が、プロデューサグラフにおいて、アクセスされたリンクモード(前記例では、リンクモード形式=引数依存性;リンクモード引数ID=Y)を通して子のトリガープロデューサ1475にリンクされることを指示する。又、丸4において、引数依存性の場合に、スティッキーインジケータは、スティッキーであることを指示するようにセットされ、即ちインスタンス生成された親プロデューサ1480のベースとなるメソッドに対するプロデューサ依存性宣言ステートメントの位置におけるプロデューサ依存性を、プロデューサ1480に対して無視しなければならないことを指示するようにセットされ、これは、スティッキーサブスクリプションプロデューサ依存性により生成されるリンクが、その後の自動プロデューサグラフ発生オペレーションにより上書きされることを防止する。
本発明の一実施形態では、トリガープロデューサに対するスティッキーサブスクリプション基準は、プロデューサキーを作り上げるキーの1つ以上である。従って、プロデューサキーが、クラスキー、インスタンスキー及びメソッドキーより成る実施形態では、トリガーに対するスティッキーサブスクリプション基準は、クラス、インスタンス及びメソッドキーの1つ以上である。例えば、図11Cを参照すれば、トリガープロデューサに対するスティッキーサブスクリプション基準を満足するものについてのインスタンス生成されたプロデューサを通るスキャンは、インスタンス生成されたプロデューサのキーがトリガープロデューサに対するスティッキーサブスクリプション基準のキーに一致するかどうか決定するための、プロデューサグラフ構造の第1列から第3列の1つ以上を通るスキャンである。本発明の一実施形態では、トリガープロデューサに対するスティッキーサブスクリプション基準は、プロデューサキーを作り上げるキーの1つ以上であるが、本発明の別の実施形態では、アブソービングサブスクリプション基準は、プロデューサを作り上げるより限定された数のキーである。
図14D−Eは、本発明の一実施形態による親依存性決定プロデューサに基づく親プロデューサの選択を示す。図14D−Eは、引数依存性について説明するが、本発明の実施形態は、シーケンス及びフィールド依存性の使用もサポートできる。
図14Dは、本発明の一実施形態により、スティッキーサブスクリプションにより生成される親依存性決定プロデューサに基づく親プロデューサの選択を示す。図14Cと同様に、図14Dは、スティッキーサブスクリプションプロデューサ1470及びトリガープロデューサ1475を示しているが、プロデューサ1480ではなく、図14Dは、スティッキーサブスクリプションプロデューサ1470のスティッキーサブスクリプションを通して生成された依存性決定プロデューサ1480を示している。更に、図14Dは、スティッキーサブスクリプションのリンクモードが、引数依存性、引数ID=X、及びスティッキーインジケータ=スティッキーであることも示している。プロデューサ1475から依存性決定プロデューサ1480への破線の曲線で示されたように、依存性決定プロデューサにより返送されるDEPは、プロデューサ1475それ自体の出力(引数ID=Xの引数)に基づくものである。図14Dにおいて、依存性決定プロデューサ1480は、プロデューサ1482に対する非サブスクリプション上方宣言プロデューサ依存性を、引数依存性及び引数ID=Yを指示するリンクモードと共に返送する。図14DではX及びYの引数IDを使用して、それらが異なることを示すが、それらが等しくてもよいことを理解されたい。
図14Eは、本発明の一実施形態により、シーケンス依存性によりリンクされる子依存性決定プロデューサによって生成される親依存性決定プロデューサに基づく親プロデューサの選択を示す。図14Eは、図14Dと構造が類似し、より詳細には、プロデューサ1475、1480及び1482が、プロデューサ1486、1496及び1498に置き換えられる。しかしながら、プロデューサ1480と1475との間にリンクを生成するスティッキーサブスクリプションプロデューサ1470ではなく、プロデューサ1486は、依存性決定プロデューサ1494に対するシーケンス依存性(例えば、UpwardDependency又はWeaklyConstrainedDependencyを通して生成された)を有し、これは、非サブスクリプション上方宣言依存性を通して依存性決定プロデューサ1496を生成する。
スティッキーサブスクリプション及び非サブスクリプション上方宣言依存性(例えば、UpwardDependencies及び/又はWeaklyConstrainedDependenciesを通して生成される)は、プロデューサグラフのボトムアップ構築を生じさせる(先に述べたトップダウン構築ではなく)ことに注意する価値がある。更に、このボトムアップ構築は、単一レベルの構築に制限されず、複数のレベルでもよい(例えば、スティッキーサブスクリプション又は非サブスクリプション上方宣言依存性のために、親プロデューサがインスタンス生成される場合には、その同じ親プロデューサがスティッキーサブスクリプションのためのトリガープロデューサであってもよいし、又は非サブスクリプション上方宣言依存性を含み、別の親プロデューサのインスタンス生成を生じさせ、等々でもよい)。この意味で、スティッキーサブスクリプション及び非サブスクリプション上方宣言依存性は、プロデューサグラフの構築を逆転する。
本発明の幾つかの実施形態において、スティッキーサブスクリプション特性により識別される親プロデューサは、標準プロデューサであるが(図14Cを参照)、別の実施形態は、他の形式のプロデューサの識別をサポートするように具現化されてもよい。例えば、依存性決定プロデューサを識別するスティッキーサブスクリプション特性を許す本発明の実施形態では(図14Dを参照)、そのような依存性決定プロデューサは、トリガープロデューサの出力にアクセスし、そしてその出力に基づき、子プロデューサにくっつく必要のある親プロデューサとしての特定プロデューサの生成をトリガーすることができる(この親プロデューサは、予め存在してもしなくてもよく、予め存在する場合には、それが単にリンクされそして子プロデューサがその引数に追加されるが、存在しない場合には、それがクリアされる)。依存性決定プロデューサが一定プロデューサを返送するケースは、アブソービングサブスクリプションに類似している。依存性決定プロデューサが、トリガープロデューサごとにインスタンスキーが独特であるプロデューサを返送する(例えば、インスタンスキーがトリガープロデューサのプロデューサキーであるプロデューサを返送する)ケースは、子プロデューサごとに個別の親プロデューサを生じ、純粋なスティッキーサブスクリプションと称される。依存性決定プロデューサが、トリガープロデューサごとに一定でも独特でもないインスタンスキーを返送するケースは、純粋なスティッキーサブスクリプション及びアブソービングサブスクリプションの振舞いを混合することができ、非純粋のスティッキーサブスクリプションと称される。
例示的な効果
上述したように、本発明の一実施形態では、プロデューサ依存性は、手動インボケーションシーケンスコードを使用せずに、適切なインスタンスを使用してメソッドインボケーションシーケンスを指定する仕方としてメソッドに対して宣言され(ここで、適切なインスタンスは、引数として使用するためのインスタンス、インスタンスメソッドにより使用されるべきインスタンス、及びクラスメソッドにより使用されるメタクラスインスタンスを含み);実際上、幾つかの又は全ての手動インボケーションシーケンスコードを発生する作業は、次のものに置き換えられる。1)プロデューサ依存性宣言を書き込むためにアプリケーションプログラマーにより行われる作業;及び2)プロデューサグラフ(1つ又は複数)を発見及び構築し、そしてそのプロデューサグラフ(1つ又は複数)のプロデューサを実行するためにランタイムにより行われる作業。ランタイムを書く努力は、比較的多大であるが、ランタイムに対して書かれたオブジェクト指向のアプリケーションを実行するのに使用できるという点で一度書くだけでよく、対照的に、典型的なアプリケーションでは、プロデューサ依存性宣言を書くための努力は、手動インボケーションシーケンスコードを書くのに比して僅かである。
非ダイナミックなプロデューサ依存性は、非条件付きメソッドインボケーションシーケンスコードを指定する仕方を与え、従って、非条件付き手動インボケーションシーケンスコードを書く必要性を回避する。コンティンジェントのプロデューサ依存性は、条件付き処理を指定する仕方を与え、従って、条件付き手動インボケーションシーケンスコードを書く必要性に取って代わる。プロデューサの集合を返送できるようにするプロデューサ依存性をサポートすることは、パラメータとして通される前に集合の充填を指定する仕方を与え、従って、パラメータとして通される前に集合を充填するために手動インボケーションシーケンスコードに複数のコールを書き込む必要性を回避する。サブスクリプションをサポートすることは、プログラマーが、聴取されるオブジェクトの各形式に対して特定の聴取コードを書き込む必要のない環境を与える(例えば、プロデューサグラフ指向のプログラミングスプレッドシートにおいては、アブソービングサブスクリプション基準で範囲内のセルを識別させ、そしてアブソービングサブスクリプションに新たなプロデューサが追加されるたびに平均値を再計算することにより、アブソービングサブスクリプションを使用して、ある範囲のセル(各セルはプロデューサである)の平均値を計算することができ;又、プロデューサグラフ指向のプログラミングスプレッドシートにおいては、スティッキーサブスクリプション基準で通貨コンテンツを保持するセルを識別させ、そして通貨換算を行うスティッキープロデューサ(1つ又は複数)のスティッキーサブスクリプション特性をインスタンス生成させることにより、スティッキーサブスクリプションを通貨コンバータとして使用することができる(スティッキーサブスクリプションにより生成された(換算金額を保持する)プロデューサは、次いで、他のセルにおいて表示するように使用できる)。
オペレーション
新インスタンスコマンド
図15は、本発明の一実施形態により新たなインスタンスをインスタンス生成するためのフローチャートである。図10を参照して上述したように、図10の新クラスモジュール1095は、新インスタンスモジュール1098の一部分として具現化することができる。図15のフローチャートは、このような実施形態を仮定するもので、新インスタンスモジュール1098により遂行され、新クラスモジュール1095を表す図15のフローチャートの一部分は、ブロック1540及び1550を含む破線ブロック1580として示されている。
新インスタンスコマンドに応答して(ブロック1510)、制御はブロック1520へ進む。ブロック1520において、インスタンスが既に存在するかどうか決定される。もし存在しなければ、制御はブロック1530へ進み、さもなければ、インスタンスをインスタンス生成する必要がなく、制御はブロック1570へ進み、フローチャートが終了となる。インスタンスキーをサポートする一実施形態では、ブロック1520は、新インスタンスコマンドの一部分として与えられるインスタンスキー(及びインスタンスキーがクラスにわたって独特のものである必要がない場合にはクラスキー)に対して図10のインスタンス追跡構造1065にアクセスすることにより遂行される。
ブロック1530では、インスタンスのクラス定義が既にロードされたかどうか決定される。ロードされていない場合は、制御はブロック1540へ進み、さもなければ、制御はブロック1560へ進む。クラスキーをサポートする一実施形態では、ブロック1540は、新インスタンスコマンドの一部分として与えられるクラスキーに対して図10のクラス追跡構造1092にアクセスすることにより遂行される。
ブロック1540では、クラスがロードされ、制御がブロック1550へ進む。ブロック1550では、(クラス内のメソッドキーにより記憶される(図11Dを参照))プロデューサ依存性宣言ステートメントを含めて、クラス定義がクラスキーに基づいて記憶されそしてイントロスペクトされる。ブロック1550から、制御は、ブロック1560へ進む。図10を参照すれば、ブロック1540及び1550において次のことが遂行される。1)クラスが、ビジネスロジック1010を含むクラス定義から、クラス1054へロードされ(このロードの結果、クラスのメソッド及びプロデューサ依存性宣言がメソッド及びプロデューサ依存性宣言1056に記憶され);2)クラスがクラス追跡構造1092に追加され;そして3)メソッドがメソッド追跡構造1058に追加される。更に、メソッドの出力クラスがロードされる。
ブロック1560では、クラスのインスタンスがインスタンスキーに基づいてインスタンス生成され記憶される。図10を参照すれば、インスタンスは、インスタンス1052へとインスタンス生成され、そしてインスタンスは、インスタンス追跡構造1065へと追加される。ブロック1550から、制御は、ブロック1570へ進み、フローチャートが終了となる。オブジェクト関連マッピング技術が使用される本発明の幾つかの実施形態では、データを外部データソースからロードして、インスタンスのフィールドをブロック1560の一部分としてポピュレートすることができる。
本発明の幾つかの実施形態では、クラス及びインスタンスは、プロデューサグラフ指向のプログラミングサポートを伴うランタイムが気付かないやり方でロード/インスタンス生成される(例えば、図9Aにおいて、ランタイム910が気付かない状態でランタイム915がロード/インスタンス生成する場合)。このようなケースにおいて、クラスInstanceKey(これは2つのエレメントを保持する:即ち、キー識別子がインスタンス又は別のオブジェクト(ストリングのような)に対するリファレンスであるかどうか指示するインスタンスキーネイチャー;及びインスタンス又は別のオブジェクト(ストリングのような)のいずれかに対するリファレンスであるキー識別子)のインスタンスであるインスタンスキーもサポートする本発明の実施形態では、ブロック1520及び1530は、プロデューサグラフ指向のプログラミングサポートを伴うランタイムが気付くやり方でインスタンス及びクラスがインスタンス生成され/ロードされるかどうか問合せする。プロデューサグラフ指向のプログラミングサポートを伴うランタイムが、既にロードされたクラスに気付かないケースでは、クラスがロードされず、クラスは、クラス追跡構造1092に追加され、そしてメソッドは、メソッド追跡構造1058に追加される。プロデューサグラフ指向のプログラミングサポートを伴うランタイムが、既にインスタンス生成されたインスタンスに気付かないケースでは、インスタンスがインスタンス生成されず、インスタンスは、インスタンス追跡構造1065に追加される。
新プロデューサ及び非オーバーライドコマンド
図16Aは、本発明の一実施形態により新たなプロデューサをインスタンス生成し、そしてプロデューサを非オーバーライドするためのフローチャートである。図10を参照すれば、図16Aのフローは、自動プロデューサグラフ発生モジュール1040及びオーバーライドプロデューサモジュール1045(又は図10に関する別の実施形態を参照して述べるように、オーバーライド及び非オーバーライドを取り扱うモジュール)により遂行される。
新プロデューサコマンドに応答して(ブロック1600)、制御はブロック1605へ進む。本発明の一実施形態では、新プロデューサコマンドは、種々の状況に応答して実行することができる。以下のテーブル2は、本発明の一実施形態によりパスされる種々の状況及びパラメータを示す。
テーブル2
ブロック1605において、プロデューサが既に存在するかどうか決定される。存在しなければ、制御はブロック1610へ進み、さもなければ、制御はブロック1670へ進む。ブロック1605は、新プロデューサコマンドの一部分として(例えば、キー及び/又はリファレンスにより)識別されたクラス、インスタンス及びメソッドにアクセスすることにより遂行される。プロデューサキーをサポートする一実施形態では、ブロック1605は、新プロデューサコマンドの一部分として与えられたプロデューサキー(テーブル2の被呼プロデューサ列におけるプロデューサキー)に対して図10のプロデューサグラフ(1つ又は複数)構造1060にアクセスすることにより遂行される。
ブロック1610では、新インスタンスモジュールが新インスタンスコマンドでコールされ、制御はブロック1615へ進む。本発明の一実施形態では、ブロック1610は、テーブル2の被呼プロデューサ列のプロデューサキーからのインスタンスキーを使用して図15のフローチャートをコールすることにより遂行される。
ブロック1615では、プロデューサのインスタンスのクラス定義がアクセスされ、制御はブロック1620へ進む。図10を参照すれば、クラス追跡構造1092に基づいてクラス1054の適切な1つにアクセスするために、テーブル2の被呼プロデューサ列におけるプロデューサキーからのクラスキーを使用することによりブロック1615が遂行される。
ブロック1620では、プロデューサのメソッド及びプロデューサ依存性宣言ステートメントがアクセスされ、制御はブロック1623へ進む。図10を参照すれば、ブロック1615で位置付けられたクラスからメソッド及びプロデューサ依存性宣言1056の適切な1つにアクセスするために、テーブル2の被呼プロデューサ列におけるプロデューサキーからメソッドキーを使用することによりブロック1620が遂行される。
ブロック1623では、プロデューサ実行モードが決定され、制御はブロック1625へ進む。ブロック1623が遂行される1つの例示的なやり方を以下に説明する。幾つかの実施形態では、デフォールト実行モードは、コードレベルにおいてアノテーションとして定義される。振舞いは、エンドユーザによるか又はクライアントコードによりプロデューサベースの構成可能な判断構造(例えば、図10のプロデューサベースの構成可能な判断構造1049)を通してクラスベース、メソッドベース、インスタンスベース又はその組合せでランタイムにおいてオーバーライドすることができる。更に、コンピューティング環境(例えば、単一マシンにおける多数のプロセッサの利用性、グリッドの利用性、プロセッサ(1つ又は複数)の負荷、等)に基づいて所定の実行モードで実行を強制的に行わせることによりこれらのプログラミングアノテーション又はユーザ定義構成をランタイムが無視できるようにランタイム設定を与えることができる。
ブロック1625では、プロデューサグラフにプロデューサが追加され、制御はブロック1630へ進む。図11Cにおける本発明の実施形態を参照すれば、最初の3つの列がポピュレートされる。
ブロック1630では、各々の登録されたサブスクリプションに対して、サブスクリプションフィルタリング基準が処理されて、プロデューサが一致するかどうか決定する。図14Aにおける本発明の実施形態を参照すれば、サブスクリプションは、それがサブスクリプションログに追加されたときに登録されたと考える。サブスクリプションを登録するための例示的オペレーションを以下に説明する。ブロック1630は、自動プロデューサグラフ発生とプロデューサグラフ実行との間に分割されるべきインスタンス生成されたプロデューサをスキャンする作業を許す任意の最適化である。従って、本発明の別の実施形態では、ブロック1630を遂行しなくてもよい。
ブロック1635では、プロデューサは、依存性のためにコールされた場合にプロデューサグラフ(1つ又は複数)にリンクされる。ブロック1635から、制御は、ブロック1640へ進む。ブロック1635を遂行する仕方は、新プロデューサコマンドが実行される状況に依存する。例えば、状況が、それが問題とするプロデューサであるか又はオーバーライドされるプロデューサであるというものである場合には、依存性のためにそれがコールされず、何も行われない。対照的に、状況が非サブスクリプション下方宣言である場合には、非サブスクリプション下方宣言依存性のためにそれがコールされ、図11Cにおける本発明の実施形態を参照すれば、次のことが行われる。1)被呼子プロデューサの親プロデューサ(1つ又は複数)リンク(1つ又は複数)列1150(テーブル2の被呼プロデューサ列)が、親発呼プロデューサの行に対する親プロデューサリファレンス(テーブル2の発呼プロデューサ列)、及び依存性決定プロデューサリファレンス(テーブル2の依存性決定プロデューサリファレンス列)で変更され;及び2)親発呼プロデューサの行の子プロデューサ(1つ又は複数)リンク(1つ又は複数)列1160(テーブル2の発呼プロデューサ列)が、被呼子プロデューサの行に対する子プロデューサリファレンス(テーブル2の被呼プロデューサ列)、依存性決定プロデューサリファレンス(テーブル2の依存性決定プロデューサリファレンス列)、及びリンクモード(テーブル2のリンクモード列によりセットされる)で変更される。
対照的に、状況がスティッキーサブスクリプションである場合には、それは、識別されるトリガープロデューサのためにコールされたものであり、図11Cにおける本発明の実施形態を参照すれば、次のことが行われる。1)発呼子プロデューサの親プロデューサ(1つ又は複数)リンク(1つ又は複数)列1150(テーブル2の発呼プロデューサ列)が、親被呼プロデューサの行に対する親プロデューサリファレンス(テーブル2の被呼プロデューサ列)、及び依存性決定プロデューサリファレンス(テーブル2の依存性決定プロデューサリファレンス列)で変更され;及び2)親被呼プロデューサの行の子プロデューサ(1つ又は複数)リンク(1つ又は複数)列1160(テーブル2の被呼プロデューサ列)が、発呼子プロデューサの行に対する子プロデューサリファレンス(テーブル2の発呼プロデューサ列)、依存性決定プロデューサリファレンス(テーブル2の依存性決定プロデューサリファレンス列)、リンクモード(テーブル2のリンクモード列によりセットされる)、及びスティッキーを指示するようにセットされたスティッキーインジケータで変更される。この点に関して、非サブスクリプション上方宣言依存性の状況は、スティッキーサブスクリプションと同様に取り扱われる。
ブロック1640において、プロデューサは、非実行とマークされ、制御はブロック1645へ進む。図11Cにおける本発明の実施形態を参照すれば、適切な行の増分的実行マーキング列1180に、非実行指示がポピュレートされる。
ブロック1645では、プロデューサが何らかの依存性を有しそしてオーバーライドされないかどうか決定される。もしそうであれば、制御はブロック1650へ進み、さもなければ、制御はブロック1665へ進む。ブロック1645は、ブロック1620においてアクセスされたプロデューサ依存性宣言及びテーブル2のコール形式列をチェックすることにより遂行される。
ブロック1650では、現在解明されるべきプロデューサ依存性宣言の各依存性に対して、プロデューサの数が決定され、そして各々に対して新プロデューサコマンドがインボークされる。ブロック1650から、制御はブロック1655へ進む。本発明の異なる実施形態は、異なる時間に異なる形式の依存性を決定し、本発明の一実施形態においてブロック1650を遂行する仕方について以下に説明する。
ブロック1655では、プロデューサは、その全ての従属プロデューサが存在しそして実行された場合に実行スタートログに追加される。ブロック1655から、制御はブロック1660へ進む。このフローの現在繰り返しの一部分としてインスタンス生成される所与のプロデューサに対して、ブロック1655が遂行されるときには、従属プロデューサに対するこのフローの別の繰り返しのインボケーションでプロデューサの実行状態が返送される(ブロック1660を参照)(例えば、図11Cの本発明の実施形態に関しては、適切な行(1つ又は複数)の増分的実行マーキング列1180からの状態)。全ての従属プロデューサが存在し且つ全ての従属プロデューサの実行状態が実行される場合には、現在繰り返しのプロデューサが実行スタートログに追加される。
ブロック1660では、プロデューサの実行状態がパラメータとして返送される。
ブロック1665では、プロデューサが実行スタートログに追加され、制御はブロック1660へ進む。
ブロック1670では、ブロック1635と同様に、プロデューサは、依存性のためにコールされた場合にプロデューサグラフ(1つ又は複数)にリンクされる。ブロック1670から、制御はブロック1675へ進む。種々の理由でブロック1670に到達する。例えば、プロデューサがプロデューサオーバーライドコマンドに応答して以前にインスタンス生成されたがプロデューサグラフにリンクされないために、ブロック1670に到達する。別の例として、プロデューサがプロデューサグラフの既に一部分でありそして別のものに追加される(例えば、問題とするプロデューサ、問題とするプロデューサの子孫、等であることに応答して以前にインスタンス生成された)ためにブロック1670に到達することがある。
ブロック1675では、オーバーライド、スティッキーサブスクリプション依存性、又は非サブスクリプション上方宣言依存性のために、新プロデューサフローがコールされるかどうか決定される。もしそうであれば、制御はブロック1680へ進み、さもなければ、制御はブロック1660へ進む。ブロック1675は、テーブル2のコール形式列をチェックして、それが、オーバーライドされたプロデューサに対するコールであるか、スティッキーサブスクリプション依存性に対するコールであるか、又は非サブスクリプション上方宣言依存性に対するコールであるか調べることにより、遂行される。
ブロック1680では、ブロック1640と同様に、プロデューサは、非実行とマークされ、制御はブロック1665へ進む。ブロック1680は、種々の理由で到達する。
プロデューサ非オーバーライドコマンドに応答して(ブロック1690)、制御はブロック1695へ進む。ブロック1695では、プロデューサが非オーバーライドとマークされ、制御はブロック1640へ進む。図11Cの本発明の実施形態を参照すれば、プロデューサの行のプロデューサ出力キャッシング及びオーバーライドプロデューサ出力指示列1170がアクセスされ、そしてプロデューサがもはやオーバーライドされないことを指示するように変更される。このフローを続けると、ブロック1640は、ブロック1645へ通じ、又、プロデューサが何らかの依存性を有する場合には、ブロック1650へ通じ、これは、プロデューサのもとでのプロデューサグラフがまだない場合には、それを発見し構築するようにさせる。プロデューサのもとでのプロデューサグラフが既に発見され構築されている場合には、新プロデューサコマンドをインボークすると、フローが1600から1605へ、1670へ、等々と進み、更に、ブロック1660においてプロデューサのもとでのグラフのプロデューサの実行状態を返送すると、ブロック1655において実行スタートログにプロデューサが追加されるかどうか決定される。しかしながら、プロデューサのもとでのプロデューサグラフが発見及び構築されない場合には、新プロデューサコマンドをインボークすると、それが発見及び構築され、フローは、1600から1605へ、1610へ、等々と進む。
図16Bは、本発明の一実施形態による図16Aのブロック1623のフローチャートである。従って、制御は、ブロック1620からブロック1623のブロック16231へと進む。ブロック16231では、ランタイム実行設定オーバーライドがチェックされる。次いで、ブロック16233においてランタイム実行設定オーバーライドがイネーブルされるかどうか決定される。もしセットされる場合には、ブロック16234においてランタイム実行に基づいて実行モードがセットされる。さもなければ、エンドユーザからの実行モード選択に対するプロデューサベースの構成可能な判断構造がブロック16235においてチェックされて、そして制御はブロック16236へ進む。ブロック16236では、エンドユーザが実行モード選択を行ったかどうか決定される。もしそうであれば、ブロック16237においてプロデューサベースの構成可能な判断構造における設定に基づいて実行モードがセットされる。さもなければ、ブロック16238において、コードレベルでアノテーションとして定義された実行モードに対してプロデューサのメソッド定義がチェックされ、そしてアノテーションに基づいて実行モードがセットされる。ブロック16238又はブロック16237から、制御はブロック16239へと進み、ブロック1623内の処理を終了させる。
図17は、本発明の一実施形態による図16のブロック1650のためのフローチャートである。従って、制御は、ブロック1645からブロック1650におけるブロック1700へと進む。ブロック1700において、プロデューサのプロデューサ依存性宣言における各依存性に対して(各ArgumentDependenciy、FieldDependency、SequencingDependency、UpwardDependency及びWeaklyConstrainedDependencyに対して1つづつ)、次のブロック1705−1745が遂行される。図10及び11Dを参照すれば、メソッド追跡構造がアクセスされ、プロデューサ依存性に関する情報が決定される。又、ブロック1715、1725、1730、1740、1745及び1750は、プロデューサグラフを実行する前に遂行されたときに最適となることも理解されたい。
ブロック1705では、依存性が、スティッキー依存性のために既にリンクされた引数依存性であるかどうか決定される。もしそうであれば、制御はブロック1710へ進み、そこで、この依存性に対してフローが完了し、さもなければ、制御はブロック1715へ進む。図11Cに示す本発明の実施形態に関しては、スティッキーインジケータがチェックされ、この依存性の引数IDがスティッキーサブスクリプション引数依存性を受けるか又は上方宣言引数依存性を受けるかを決定する。
ブロック1715では、依存性がコンティンジェント依存性であるかどうか決定される。もしそうであれば、制御はブロック1720へ進み、さもなければ、制御はブロック1725へ進む。ブロック1715は、依存性により識別された子プロデューサのプロデューサ依存性宣言をチェックして、それが空である(子プロデューサが独立プロデューサである)かどうか決定することにより、遂行される。図13A−Jを参照すれば、これは、破線の丸内の数字を伴うプロデューサ(例えば、図13Dでは、プロデューサCU::IV::DELTA)については真であるが、他のプロデューサ(例えば、図13Dでは、プロデューサCW::IY::BETA)については真でない。従って、図13Dを参照すれば、ブロック1715は、丸1、4及び8により表わされる。ブロック1715及びそこからブロック1725−1750を通るフローは、最適なものであって、破線の丸内の数字を伴うプロデューサをプロデューサグラフに追加/リンクすることと、プロデューサを実行する作業を自動プロデューサグラフ発生とプロデューサグラフ実行との間で分割すること、の両方を回避する。
ブロック1720では、依存性決定プロデューサに対する新プロデューサコマンドがインボークされ、そしてフローが終了となる。例えば、図13Dを参照すれば、ブロック1720は、丸5、6及び7で表わされたものを生じさせる。
ブロック1725では、依存性決定プロデューサが実行され、制御はブロック1730へ進む。例えば、図13Dを参照すれば、ブロック1725が丸11で示されている(従って、図17のフローは、図13Dの丸9及び10が遂行されない前記実施形態を示している)。
ブロック1730では、依存性が非サブスクリプション依存性であるかどうか決定される。もしそうであれば、制御はブロック1750へ進み、さもなければ、制御はブロック1740へ進む。換言すれば、ブロック1725では、親プロデューサのプロデューサ依存性宣言の一部分である依存性決定プロデューサのメソッドにおけるプロデューサ依存性決定コードが実行される。この依存性がサブスクリプション依存性であるかどうか識別するこのプロデューサ依存性宣言コードが実行されると、親プロデューサのプロデューサ依存性の形式が決定される。図13Dの例に関して、丸11は、ブロック1730からブロック1750へ進む図17のフローを生じさせる。
ブロック1750では、ブロック1725における依存性決定プロデューサの実行により返送されるプロデューサの数が決定され、そして1725において実行された依存性決定プロデューサリファレンスを含めて、テーブル2に示す引数を使用して、各々に対して新プロデューサコマンドがインボークされる。例えば、図13Dを参照すれば、ブロック1750が丸12及び13と、丸C及びDとを生じさせる。
図14Bのアブソービングサブスクリプション実施例を参照すれば、ブロック1725は丸4を表し、これは、ブロック1730を通してブロック1740へと進むフローを生じさせる。
ブロック1740において、サブスクリプションがサブスクリプションログに追加され、そしてサブスクリプションがアブソービングである場合には、それが未完了とマークされる。ブロック1740から、制御はブロック1745へ進む。図14Aに示す本発明の実施形態を参照すれば、サブスクリプションログは、上述したようにサブスクリプションでポピュレートされる。
ブロック1745では、インスタンス生成された全てのプロデューサがスキャンされ、それらがサブスクリプションの基準に一致する(従って、トリガープロデューサである)かどうか調べられ、そして一致が処理される。
図18は、本発明の一実施形態による図17のブロック1745に対するフローチャートである。従って、制御は、ブロック1740から、ブロック1745におけるブロック1800へ進む。ブロック1800では、インスタンス生成される各プロデューサに対して、次のブロック1810−1830が遂行される。
ブロック1810では、プロデューサがサブスクリプションの基準を満足するかどうか決定される。もしそうであれば、制御はブロック1815へ進み、さもなければ、制御はブロック1830へ進み、そこで、現在処理されているプロデューサについてフローが終了となる。図11C及び14Aに示す本発明の実施形態を参照すれば、プロデューサグラフ(1つ又は複数)がアクセスされ、それらが、サブスクリプションの基準を満足するプロデューサを含むかどうか決定する。
マッチングプロデューサを処理する仕方は、処理されるサブスクリプションの形式に依存する。ブロック1815を参照すれば、サブスクリプションがアブソービング形式である場合には、制御はブロック1825へ進み、さもなければ、制御はブロック1820へ進む。ブロック1815は、1740又は2235において追加されるサブスクリプションの形式に応答して遂行される。
ブロック1825では、マッチングプロデューサがサブスクリプションログに追加されそしてアブソービングサブスクリプションを伴うプロデューサがマッチングプロデューサにリンクされる。ブロック1825から、制御はブロック1830へ進む。図11C及び図14A−Bに示す本発明の実施形態を参照すれば、次のことが行われる。1)トリガープロデューサ列1410のためのサブスクリプション基準からのサブスクリプション基準がブロック1810に使用され、そしてマッチングプロデューサが探索され(例えば、プロデューサ1560A−Nの1つ);2)マッチングプロデューサが、サブスクリプションの行においてマッチングプロデューサ列1415に追加され;そして3)アブソービングサブスクリプションを伴うプロデューサ(例えば、プロデューサ1450)が図11Cのプロデューサグラフ(1つ又は複数)構造におけるマッチングプロデューサ(例えば、プロデューサ1460A−Nの1つ)にリンクされる(所与のアブソービングサブスクリプションに対してサブスクリプションログ14Aの依存性決定プロデューサリファレンス列1421から抽出された依存性決定プロデューサリファレンスを使用して)。
ブロック1820では、生成されるべき親プロデューサに対して新プロデューサコマンドがインボークされる。ブロック1820から、制御はブロック1830へ進み、そこで、ブロック1800において選択された現在プロデューサに対してフローが終了となる。図14A及び14Cに示す本発明の実施形態を参照すれば、次のことが行われる。1)トリガープロデューサ列1410に対するサブスクリプション基準からのサブスクリプション基準がブロック1810において使用され、そしてマッチングプロデューサが探索され(例えば、プロデューサ1475);そして2)次のようにセットされたテーブル2のパラメータで新プロデューサコマンドがインボークされる。a)コール形式はスティッキーサブスクリプションであり;b)発呼プロデューサは、発呼子プロデューサ(例えば、プロデューサ1475)のプロデューサキーであり;c)被呼プロデューサは、生成されるべき被呼親プロデューサ(例えば、プロデューサ1480)のプロデューサキーであり、このプロデューサキーは、生成されるべき親プロデューサに対するスティッキーサブスクリプション特性からの親クラス、インスタンス及びメソッドキー(図14A、列1430、1435及び1437)を使用して(インスタンスキーが空である場合には、発呼子プロデューサのインスタンスキーを使用して)形成され;及びd)被呼親プロデューサに対するリンクモード(図14A、リンクモード列1425)、並びにe)所与のスティッキーサブスクリプションに対するサブスクリプションログ14Aの依存性決定プロデューサリファレンス列1421から抽出される依存性決定プロデューサリファレンス。
図19は、本発明の一実施形態による図16のブロック1630のためのフローチャートである。従って、制御は、ブロック1625から、ブロック1630におけるブロック1900へと進む。図19は、図18に非常に良く似ている。より詳細には、図19のブロック1910、1915、1920及び1930は、ブロック1810、1815、1820及び1830と同一であり、一方、ブロック1900及び1925は、ブロック1800及び1825とは異なる。従って、相違点のみについてここに説明する。
ブロック1900は、各登録されたサブスクリプションに対してフローが遂行されることを示し、一方、ブロック1800は、各インスタンス生成されたプロデューサに対してフローが遂行されることを示す。従って、図18のフローは、単一のサブスクリプションを中心として全てのプロデューサをスキャンするが、図10のフローは、単一のプロデューサを中心として全てのサブスクリプションをスキャンする。
ブロック1925は、アブソービングサブスクリプションが未完了とマークされることを除いて、ブロック1825と同じである。図14Aに示す本発明の実施形態を参照すれば、適切な行における完了列1420が、未完了を示すように更新される。
図20は、本発明の一実施形態による図16のブロック1635及び1670のためのフローチャートである。従って、制御は、ブロック1605及びブロック1630から、ブロック1635及び1670におけるブロック2005へ進む。ブロック2005において、図16のフローチャートのこの繰り返しが、依存性のために(例えば、以前の繰り返しのブロック1630(ブロック1920)又は1650(ブロック1720、1750又は1745/1820から)インボークされたものであるかどうか決定される。もしそうでなければ、制御は、どこからフローに入ったか(ブロック1630又は1605から)に基づいてブロック1640又は1675へ進む。
ブロック2010において、フローがスティッキーサブスクリプション又は非サブスクリプション上方宣言状態のためにコールされたかどうか決定される。もしそうでなければ、制御はブロック2015へ進み、さもなければ、制御はブロック2020へ進む。ブロック2010は、テーブル2からのコール形式パラメータ(即ち、コール形式がスティッキーサブスクリプション又は非サブスクリプション上方宣言であるかどうか)をチェックすることにより遂行される。図18及び19に示す本発明の実施形態を参照すれば、新プロデューサコマンドは、ブロック1820又は1920からインボークされる。
ブロック2020では、現在親プロデューサが、発呼側の子プロデューサにリンクされる。図11C及び図14Cに示す本発明の実施形態を参照すれば、テーブル2の被呼プロデューサ列からのパラメータにより識別された被呼親プロデューサ(例えば、プロデューサ1480)は、図11Cのプロデューサグラフ(1つ又は複数)構造において、テーブル2のリンクモード及び依存性決定プロデューサリファレンス列からのパラメータにより識別されたリンクモード及び依存性決定プロデューサリファレンスを使用して、テーブル2の発呼プロデューサ列からのパラメータにより識別された発呼子プロデューサ(例えば、プロデューサ1475)へリンクされる。親が以前に存在した場合には、ブロック2020の振舞いは、0以上の子プロデューサへマップできる引数が1つであるという意味で、アブソービングサブスクリプション依存性の振舞いと同様になる。
ブロック2015では、発呼親プロデューサは、現在被呼子プロデューサにリンクされる。図11Cに示す本発明の実施形態を参照すれば、テーブル2の発呼プロデューサ列からのパラメータにより識別された発呼親プロデューサは、図11Cのプロデューサグラフ(1つ又は複数)構造において、テーブル2の依存性決定プロデューサリファレンス列により識別された依存性決定プロデューサリファレンスを使用して、テーブル2の被呼プロデューサ列からのパラメータにより識別された被呼子プロデューサにリンクされる。ブロック2015及び2020から、制御は、フローがどこに入ったか(ブロック1605又は1630から)に基づいてブロック1640又は1675へ進む。
図21Aは、本発明の一実施形態によりプロデューサをオーバーライドするためのフローチャートである。図10を参照すれば、図21Aのフローは、オーバーライドプロデューサモジュール1045(又は図10に関する別の実施形態を参照して述べたように、オーバーライド及び非オーバーライドを取り扱うモジュール)により遂行される。
オーバーライドプロデューサコマンドに応答して(ブロック2110)、制御はブロック2120へ進む。ブロック2120では、オーバーライドプロデューサコマンドにより識別されたプロデューサに対して新プロデューサコマンドがインボークされ、制御はブロック2130へ進む。ブロック2120は、本発明の一実施形態では、オーバーライドされるべきプロデューサがまだインスタンス生成されていない場合、プロデューサを非実行とマークし(ブロック1640又は1680)そしてそれを実行スタートログにログする(ブロック1665)ように遂行される。まだインスタンス生成されていないプロデューサのオーバーライドを許さない本発明の別の実施形態では、ブロック1605と1610との間で付加的なチェックを行って、この新プロデューサコマンドがオーバーライドプロデューサコマンドに応答してコールされたかどうか決定し、そしてこの新プロデューサコマンドがオーバーライドプロデューサコマンドに応答してコールされた場合にはエラーを指示する。
ブロック2130では、プロデューサ出力キャッシュ(及びフィールドの場合にはインスタンス)における出力がセットされ、そしてプロデューサが、オーバーライドされたとしてマークされる。
図21Bは、本発明の一実施形態によりプロデューサ実行モードをオーバーライドするためのフローチャートである。図10を参照すれば、図21Bのフローは、パラレル化モジュール1076(又は図10に関する別の実施形態を参照して述べたように、パラレル化を取り扱うモジュール)により遂行される。
オーバーライド実行モードコマンドに応答して(ブロック2150)、制御はブロック2155へ進む。ブロック2155では、プロデューサグラフ構造1060においてプロデューサ実行モード設定がオーバーライドされる。
図21Cは、本発明の一実施形態によりプロデューサ実行モードをオーバーライドするためのフローチャートである。図10を参照すれば、図21Cのフローは、パラレル化モジュール1076(又は図10に関する別の実施形態を参照して述べたように、パラレル化を取り扱うモジュール)により遂行される。
ランタイム実行モード設定オーバーライドコマンドに応答して(ブロック2160)、制御はブロック2165へ進む。ブロック2165では、ランタイム設定構造1048においてプロデューサ実行モード設定がグローバルにオーバーライドされる。
図21Dは、本発明の一実施形態によりプロデューサ実行モードをオーバーライドするためのフローチャートである。図10を参照すれば、図21Cのフローは、パラレル化モジュール1076(又は図10に関する別の実施形態を参照して述べたように、パラレル化を取り扱うモジュール)により遂行される。
構成可能な実行モード判断構造オーバーライドプロデューサコマンドに応答して(ブロック2170)、制御はブロック2175へ進む。ブロック2175では、プロデューサ実行モード設定は、プロデューサベースの構成可能な判断構造において、クラスベース、メソッドベース、インスタンスベース、又はその組合せでグローバルにオーバーライドされる。
グローバルな実行コマンド
図22Aは、本発明の一実施形態により現在プロデューサグラフを実行するためのフローチャートの一部分であり、一方、図22Bは、本発明の一実施形態により現在プロデューサグラフを実行するためのフローチャートの別の部分である。図10を参照すれば、図22のフローは、プロデューサグラフ実行モジュール1070により遂行される。
グローバルな実行コマンドに応答して、ブロック2200は、候補プロデューサのセットが、実行スタートログにおけるプロデューサに基づいて実行されるべく選択されることを示し、制御はブロック2205へ進む。オーバーライドされたプロデューサが非実行とマークされ、それを実行すると、それらのオーバーライドされた結果が返送される(それらのメソッドを実行させるのではなく)本発明の一実施形態では、候補プロデューサの現在セットは、実行スタートログにおけるプロデューサである。オーバーライドされたプロデューサが非実行とマークされ、それを実行すると、それらのオーバーライドされた結果が返送される(それらのメソッドを実行させるのではなく)本発明の一実施形態を上述したが、別の実施形態は、異なる仕方で動作してもよい(例えば、オーバーライドされたプロデューサを実行とマークし、そして候補プロデューサの現在セットの選択時に、実行スタートログの独立プロデューサ及び実行スタートログにおけるオーバーライドされたプロデューサの親が選択される)。
ブロック2205では、実行の準備ができたプロデューサのサブセットが候補プロデューサのセットから選択され、そして制御はブロック2207へ進む。ブロック2205を遂行する例示的な仕方をここに説明する。
ブロック2207では、レディプロデューサの現在セットにおけるプロデューサは、パラレル化がイネーブルされた場合には、パラレル化と共に実行される。ブロック2207を遂行する例示的な仕方をここに説明する。制御は、ブロック2207からブロック2208へ進む。
ブロック2208では、サポートされる実行モードの結果タスク待ち行列の1つからタスクが読み取られ、取り出される。ここに示す例では、結果タスク待ち行列は、MP_RESULT_TASK_QUEUE、MT_RESULT_TASK_QUEUE、及びLOCAL_RESULT_TASK_QUEUEを含む。ブロック2208から、制御はブロック2209へ進む。
ブロック2209では、ランタイムは、プロデューサの後処理がスキップされたかどうか決定する。ベンチマーキングがイネーブルされた場合には、プロデューサは、ローカルで実行され且つマルチ処理される。従って、プロデューサの後処理は、ローカル実行の後にスキップされる。ベンチマーキングの詳細は以下に述べる。図22Aへ戻ると、後処理をスキップしなければならない場合には、制御は、図22Bのブロック2248へ進む。さもなければ、制御はブロック2210へ進む。
ブロック2210では、レディプロデューサの現在セットの中のプロデューサは、形式により分類され、標準プロデューサは、ブロック2220へ進み、そして依存性決定プロデューサは、ブロック2235へ進む。本発明の一実施形態では、ブロック2210は、プロデューサのリターンクラスをチェックすることにより遂行される。図10及び図11Dを参照すれば、メソッド追跡構造がアクセスされ、プロデューサの出力クラスがDEPであるかどうか決定し、従って、このプロデューサは、依存性決定プロデューサである。
ブロック2220では、これらの実行された標準プロデューサのいずれかにアブソービングサブスクリプションを有する親がもしあれば、サブスクリプションは、未完了とマークされる。図14Aを参照すれば、完了列1420の適切な行は、未完了を指示するようにセットされる。
ブロック2235では、発見されたプロデューサに対して新プロデューサコマンドが実行され、サブスクリプションに対してサブスクリプションログ及び処理が遂行され、次いで、制御はブロック2240へ進む。ブロック2235の新プロデューサコマンド部分は、ブロック1750と同様に遂行され、一方、サブスクリプションログ及び処理は、ブロック1740及び1745と同様に遂行される。
ブロック2240では、実行スタートログに新たに追加された候補プロデューサのセットに追加がなされる。ブロック2240から、制御はブロック2245へ進む。ブロック2240は、ブロック2235の結果として実行スタートログに新たに追加されたプロデューサのみが候補プロデューサのセットに追加されることを除いて、ブロック2200と同様に遂行される。
ブロック2245では、実行されたプロデューサが、実行されたとマークされ、プロデューサ出力キャッシング(及びインスタンスキャッシング)が、必要に応じて更新され、プロデューサメトリック(もし取得されれば)が、図10のプロデューサグラフ構造1060において更新され、実行されたプロデューサの親プロデューサが候補プロデューサの現在セットに追加され、そして実行されたプロデューサが候補及びレディプロデューサの現在セットから除去される。幾つかの実施形態では、プロデューサメトリックは、それに対応するタスクメトリック及びそれに対応するジョブリファレンスを読み取ることにより更新することができる。ジョブリファレンスを使用すると、ジョブメトリックは、ジョブメトリックマップから読み取ることができる。或いは又、プロデューサメトリックは、ジョブメトリックマップが使用されない場合にはタスクメトリック及びジョブメトリックを読み取ることにより更新することができる。タスクメトリック、ジョブメトリック、及びジョブメトリックマップの更なる詳細は、以下に述べる。ブロック2245から、制御はブロック2248へ進む。
ブロック2248では、結果タスク待ち行列がチェックされ、それらが全て空であるかどうか決定される。結果タスク待ち行列の少なくとも1つが空でない場合には、制御がブロック2208へ戻り、非空結果タスク待ち行列(1つ又は複数)における結果の処理が続けられる。さもなければ、結果タスク待ち行列の全てが空である場合には、制御はブロック2250へ進む。
ブロック2250では、レディプロデューサのセットが空であるかどうか決定される。もし空でなければ、制御がブロック2205へ戻り、さもなければ、制御はブロック2255へ進む。
ブロック2255では、全てのサブスクリプションが完了されたかどうか決定される。もしそうであれば、制御はブロック2265へ進み、そこで、フローが終了となるが、さもなければ、制御はブロック2260へ進む。図14Aにおける本発明の実施形態を参照すれば、未完了のアブソービングサブスクリプションに対してサブスクリプション形式列1405及び完了列1420がスキャンされる。
ブロック2260では、未完了のアブソービングサブスクリプションが処理され、制御がブロック2205へ戻る。ブロック2260を遂行する例示的な仕方について、以下に説明する。
図23は、本発明の一実施形態による図22のブロック2205のためのフローチャートである。従って、制御は、ブロック2200から、ブロック2205のブロック2305へ進む。ブロック2305では、候補プロデューサのセットにおける各プロデューサに対して、次のブロック2310−2325が遂行される。
ブロック2310では、プロデューサが、未完了のアブソービングサブスクリプション依存性を有するかどうか決定される。もしそうであれば、制御はブロック2325へ進み、さもなければ、制御はブロック2315へ進む。図14Aの実施形態を参照すれば、現在選択されたプロデューサ及びアブソービングサブスクリプション形式への一致に対してサブスクライバープロデューサキー列1400及びサブスクリプション形式列1405がスキャンされ、一致が見つかった場合には、適切な行における完了列1420がチェックされて、そのアブソービングサブスクリプション依存性の状態を決定する。
ブロック2315では、現在選択されたプロデューサが依存するところのプロデューサが実行されるかどうか決定される。実行されない場合には、制御がブロック2315へ進み、さもなければ、制御がブロック2320へ進む。図11Cに示す本発明の実施形態に関して、子依存性の行に対する増分的実行マーキング列1180がチェックされて、現在選択されたプロデューサの子の実行状態が決定される。
ブロック2320では、現在選択された候補プロデューサがレディプロデューサの現在セットに追加され、制御はブロック2325へ進む。
ブロック2325では、ブロック2305で選択された現在プロデューサに対してフローが終了となる。
図24は、本発明の一実施形態による図22のブロック2260のフローチャートである。従って、制御は、ブロック2255からブロック2260におけるブロック2505へ進む。ブロック2505では、未完了のアブソービングサブスクリプション依存性を伴う各プロデューサに対して、次のブロック2510−2525が遂行される。
ブロック2510では、全てのマッチングプロデューサが実行されたかどうか決定される。もしそうであれば、制御はブロック2515へ進み、さもなければ、制御はブロック2525へ進む。図11C及び14Aの実施形態を参照すれば、適切な行におけるマッチングプロデューサ列1415がアクセスされて、マッチングプロデューサが決定され、そして適切な行における増分的実行列1180が各マッチングプロデューサについてチェックされる。
ブロック2515では、アブソービングサブスクリプションが完了とマークされ、制御はブロック2520へ進む。図14Aの実施形態を参照すれば、適切な行における完了列1420が、完了を指示するようにセットされる。
ブロック2520では、ブロック2505で選択されたプロデューサが候補プロデューサの現在セットに追加され、そして制御はブロック2525へ進む。
ブロック2525では、ブロック2505で選択されたプロデューサについてフローが終了となる。
図25及び26は、本発明の一実施形態による図22のブロック2207のためのフローチャートである。従って、制御は、図25において、ブロック2205からブロック2610へ進む。ブロック2610では、マルチプロセッシング、マルチスレッディング及びローカル実行のための種々のタスク待ち行列、並びにマルチプロセッシングのためのジョブのインスタンス生成が遂行される。ブロック2610を遂行するための例示的な仕方は、以下で説明する。ブロック2610から、制御はブロック2620へ進む。
ブロック2620では、レディプロデューサのセットがスキャンされて、セット内のプロデューサが1つ1つ処理される。ブロック2620から、制御はブロック2622へ進む。
ブロック2622では、プロデューサの実行モードが、図11Cのグラフ構造のようなプロデューサグラフ構造から読み取られる。次いで、制御は、ブロック2625へ進む。
ブロック2625では、プロデューサ及びプロデューサの出力をリファレンスするタスクが生成される。ブロック2625から、制御はブロック2630へ進む。
ブロック2630では、どの実行モードでプロデューサを実行すべきか決定される。幾つかの実施形態では、3つの実行モード、即ちマルチプロセッシング、マルチスレッディング及びローカル実行がサポートされる。実行モードがローカル実行であると決定された場合には、制御はブロック2632へ進む。実行モードがマルチスレッディングであると決定された場合には、制御はブロック2634へ進む。実行モードがマルチプロセッシングであると決定された場合には、制御はブロック2635へ進む。
ブロック2632では、プロデューサのタスクが、ローカル実行のための実行タスク待ち行列、即ちLOCAL_EXECUTION_TASK_QUEUEへプッシュされる。次いで、制御はブロック2640へ進む。
ブロック2634では、プロデューサのタスクが、マルチスレッディングのための実行タスク待ち行列、即ちMT_EXECUTION_TASK_QUEUEへプッシュされる。次いで、制御はブロック2640へ進む。
ブロック2635では、プロデューサのタスクが、マルチプロセッシングのための実行タスク待ち行列、即ちMP_EXECUTION_TASK_QUEUEへプッシュされる。次いで、制御はブロック2636へ進む。ブロック2636では、遠隔実行とローカル実行との間のベンチマーキングが要求されたかどうか決定される。要求されない場合には、制御はブロック2640へ進む。しかしながら、ベンチマーキングが要求された場合には、制御はブロック2637へ進む。
ブロック2637では、MP_EXECUTION_TASK_QUEUEにプッシュされたタスクは、後実行処置をスキップするとマークされる。次いで、ブロック2638において、プロデューサ及びプロデューサの出力をリファレンスする新たなタスクが生成されて、ローカル実行のための実行タスク待ち行列、即ちLOCAL_EXECUTION_TASK_QUEUEにプッシュされる。次いで、制御は、ブロック2639へ進み、MP_EXECUTION_TASK_QUEUEに追加されたタスクに、後でマッチングをとるために、LOCAL_EXECUTION_TASK_QUEUEに追加されたタスクに対するリファレンスを記憶する。ブロック2639の後に、制御はブロック2640へ進む。
ブロック2640では、レディプロデューサのセットにおける全てのプロデューサがスキャンされたかどうか決定される。スキャンされていない場合には、制御がブロック2620へ進み、レディプロデューサのセットにおけるプロデューサのスキャンが続けられる。さもなければ、制御は、図26Bのブロック2642へ進む。
ブロック2642では、ランタイムは、MT_EXECUTION_TASK_QUEUEが空であるかどうか決定する。もしそうであれば、制御は2660へ進む。さもなければ、制御はブロック2644へ進む。
ブロック2644では、ランタイムは、スレッドプールメカニズムがまだ開始されていなければ、それを開始する。ブロック2644から、制御はブロック2650へ進む。
ブロック2650では、MT_EXECUTION_TASK_QUEUE内のタスクに対してマルチスレッディングを遂行するために個別のスレッドがインスタンス生成される。ブロック2650を遂行する例示的な仕方は、以下に説明する。ブロック2650から、制御はブロック2660へ進む。
ブロック2660では、MP_EXECUTION_TASK_QUEUE及びLOCAL_EXECUTION_TASK_QUEUE内のタスクを実行するために、マルチプロセッシング及びローカル実行が行われる。ブロック2660を遂行する例示的な仕方は、以下に説明する。ブロック2660から、制御はブロック2670へ進む。
ブロック2760では、MT_RESULT_TASK_QUEUEの現在サイズが、MT_EXECUTION_TASK_QUEUEの初期サイズに等しいかどうか決定される。等しくなければ、制御は、ブロック2670に留まる。というのは、マルチスレッディングがMT_EXECUTION_TASK_QUEUE内の全タスクについてまだ完了されていないからである。さもなければ、制御は、ブロック2670からブロック2690へ進み、そしてブロック2207のプロセスが終了となる。マルチスレッディング、マルチプロセッシング及びローカル実行は、上述した例示的フローでは、順次に遂行されるが、幾つかの別の実施形態では、マルチスレッディング、マルチプロセッシング及びローカル実行を任意の組合せでパラレルに遂行できることが明らかであろう。
図27A及び27Bは、本発明の一実施形態による図26のブロック2610のためのフローチャートである。従って、制御は、図27Aにおいて、ブロック2205からブロック2710へ進む。ブロック2710では、MT_RESULT_TASK_QUEUEがインスタンス生成されるかどうか決定される。そうであれば、ブロック2715において、MT_RESULT_TASK_QUEUEがクリアされる。さもなければ、ブロック2713において、MT_RESULT_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2713又はブロック2715からブロック2720へ進む。
ブロック2720では、MT_EXECUTION_TASK_QUEUEがインスタンス生成されるかどうか決定される。もしそうであれば、ブロック2725においてMT_EXECUTION_TASK_QUEUEがクリアされる。さもなければ、ブロック2723において、MT_EXECUTION_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2723又はブロック2725からブロック2730へ進む。
ブロック2730では、MP_RESULT_TASK_QUEUEがインスタンス生成されるかどうか決定される。もしそうであれば、ブロック2735において、MP_RESULT_TASK_QUEUEがクリアされる。さもなければ、ブロック2733において、MP_RESULT_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2733又はブロック2735からブロック2740へ進む。
ブロック2740では、MP_EXECUTION_TASK_QUEUEがインスタンス生成されるかどうか決定される。もしそうであれば、ブロック2745において、MP_EXECUTION_TASK_QUEUEがクリアされる。さもなければ、ブロック2743において、MP_EXECUTION_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2743又はブロック2745から、図27Bのブロック2750へ進む。
ブロック2750では、LOCAL_RESULT_TASK_QUEUEがインスタンス生成されるかどうか決定される。もしそうであれば、ブロック2755において、LOCAL_RESULT_TASK_QUEUEがクリアされる。さもなければ、ブロック2753において、LOCAL_RESULT_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2753又はブロック2755からブロック2760へ進む。
ブロック2760では、LOCAL_EXECUTION_TASK_QUEUEがインスタンス生成されたかどうか決定される。もしそうであれば、ブロック2765において、LOCAL_EXECUTION_TASK_QUEUEがクリアされる。さもなければ、ブロック2763において、LOCAL_EXECUTION_TASK_QUEUEがインスタンス生成される。次いで、制御は、ブロック2763又はブロック2765からブロック2620へ進む。
図28Aは、本発明の一実施形態によるマルチスレッディングを遂行するプロセスのためのフローチャートである。上述したように、マルチスレッディングを遂行するために、図26のブロック2650において個別のスレッドがインスタンス生成される。
ブロック2820では、MT_EXECUTION_TASK_QUEUEが空であるかどうか決定される。MT_EXECUTION_TASK_QUEUEが空であり、即ちMT_EXECUTION_TASK_QUEUE内の全タスクがそれに対応する実行スレッドに送られた場合には、プロセスが終了となる。さもなければ、即ち、実行スレッドへ送られるべき少なくとも1つのタスクがある場合には、制御がブロック2825へ進んで、プールに利用可能なスレッドがあるかどうか決定される。プールに使用可能なスレッドがない場合には、利用可能なスレッドがあるまで、制御はブロック2825に留まる。利用可能なスレッドがあるときには、制御はブロック2830へ進む。
ブロック2803では、MT_EXECUTION_TASK_QUEUEからタスクが取り出され、その取り出されたタスクが利用可能なスレッドへ送られる。次いで、制御は、ブロック2820へ戻されて、全てのタスクがMT_EXECUTION_TASK_QUEUEから取り出されるまで、ブロック2820、2825及び2830を繰り返す。ブロック2820、2825及び2830のプロセスは、フローの残り部分が詰まるのを回避するために、インスタンス生成されたスレッドによって遂行されてもよいことに注意されたい。
図28Bは、スレッド内のタスクの実行を任意のメトリック取得と共に示すフローチャートである。インスツルメンテーションが要求される場合には、ランタイムは、ブロック2810において、タスク実行時間の測定をスタートする。さもなければ、ブロック2810がスキップされる。ブロック2810から、制御はブロック2831へ進む。ブロック2831では、スレッド内のタスクは、適切なインスタンス及び入力でタスクのメソッドをコールすることにより実行される。タスクの実行が終了すると、出力及び/又は変更されたインスタンスがメソッドから返送され、そしてスレッドが終了となる。ブロック2831から、制御はブロック2815へ進む。インスツルメンテーションが要求される場合には、ランタイムは、ブロック2815において、タスク実行時間の測定を終了する。さもなければ、ブロック2815がスキップされる。
図28Cは、本発明の一実施形態によるスレッド終了コールバックに応答するプロセスのためのフローチャートである。ブロック2832において、スレッド終了コールバックが受け取られる。
ブロック2834では、終了したスレッド内のタスク及び取得したメトリック(タスク実行時間のような)の出力がもしあれば、それが、終了したスレッドにより実行されたタスクに記憶され、そしてタスクは、出力及び取得したメトリックがもしあれば、それと共に、MT_RESULT_TASK_QUEUEへプッシュされる。制御はブロック2836へ進む。ブロック2836では、終了したスレッドが、スレッドのプールで利用可能とマークされる。
図29A及び29Bは、本発明の一実施形態による図26のブロック2660のためのフローチャートである。従って、制御は、ブロック2650から、図29Aのブロック2910へ進む。インスツルメンテーションのために遂行されるが、プロデューサ実行のパラレル化を具現化するのに使用されないブロックは、図29A及び29Bにおいて、破断破線境界をもつブロックで示されることに注意されたい。
ブロック2910では、MP_EXECUTION_TASK_QUEUEが空であるかどうかチェックされる。MP_EXECUTION_TASK_QUEUEが空である場合には、マルチプロセッシングされるべきタスクはなく、従って、制御はブロック2670へ進む。さもなければ、制御はブロック2915へ進む。
ブロック2915では、ジョブがインスタンス生成され、そしてジョブ識別子(ID)がジョブに割り当てられる。更に、ブロック2915において、TASKS_LOCAL_MAPもインスタンス生成される。次いで、制御はブロック2918へ進む。インスツルメンテーションが要求される場合には、ブロック2918は、ジョブの全時間の測定をスターするように遂行される。さもなければ、ブロック2918がスキップされる。次いで、制御は、ブロック2920へ進む。
ブロック2920では、タスクが、MP_EXECUTION_TASK_QUEUEから読み取られ、取り出される。次いで、制御は、ブロック2921へ進む。インスツルメンテーションが要求される場合には、ブロック2921は、タスクの全時間の測定をスタートするように遂行される。さもなければ、ブロック2921がスキップされる。次いで、制御は、ブロック2923へ進む。
ブロック2923では、独特のタスク識別子(ID)がタスクに割り当てられ、そしてタスクリファレンスと共にTASKS_LOCAL_MAPに記憶される。次いで、制御はブロック2925へ進み、タスクシリアル化フォームをインスタンス生成すると共に、タスクシリアル化フォームを、タスクID、クラス名、及びタスクに対応するプロデューサのメソッド名で埋める。次いで、制御はブロック2930へ進む。
ブロック2930では、全入力プロデューサの各々及びその基礎となるインスタンスのシリアル化フォームが既に生成されていれば、それが見出される。或いは又、シリアル化フォームがまだ生成されていない場合には、ブロック2930において、それが生成される。ブロック2930を遂行する例示的な仕方をここに説明する。ブロック2930から、制御はブロック2960へ進む。
ブロック2960では、ジョブのシリアル化タスク実行待ち行列、即ちJOB.SERIALIZED_TASKS_EXECUTION_QUEUEにタスクシリアル化フォームが追加される。次いで、制御はブロック2965へ進む。
ブロック2965では、MP_EXECUTION_TASK_QUEUEが空であるかどうか決定される。MP_EXECUTION_TASK_QUEUEが空でない場合には、制御はブロック2920に戻り、MP_EXECUTION_TASK_QUEUE内の残りのタスクを進み続ける。さもなければ、制御はブロック2970へ進む。
ブロック2970では、ジョブが多数の遠隔プロセッサのグリッドへ送られる。プロセッサのグリッドは、ジョブを実行するための遠隔コンピューティングを遂行する。遠隔コンピューティングの1つの例示的なフローの詳細をここに述べる。次いで、制御はブロック2972へ進み、ローカル実行を行う。ブロック2972から、制御はブロック2973へ進む。
ブロック2973では、ジョブが終了したかどうか決定される。終了しない場合には、ジョブが終了するまで制御はブロック2973に留まる。ジョブが終了すると、制御は、図29Bのブロック2975へ進む。
図29Bを参照すれば、ブロック2975において、ジョブバーチャルローカル処理時間がゼロにセットされる。本発明の1つの態様によれば、ジョブバーチャルローカル処理時間は、ジョブの全タスクをローカルで実行するのに要する時間である。ブロック2975から、制御はブロック2977へ進む。
ブロック2977では、ジョブのシリアル化結果待ち行列、即ちJOB.SERIALIZED_TASKS_RESULT_QUEUEからタスクが読み取られ、取り出される。次いで、制御はブロック2979へ進み、TASKS_LOCAL_MAPに記憶されたタスクIDを使用してタスクリファレンスを見出す。次いで、制御はブロック2980へ進む。
インスツルメンテーションが要求された場合には、ブロック2980は、出力シリアル化フォームのサイズを決定し、そして出力のローカルデシリアル化時間の測定をスタートするように遂行される。さもなければ、ブロック2980は、スキップされ、制御はブロック2981へ進む。ブロック2981では、タスク出力における出力がデシアル化される。ブロック2981から、制御はブロック2982へ進む。この場合も、インスツルメンテーションが要求される場合には、ブロック2982は、ローカルデシリアル化時間の測定を終了するように遂行される。更に、インスツルメンテーションが要求される場合には、ブロック2984、2985、2987及び2989を遂行することができる。さもなければ、ブロック2984、2985、2987及び2989がスキップされ、制御はブロック2981からブロック2990へ進む。
ブロック2984では、ランタイムは、タスク全時間の測定を終了し、そしてタスク全時間からローカル実行時間を除去する。ブロック2984から、制御はブロック2985へ進む。
ブロック2985では、ベンチマーキングが要求されたかどうか決定される。ベンチマーキングが要求された場合には、制御はブロック2987へ進み、次いで、ブロック2989へ進む。さもなければ、制御は、2985から2989へ進み、ブロック2987をスキップする。
図25及び26を参照して上述したように、ベンチマーキングは、ローカル実行時間と遠隔実行時間とを比較することが要求される。従って、本発明の一実施形態によれば、ベンチマーキングが要求された場合に、マルチプロセッシングを使用してタスクがローカル及び遠隔の両方で実行される。従って、ベンチマーキングが要求された場合には、ランタイムは、ブロック2987において、LOCAL_RESULT_TASK_QUEUE内の対応タスクを見出すことができる。更に、ランタイムは、タスクに記憶されたローカル処理時間を、ジョブバーチャルローカル処理時間に加算することができる。従って、ジョブバーチャルローカル処理時間は、全てのタスクが実行されたときにジョブの全タスクのローカル処理時間の和に等しい。ブロック2987から、制御は、ブロック2989へ進む。
ブロック2989では、タスクの全時間のようなタスクメトリックが、ジョブIDと共に、タスクに追加される。次いで、制御はブロック2990へ進む。インスツルメンテーションが要求される場合には、両ブロック2987及び2989が遂行されることに注意されたい。さもなければ、両ブロック2987及び2989がスキップされてもよい。
ブロック2990では、タスクがMP_RESULT_TASK_QUEUEにプッシュされる。次いで、制御はブロック2991へ進む。ブロック2991では、JOB.SERIALIZED_TASKS_EXECUTION_QUEUEが空であるかどうか決定される。空でなければ、制御はブロック2977へ戻り、待ち行列からのタスクの読み取り及び出力のデシリアル化を継続する。さもなければ、インスツルメンテーションが要求された場合に、制御はブロック2992へ進む。インスツルメンテーションが要求されない場合には、制御は、ブロック2991から、図26Bのブロック2670へ進む。
インスツルメンテーションが要求される場合には、ブロック2992、2993、2995、2996及び2997を遂行することができる。さもなければ、ブロック2992、2993、2995、2996及び2997をスキップしてもよい。ブロック2992では、ジョブ全時間の測定が終了となり、次いで、ローカル実行時間がジョブ全時間から除去される。ブロック2992から、制御はブロック2993へ進む。
ブロック2993では、ベンチマーキングが要求されるかどうか決定される。ベンチマーキングが要求される場合には、制御はブロック2995へ進む。ブロック2995では、ジョブバーチャルローカル処理時間をジョブ全時間で除算することによりジョブスピードアップが計算される。次いで、制御はブロック2995からブロック2996へ進む。ブロック2996において、ジョブスピードアップを、グリッドにおけるジョブの実行に専用に利用可能なプロセッサの数で分割することにより、ジョブ効率が計算される。ブロック2996から、制御はブロック2997へ進む。さもなければ、ベンチマーキングが要求されない場合には、制御はブロック2993からブロック2997へ直接進む。
ブロック2997では、ジョブのメトリック(例えば、ジョブスピードアップ、ジョブ効率、ジョブ全時間、等)が、ジョブ内の各タスクに追加される。ブロック2997から、制御は、図26Bのブロック2670へ進む。
図30は、本発明の一実施形態による図29Aのブロック2930のためのフローチャートである。従って、制御は、ブロック2925から、図30のブロック3010へ進む。ブロック3010では、入力プロデューサ又はその基礎となるインスタンスのシリアル化フォームが、入力プロデューサキー又はその基礎となるインスタンスキーに基づき、SERIALIZED_FORM_LOCAL_MAPにおいて既に生成されたかどうか決定される。シリアル化フォームが既に生成された場合には、制御はブロック3015へ進む。さもなければ、制御は、ブロック3020へ進む。
ブロック3015では、シリアル化フォームID及びシリアル化フォームがSERIALIZED_FORM_LOCAL_MAPから読み取られる。次いで、制御はブロック3040へ進む。
ブロック3020では、シリアル化フォーム識別子が、入力プロデューサ又はその基礎となるインスタンスに割り当てられる。次いで、制御はブロック3022へ進む。
ブロック3022では、ローカルシリアル化時間の測定がスタートされる。次いで、制御はブロック3024へ進む。
ブロック3024では、入力プロデューサ又はその基礎となるインスタンスに対してシリアル化フォームが生成される。次いで、制御はブロック3026へ進む。
ブロック3026では、ローカルシリアル化時間の測定が終了される。次いで、制御はブロック3028へ進む。
ブロック3028では、入力シリアル化フォームサイズが決定される。次いで、制御はブロック3030へ進む。
ブロック3030では、入力プロデューサキー又はその基礎となるインスタンスキー、シリアル化フォームID、及びシリアル化フォームが、SERIALIZED_FORM_LOCAL_MAPに記憶される。このSERIALIZED_FORM_LOCAL_MAPは、メモリ要件、性能要件、等の種々のファクタに基づいて、グローバルなものでもよいし、或いはジョブごとに割り当てられ解放されるものでもよい。次いで、制御はブロック3034へ進む。
ブロック3034では、入力シリアル化フォームサイズ及びシリアル化時間が、シリアル化フォームIDと共に、SERIALIZED_FORM_LOCAL_MAPに記憶される。次いで、制御はブロック3040へ進む。上述したブロック3022、3026、3028及び3034は、インスツルメンテーションが要求された場合に遂行される。ブロック3022、3026、3028及び3034は、インスツルメンテーションが要求されない場合には、スキップされてもよい。
ブロック3040では、シリアル化フォームIDがJOB.SERIALIZED_FORM_MAPにあるかどうか決定される。もしそうであれば、次いで、制御はブロック3045へ進む。さもなければ、制御はブロック3043へ進む。
ブロック3043では、シリアル化フォームID及びシリアル化フォームがJOB.SERIALIZED_FORM_MAPに記憶される。次いで、制御はブロック3045へ進む。
ブロック3045では、シリアル化フォームIDが、入力として又はその基礎となるインスタンスとして、タスクシリアル化フォームに追加される。ブロック3045から、制御はブロック3050へ進む。
ブロック3050では、まだ処理されていない入力プロデューサが更にあるか又はその基礎となるインスタンスでまだ処理されていなものがあるかどうか決定される。もしそうであれば、次いで、制御はブロック3010へ進む。さもなければ、制御は、図29Aのブロック2960へ進む。
図31A及び31Bは、本発明の一実施形態によるマルチプロセッシングのための遠隔コンピューティングのフローチャートである。この場合も、破断破線で示されたブロックは、インスツルメンテーションが要求される場合に遂行され、そしてインスツルメンテーションが要求されない場合にはスキップされてもよい。上述したように、プロデューサに対応する多数のタスクを含むジョブは、実行のためにプロセッサのグリッドへディスパッチされる。ワーカーとも称されるグリッド内の各プロセッサは、JOB_SERIALIZED FORMS_MAPをキャッシュ記憶することができる。例えば、1つのジョブが数千のタスクを保持し、そして10個のワーカーがそれらタスクを実行する場合には、JOB_SERIALIZED FORMS_MAPがグリッドディスパッチャーにより各ワーカーへ一度送信され、そしてワーカーレベルにおいてキャッシュ記憶される。ジョブが終了したときには、グリッドディスパッチャーが、キャッシュを解放するためのコマンドをワーカーへ送信する。フローは、ブロック3108においてスタートする。
ブロック3108では、JOB_SERIALIZED FORMS_MAPが、入力ID、クラス名及びメソッド名を保持するタスクシリアル化フォームと共に、グリッドディスパッチャーから受け取られる。次いで、制御はブロック3110へ進む。ブロック3110では、クラス名を使用してクラスが探索され、そしてメソッド名を使用してメソッドが探索される。クラス及びメソッドは、タスクを再構成するようにロードされる。次いで、制御はブロック3112へ進む。
ブロック3112では、タスク入力ID又はインスタンスIDがJOB.SERIALIZED_FORM_MAPからルックアップされる。次いで、制御はブロック3120へ進む。
ブロック3120では、入力IDが見つかったかどうか決定される。見つからない場合には、制御がブロック3190へ進み、エラーを返送する。さもなければ、制御はブロック3130へ進む。
ブロック3130では、入力IDに対応するJOB.SERIALIZED_FORMS_MAPエントリーが既にデシリアル化されたかどうか決定される。既にデシリアル化された場合には、次いで、制御はブロック3150へ進む。さもなければ、制御はブロック3132へ進む。
ブロック3150では、入力のデシリアル化フォームが抽出される。次いで、制御はブロック3155へ進む。
ブロック3132では、遠隔デシリアル化時間の測定がスタートされる。次いで、制御はブロック3134へ進み、入力IDに対応するJOB.SERIALIZED_FORMS_MAPをデシリアル化する。ブロック3134から、制御はブロック3136へ進む。ブロック3136では、遠隔デシリアル化時間の測定が終了される。次いで、制御はブロック3138へ進む。
ブロック3138では、JOB.SERIALIZED_FORMS_MAPにおける対応エントリーが、デシリアル化フォームでエンリッチされる。次いで、制御はブロック3143へ進む。
ブロック3143では、インスタンス又は標準的入力がタスク定義に追加される。次いで、制御はブロック3155へ進む。
ブロック3155では、全ての入力ID(即ち、基礎となるインスタンスを伴う全ての標準的入力)が処理されたかどうか決定される。換言すれば、タスクが完全に再構成又はデシリアル化されたかどうか決定される。もしそうであれば、制御は、図31Bのブロック3160へ進む。さもなければ、制御は、ブロック3112へ戻り、次の入力IDを処理する。
図31Bを参照すれば、遠隔処理時間の測定がブロック3160においてスタートされる。次いで、制御はブロック3162へ進む。
ブロック3162では、適切なインスタンス及び入力を伴うメソッドがコールされる。実行の結果として、メソッドは、出力を返送し及び/又はメソッドのインスタンスを変更する。ランタイムは、メソッドから返送された出力及び/又は変更されたインスタンスを受け取る。制御は、ブロック3162からブロック3166へ進む。
ブロック3166では、遠隔処理時間の測定が終了される。次いで、制御はブロック3170へ進む。
ブロック3170では、遠隔シリアル化時間の測定がスタートされる。次いで、制御はブロック3172へ進み、返送された出力及び/又は変更されたインスタンスをシリアル化すると共に、シリアル化された出力及び/又はシリアル化され変更されたインスタンスをタスクへアタッチする。次いで、制御はブロック3174へ進む。ブロック3174では、遠隔シリアル化時間の測定が終了される。ブロック3174から、制御はブロック3176へ進む。
ブロック3176では、メトリック(例えば、遠隔シリアル化時間、遠隔デシリアル化時間、等)がタスクに記憶される。次いで制御はブロック3180へ進む。
ブロック3180では、タスクがランタイムのグリッドディスパッチャーへ返送され、フローが終了となる。ここでも、破断破線で示されたブロックは、インスツルメンテーションが要求された場合に遂行され、そしてインスツルメンテーションが要求されない場合にはスキップされる。
図32は、本発明の一実施形態による図29Aのブロック2972のためのフローチャートである。従って、制御は、ブロック2970から図32のブロック3202へ進む。ここでも、破断破線で示されたブロックは、インスツルメンテーションが要求された場合に遂行され、そしてインスツルメンテーションが要求されない場合にはスキップされる。
ブロック3202では、ローカル実行時間の測定がスタートされる。次いで、制御はブロック3210へ進む。
ブロック3210では、タスクが、LOCAL_EXECUTION_TASK_QUEUEから取り出され、そして適切なインスタンス及び入力でメソッドをコールすることによりローカルで実行される。実行が終了すると、メソッドは、メソッドの出力及び/又は変更されたインスタンスを返送する。次いで、制御はブロック3212へ進む。
ブロック3212では、ローカル実行時間の測定が終了される。次いで、制御はブロック3220へ進む。
ブロック3220では、タスクの出力がタスクに記憶される。次いで、制御はブロック3223へ進む。
ブロック3223では、メトリック(例えば、ローカル実行時間)がタスクにも記憶される。次いで、制御はブロック3230へ進む。
ブロック3230では、タスクが、LOCAL_RESULT_TASK_QUEUEへプッシュされる。ブロック3230から、制御はブロック3240へ進む。
ブロック3240では、LOCAL_EXECUTION_TASK_QUEUEが空であるかどうか決定される。待ち行列が空である場合には、制御は、図29Aのブロック2973へ進む。さもなければ、制御はブロック3202へ戻り、別のタスクをローカルで実行するようにプロセスを繰り返す。
別の実施形態
添付図面のフローチャートは、本発明の実施形態によって遂行されるオペレーションの特定の順序を示しているが、このような順序は、例示に過ぎない(例えば、別の実施形態では、オペレーションを異なる順序で遂行し、あるオペレーションを結合し、あるオペレーションを重畳し、等々も行える)ことを理解されたい。
本発明を多数の実施形態について説明したが、当業者であれば、本発明は、ここに述べる実施形態に限定されず、特許請求の範囲の精神及び範囲内で変更及び修正を伴って実施できることが明らかであろう。従って、この説明は、限定のためではなく例示のためのものと考えるべきである。