以下の説明において、本発明をより完全に理解するために、ロジックの具現化、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、及びメソッド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つ以上のグラフのセットを自動的に発生し(発見し、構築し、そして任意であるが、解明し)、これらグラフは、マルチレベルのものであり、且つ関心があると指示されたプロデューサの所与のセットから、プロデューサ依存性宣言に基づくソースプロデューサまで種々の形状(例えば、チェーン、ツリー)のものでよく、そして2)グラフのセットのプロデューサの実行をシーケンスして、関心があると指示されたプロデューサの所与のセットの出力(1つ又は複数)を発生する。従って、ランタイムは、プロデューサ依存性宣言を使用して、どんな引数を伴うどんなメソッドをどんなインスタンスに対して同期のためにいつ実行すべきか決定する。
従って、プロデューサ依存性は、ランタイムに対するプロデューサの実行のシーケンスを表す。しかしながら、実行のシーケンスを指示するのに加えて、プロデューサ依存性は、本発明の異なる実施形態では、異なる入力対出力関係を表すことができる。例えば、本発明の異なる実施形態は、引数プロデューサ依存性、フィールドプロデューサ依存性、及びシーケンスのみのプロデューサ依存性の1つ以上をサポートすることができる(シーケンスのみのプロデューサ依存性は、ここでは、ショートハンドシーケンスプロデューサ依存性と称される)。引数プロデューサ依存性、フィールドプロデューサ依存性、及びシーケンスプロデューサ依存性の各々は、プロデューサ間の実行シーケンス関係を表すが、引数及びフィールドのプロデューサ依存性は、更に、ランタイムが気付くデータも表わす。より詳細には、引数プロデューサ依存性は、ランタイムが子プロデューサの出力を親プロデューサに対する入力パラメータとしてマップするようにさせ、一方、フィールドプロデューサ依存性は、インスタンスのフィールドの使用を指示する。プロデューサ依存性によって表わされる入力対出力関係には関わりなく、プロデューサ依存性の適切な使用は、プロデューサアクセス情報が、その情報にインパクトを与えるプロデューサの後にシーケンスされるように保証する。
シーケンス依存性は、ランタイムが気付かない仕方でデータを変更するプロデューサと、そのデータを消費するプロデューサとの間で実行順序を保証することを含めて、種々の目的に使用される(子プロデューサは、その出力にアクセスするためのコードを含むことを親プロデューサのメソッドに要求する仕方でその出力を書く(例えば、普通のプロデューサ出力でない、従って、ランタイムにより検出されない出力に影響することにより環境にインパクトを及ぼすメソッド、例えば、グローバル変数をセットし、プロデューサ出力でないインスタンスにおけるフィールドをセットし、外部データソースにインパクトを及ぼす、等のメソッド))。従って、シーケンス依存性は、子プロデューサに対する親プロデューサの依存性を反映するが、コードの書き込みを通して一方から他方へ与える必要のある出力を要求する(例えば、所与のメカニズムに出力を書き込むための子プロデューサのメソッドにおけるコード(例えば、グローバル変数をセットし、外部データソースにインパクトを及ぼし、プロデューサ出力でないインスタンスのフィールドをセットし、等々)、及び所与のメカニズムからその出力を読み取るための親プロデューサのメソッドにおけるコード)。このように、シーケンス依存性は、ランタイムで検出できない出力に依存する親プロデューサの実行をランタイムが同期させられるようにする。ソース(例えば、グローバルな変数又は外部データソース)に影響を与えてもランタイムがそれに気付かずそれらソースから読み取りすることは、シナリオ能力が要求されるプロデューサにおいて回避されねばならない特徴である。
本発明の一実施形態では、所与のメソッドに対するプロデューサ依存性宣言は、プロデューサに対する直接的な依存性(例えば、直接的子孫(子供)、これとは対照的に間接的子孫(孫、曾孫、等)がある))のみを識別する。このような実施形態では、各プロデューサ依存性宣言は、所与のメソッドからインスタンス生成されたプロデューサにより出力を直接使用できるプロデューサの単一段又は層のみを与え、プロデューサグラフ(1つ又は複数)の付加的な層の発見/構築/解明は、他のプロデューサ依存性宣言のランタイムプロセッシングに託される。
例示的キー
プロデューサは、複数の識別子のセットとして見ることができ、指定の粒度の付加的なレベルごとに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つ又は複数)は、プロデューサグラフ(1つ又は複数)構造380に記憶される。本発明の実施形態は、プロデューサグラフ(1つ又は複数)をグラフの集合として記憶するが、本発明の他の実施形態では、(グラフの集合ではなく)グラフ(1つ又は複数)を形成するように互いにリンクされてプロデューサグラフの合併及び分割を容易にするプロデューサの集合としてプロデューサグラフ(1つ又は複数)を記憶し操作することもできる。例えば、これに限定されないが、プロデューサの集合としてプロデューサグラフ(1つ又は複数)を記憶し操作する本発明の実施形態をここに説明する。
プロデューサグラフ実行モジュール345は、自動プロデューサグラフ発生モジュール340からの現在プロデューサグラフ(1つ又は複数)及びソースプロデューサ330の出力を受け取り、そして現在プロデューサグラフ(1つ又は複数)のプロデューサを実行して、問題とする現在選択されたプロデューサの現在出力を決定する。プロデューサグラフ実行モジュール345は、プロデューサ出力キャッシング384により示されたようにプロデューサグラフ構造380にプロデューサの現在出力をキャッシュ記憶する。
実行中にプロデューサグラフのプロデューサ出力をキャッシュ記憶することで同期をとることができる。例えば、複数の子プロデューサに依存する親プロデューサを実行する適切な時間は、複数の子プロデューサが全て実行された後であり、換言すれば、子プロデューサの1つが実行を完了するたびに親プロデューサを実行するのは無駄である(あるケースでは、不可能である)。プロデューサ出力をキャッシュ記憶することは、親プロデューサの実行を、全ての子プロデューサが実行されてしまうまで延期できるだけでなく、親プロデューサを実行するための適切な時間、即ち全ての子プロデューサが実行されてそれらの出力がキャッシュ記憶されるとき、を決定できるようにする。従って、ランタイムは、子プロデューサの実行状態をチェックすることによりプログラマーに対してこの同期判断を行い、換言すれば、このような同期が自動化される(プログラマーは、インスタンスを識別して、そのインスタンスに対してそのインスタンスに関連した所与のメソッドを実行するための適切な時間を決定する個別のソースコードを含ませる必要がない)。別の例として、複数の親プロデューサが同じ子プロデューサ及び他の異なる子プロデューサに依存する場合には、複数の親プロデューサの各々を実行するための適切な時間が典型的に異なり、ランタイムは、子プロデューサのセットの出力の利用性に基づいて複数の親プロデューサの各々を実行するための適切な時間を自動的に決定する。
以下に詳細に述べるように、プロデューサグラフのある部分は、ダイナミックなプロデューサ依存性のために現在発見できないことがあるので、自動プロデューサグラフ発生モジュール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のプロデューサグラフは、データがグラフを上るようにあるプロデューサから別のプロデューサへ流れる方向に駆動されるデータであることに注意する価値がある。
従って、プロデューサ依存性宣言320は、発生されると考えられるプロデューサグラフの境界を定め、一方、問題とするプロデューサの現在選択セット325は、発生されるべき現在プロデューサグラフの開始ノード(1つ又は複数)を識別する。これらの2つから、自動プロデューサグラフ発生モジュール340がプロデューサグラフを発見して構築する。発見及び構築は、自動プロデューサグラフ発生モジュール340に、プロデューサグラフ(例えば、プログラマーにより手動で識別される必要がない)も、プロデューサグラフ内のプロデューサのリストも与えられないという点で、自動的である。むしろ、自動プロデューサグラフ発生モジュール340は、問題とするプロデューサの現在選択セットのプロデューサ依存性宣言(1つ又は複数)を構文解析して、それらの子プロデューサ(及び上方宣言依存性をサポートする本発明の幾つかの実施形態では、親プロデューサ)を発見し、次いで、それらの発見されたプロデューサのプロデューサ依存性宣言を構文解析し、等々で、ソースプロデューサまで行う(以下に述べる本発明のある実施形態では、これは、プロデューサグラフ実行モジュール345の助けで行われてもよい)。プロデューサグラフがツリーである場合には、問題とする現在選択されたプロデューサが典型的に根(root)ノードであり、プロデューサ依存性宣言は、葉(leaf)ノード(ソースプロデューサ)が発見されるまで構文解析される。
オーバーライドされたプロデューサ及び増分的実行
図3Bは、本発明の一実施形態により、増分的実行及びオーバーライドされたプロデューサ出力もサポートするプロデューサグラフ指向のプログラミングサポートを伴うランタイムを示すブロック図である。増分的実行及びオーバーライドされたプロデューサ出力は、各々、独立した任意の特徴であり、従って、本発明の異なる実施形態では、一方を具現化してもよいし、両方を具現化してもよいことを理解されたい。
図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つ又は複数)は、プロデューサグラフ(1つ又は複数)構造380に記憶される。
プロデューサグラフ実行モジュール345と同様に、プロデューサグラフ実行モジュール370は、自動グラフモジュール365からの現在プロデューサグラフ及びソースプロデューサ350の出力を受け取り、そして現在プロデューサグラフのプロデューサを実行して、問題とする現在選択されたプロデューサの現在出力を決定する。プロデューサグラフ実行モジュール370は、プロデューサ出力キャッシング384により示されたように、プロデューサグラフ構造380にプロデューサの現在出力をキャッシュ記憶する。
上述したように、実行中にプロデューサ出力をキャッシュ記憶することで同期をとることができる(例えば、図4Bのプロデューサ2をいつ実行すべきか決定するために個別のソースコードを書き込む必要がなく、むしろ、ランタイムは、プロデューサ出力キャッシング384において必要な出力が利用できることをチェックすることによりプログラマーに対してこの同期判断を実行し、換言すれば、このような同期が自動化される)。更に、このプロデューサ出力キャッシング384は、増分的実行に使用される。より詳細には、プロデューサグラフが最初に発生されて実行された後に、現在プロデューサグラフにおけるプロデューサをオーバーライドするのに、ある程度の再実行レベルが要求される。本発明のある実施形態は、グラフ全体を単純に再実行するが、本発明の別の実施形態は、増分的実行をサポートする(オーバーライドにより影響されるプロデューサグラフの部分のみを再実行する)。増分的実行をサポートするある例示的実施形態は、どのプロデューサが再実行を要求するか決定する上で助けとなるように、プロデューサグラフ(1つ又は複数)構造380に増分的実行マーキング382を使用する。従って、プロデューサグラフ(1つ又は複数)を維持することは、複数の実行にわたって必要に応じてプロデューサグラフ(1つ又は複数)のリンクを変更して、それらを現在状態(最新状態)に保持することを指し、一方、増分的実行は、プロデューサグラフ(1つ又は複数)を維持し、且つ現在(最新)プロデューサグラフを使用して、オーバーライドにより影響されるプロデューサグラフ(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つの経路を間に伴う独立プロデューサと、オーバーライドされたプロデューサを含まない根プロデューサと、オーバーライドされたプロデューサとの組合せより成るソースプロデューサのサブセットから;或いはオーバーライドされた子孫を伴わないオーバーライドされたプロデューサと、少なくとも1つの経路を間に伴う独立プロデューサと、オーバーライドされたプロデューサを含まない根プロデューサとの組合せより成るソースプロデューサのサブセットから;実行をスタートすることができ、更に、オーバーライドされたプロデューサの下でのプロデューサグラフが、そのようなプロデューサが非オーバーライドである場合及び非オーバーライドにされるまで構築されないような本発明の実施形態では、終了ノード(独立プロデューサ及び/又はオーバーライドされたプロデューサである)から実行をスタートすることができ、等々である)。
プロデューサグラフのその後の実行に対して、異なる実施形態は、異なるプロデューサからスタートすることができる(例えば、プロデューサグラフの独立プロデューサから(例えば、増分的実行をサポートしない本発明の実施形態において);プロデューサグラフのソースプロデューサから(例えば、増分的実行をサポートしない本発明の実施形態において);最後の実行以来オーバーライドされ及び/又は追加されたソースプロデューサより成るソースプロデューサのサブセットから(例えば、増分的実行をサポートする本発明の実施形態において);最後の実行以来オーバーライドされ及び/又は追加されたソースプロデューサのうち、オーバーライドされた子孫を伴わないオーバーライドされたプロデューサと、少なくとも1つの経路を間に伴う追加されたプロデューサと、オーバーライドされたプロデューサを含まない根プロデューサとの組合せから(例えば、増分的実行をサポートする本発明の実施形態において);等)。例えば、これに限定されないが、次のことを遂行する本発明の実施形態について以下に述べる。1)このようなプロデューサが非オーバーライドにされる場合及びそれまで、オーバーライドされたプロデューサのもとでプロデューサグラフを構築せず;2)プロデューサグラフの初期実行に対してエンドノード(これは、独立プロデューサ及び/又はオーバーライドされたプロデューサでよい)の実行をスタートし;3)増分的実行を具現化し;及び4)プロデューサグラフのその後の実行に対して、最後の実行以来オーバーライド及び/又は追加されたソースプロデューサより成るソースプロデューサのサブセットから実行をスタートする。
実行スタートプロデューサの前記概念に関して、プロデューサグラフの実行の処理フローも、異なる実施形態の間で相違する。例えば、本発明の一実施形態では、実行スタートプロデューサの祖先が決定されて集合に入れられ、実行スタートプロデューサが実行され、そして全ての依存性が実行されたところのプロデューサに対して集合が繰り返しスキャンされ、最終的には、根ノードに到達する。別の例として、本発明の一実施形態では、実行スタートプロデューサが実行され、実行スタートプロデューサの親が識別され、それらの親が実行され、そしてそれらの親が識別されて実行され、等々となる。本発明の後者の実施形態を、一例として、非限定的に、以下に使用する。
依存性の例示的形式
例示的なダイナミックプロデューサ依存性
ダイナミックプロデューサ依存性は、ランタイム中に変化するプロデューサ依存性である。プロデューサ依存性を解明するための基準は、ソースコードに存在し、従って、プロデューサ依存性を解明できるプロデューサが制限される。図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が独立プロデューサであることを示している。
図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は、ルード(rood)ノードプロデューサ1を含み、レベル2は、プロデューサ2及びプロデューサ3を含み、レベル3は、プロデューサ4及びプロデューサ5を含み、レベル4は、プロデューサ6及びプロデューサ7Aを含む(図5Cでは、レベル4は、プロデューサ7Bを含み、そしてレベル5は、プロデューサ8を含む)。プロデューサ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)、この変化の結果、第3プロデューサグラフは、残されている第2プロデューサグラフのサブセットとなり、且つ第2プロデューサグラフは、第1プロデューサグラフのサブセットとなる。上述したように、本発明の実施形態は、プロデューサグラフ(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は、ArgumentDependency 1に関連したプロデューサ依存性宣言コード715も含む。ランタイム中に、ランタイムは、プロデューサ依存性宣言ステートメント705のArgumentDependency 1に応答してプロデューサ依存性宣言コード715にアクセスして実行する。プロデューサ依存性宣言コード715の実行は、プロデューサ725をArgumentDependency 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、及び必要なグラフィックユーザインターフェイス824D(822には含まれず)を含む。プロデューサ依存性宣言は、クラスのインスタンスが生成された後ではなく、ビジネスロジックを含むクラスの定義中に、プロデューサ間の連結を定義するのに使用される。オブジェクト指向のソースコード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を各々備え、一方、矢印付きの実線は、ランタイムクライアント1002の論理的実行フローのブロック1035から、プロデューサグラフ指向のサポートを伴うランタイム1004のブロック1070への直接的因果関係を表し、矢印付き点線は、ランタイムクライアント1002のブロック1010、1020、1025及び1030から、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004のブロック1095、1098、1040及び1045への因果関係を示している。本発明の実施形態に基づき、これら後者の因果関係は、直接的でも、間接的でもよい。例えば、図6と同様に、コマンドログ(図示せず)及び/又はオーバーライドログ1047の使用による任意の間接的因果関係を使用してもよい。更に、ブロック1095及び1098は、本発明の実施形態に基づき異なるブロックの一部分であるのも任意であるから、破線にされている(例えば、ブロック1095は、ブロック1098の一部分でよく、ブロック1098は、ブロック1040の一部分でよく、ブロック1095及び1098は、ブロック1040の一部分でよい)。同様に、ブロック1045は、本発明の実施形態に基づき異なるブロックの一部分であるのも任意であるから、破線にされている(例えば、ブロック1045は、ブロック1070の一部分でもよい)。
図10において、ランタイム1002は、ビジネスロジックを含むクラス定義1010を備え、これは、データ1012、メソッド1014、プロデューサ依存性宣言1016、及び任意のクラスキー1090を有する。クラス定義1010は、オブジェクト指向のプログラミング言語のクラスであり、従って、データ及びメソッド1014に対する定義を含む。更に、これらのクラス定義1010は、上述したように、メソッド1014に対するプロデューサ依存性宣言1016を含む。更に、本発明の一実施形態では、各クラスは、追跡のためのクラスキー1090を有する。
ランタイム1004の新クラスモジュール1095は、クラス定義1010をロードし、イントロスペクトする(例えば、新クラスコマンドに応答して)。このようにロードしてイントロスペクトすることは、最適化の目的でクラスを選択的にロードするためのものを含めて、多数の良く知られた技術又は将来開発される技術を使用して行うことができる。新クラスモジュール1095によりクラスをロードすることは、ランタイム1004のクラス1054で示されている。クラス1054をロードしてイントロスペクトする一部分として、新クラスモジュール1095は、クラス1054におけるメソッド及びプロデューサ依存性宣言1056により示されたように、プロデューサ依存性宣言1016もロードし、イントロスペクトする。又、新クラスモジュール1095は、クラスキーを使用してクラスを追跡するのに使用されるクラス追跡構造1092も維持する。従って、クラス追跡構造1092は、クラスキーとクラス1054へのリファレンスとの間の対応性を維持する。更に、新クラスモジュール1095は、メソッドキーを使用してメソッドを追跡するのに使用されるメソッド追跡構造1058も維持する。従って、メソッド追跡構造1058は、メソッドキーとメソッドへのリファレンスとの間の対応性、並びにプロデューサ依存性宣言に関する情報を維持する。
又、ランタイムクライアント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)適切なプロデューサ依存性宣言ステートメントにアクセスするために、メソッドキーを使用してメソッド追跡構造にアクセスする。プロデューサキーを伴うプロデューサインスタンス生成コマンドにより指定されたプロデューサをインスタンス生成し、発見されたプロデューサをインスタンス生成し、そしてプロデューサグラフを構築することが、ランタイム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は、グローバル実行コマンド1035を含む。ランタイム1004のプロデューサグラフ実行モジュール1070は、プロデューサグラフ(1つ又は複数)を実行する。従って、プロデューサグラフ実行モジュール1070は、プロデューサ出力キャッシング1097を変更し(プロパティプロデューサ及びメソッドプロデューサの場合に)、増分的実行マーキング1080(もしあれば)を使用し、そしてインスタンス1052のデータを変更する(プロパティメソッドの場合に)。 プロデューサグラフのプロデューサを実行するための種々の技術が、上述され、ここに適用することきる。例えば、コマンドログが具現化される実施形態では、コマンドログが消費され、次いで、プロデューサグラフ(1つ又は複数)が実行される。更に、未解明の依存性の可能性をサポートする本発明の実施形態では、プロデューサグラフ実行モジュール1070は、ダイナミック依存性モジュール1075を含み、これは、自動プロデューサグラフ発生モジュール1040をインボークすることができる。
又、図10は、プログラマー/ユーザが、プロデューサグラフ(1つ又は複数)構造のプロデューサグラフ(1つ又は複数)及びプロデューサ出力を見ることができるようにするメカニズム(例えば、グラフィックユーザインターフェイス)を与える任意のプロデューサグラフビューアモジュール1062も示している。更に、図10は、構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール840を表すグラフィックユーザインターフェイス(ブロック1030及び1035のダイナミックインボケーションを含む)を与えるための任意の構成可能なインタラクティブなプロデューサ出力レイアウトグラフィックユーザインターフェイスモジュール1085も示している。
コマンドログを使用する本発明の実施形態では、異なるトリガーを使用して、異なるアクションをトリガーすることができる。例えば、プロデューサインスタンス生成コマンドは、明示的コマンド(ロギング開始及びロギング終了)、明示的グローバル実行コマンド(スタート時及び各明示的グローバル実行コマンドの後にロギングが自動的にスタートし、そしてそれに続く明示的グローバル実行コマンドに応答して各ログが処理される)、明示的データ準備コマンド、等に応答して、ログされ、バッチ処理される。同様に、データ準備コマンドは、明示的グローバル実行コマンド、第1ゲットコマンド、各ゲットコマンド、等に応答して、ログされ、バッチ処理される。
例示的追跡構造
図11A−Dは、本発明の一実施形態による図10のデータ構造の例示的コンテンツを示すブロック図である。図11A−Dは、これらのデータ構造をテーブルとして示すが、適当なデータ構造(例えば、ハッシュマップ、セット、リスト)を使用できることを理解されたい。
図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も含む。
図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の例示的なコンテンツは、以下で述べる。
ダイナミックプロデューサ依存性
上述したように、本発明の一実施形態は、非ダイナミック及びダイナミックプロデューサ依存性をサポートする。異なる実施形態は、異なる形式のダイナミックプロデューサ依存性をサポートするが、本発明の一実施形態は、コンティンジェント及びサブスクリプション形式のダイナミックプロデューサ依存性をサポートする。従って、非コンティンジェント、非サブスクリプション依存性は、非ダイナミック(スタティック)依存性である。
図12は、本発明の一実施形態によりコンティンジェント及びサブスクリプション形式のダイナミックプロデューサ依存性をサポートするための図10の付加的な細部を示すブロック図である。図12は、図10から、破線の分割線1000、ビジネスロジックを含むクラス定義1010(これは、データ1012、メソッド1014、及びプロデューサ依存性宣言1016を含む)、新クラスモジュール1095、クラス1054(メソッド及びプロデューサ依存性宣言1056を含む)、新インスタンスモジュール1098、インスタンス1052、インスタンス追跡構造1065、自動プロデューサグラフ発生モジュール1040、プロデューサグラフ(1つ又は複数)構造1060、及びプロデューサグラフ実行モジュール1070(ダイナミック依存性モジュール1075を含む)を含む。
図12は、プロデューサ依存性宣言1016が、任意であるが、コンティンジェント依存性1210、サブスクリプション依存性1220、及び複数のプロデューサ1215を含むことを示している。ここで、複数のプロデューサ1215は、プロデューサの集合を返送するためのプロデューサ依存性の能力を指す。更に、図12は、コンティンジェント依存性1210及びサブスクリプション依存性1220を処理するために自動プロデューサグラフ発生モジュール1040にサブスクリプションモジュール1240及びコンティンジェンシーモジュール1230を含む。又、図12は、サブスクリプションモジュール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は、本発明の一実施形態による図12のサブスクリプションログ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も示している。
アブソービングサブスクリプション
アブソービングサブスクリプションプロデューサ依存性において、依存性は、アブソービングサブスクリプション基準を満足する現在プロデューサグラフ(1つ又は複数)構造の全プロデューサの集合に対するものである。図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つ又は複数)構造の第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に追加される。
新プロデューサ及び非オーバーライドコマンド
図16は、本発明の一実施形態により新たなプロデューサをインスタンス生成し、そしてプロデューサを非オーバーライドするためのフローチャートである。図10を参照すれば、図15のフローは、自動プロデューサグラフ発生モジュール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では、プロデューサのメソッド及びプロデューサ依存性宣言ステートメントがアクセスされ、制御はブロック1625へ進む。図10を参照すれば、ブロック1615で位置付けられたクラスからメソッド及びプロデューサ依存性宣言1056の適切な1つにアクセスするために、テーブル2の被呼プロデューサ列におけるプロデューサキーからメソッドキーを使用することによりブロック1620が遂行される。
ブロック1625では、プロデューサグラフにプロデューサが追加され、制御はブロック1630へ進む。図11Cにおける本発明の実施形態を参照すれば、最初の3つの列がポピュレートされる。
ブロック1630では、各々の登録されたサブスクリプションに対して、サブスクリプションフィルタリング基準が処理されて、プロデューサが一致するかどうか決定する。図14Aにおける本発明の実施形態を参照すれば、サブスクリプションは、それがサブスクリプションログに追加されたときに登録されたと考える。サブスクリプションを登録するための例示的オペレーションを以下に説明する。ブロック1630は、自動プロデューサグラフ発生とプロデューサグラフ実行との間に分割されるべきインスタンス生成されたプロデューサをスキャンする作業を許す任意の最適化である。従って、本発明の別の実施形態では、ブロック1630を遂行しなくてもよい。
ブロック1635では、プロデューサは、依存性のためにコールされた場合にプロデューサグラフ(1つ又は複数)にリンクされる。ブロック1635から、制御は、ブロック1640へ進む。ブロック1635を遂行する仕方は、新プロデューサコマンドが実行される状況に依存する(図20を参照)。例えば、それが問題とするプロデューサであるか又はオーバーライドされるプロデューサであるという状況の場合には、依存性のためにそれがコールされず、何も行われない。対照的に、状況が非サブスクリプション下方宣言である場合には、非サブスクリプション下方宣言依存性のためにそれがコールされ、図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では、プロデューサの実行状態がパラメータとして返送される。
ブロック1670では、ブロック1635と同様に、プロデューサは、依存性のためにコールされた場合にプロデューサグラフ(1つ又は複数)にリンクされる。ブロック1670から、制御はブロック1675へ進む。種々の理由でブロック1670に到達する。例えば、プロデューサがプロデューサオーバーライドコマンドに応答して以前にインスタンス生成されたがプロデューサグラフにリンクされないために、ブロック1670に到達する。別の例として、プロデューサがプロデューサグラフの既に一部分でありそして別のものに追加される(例えば、問題とするプロデューサ、問題とするプロデューサの子孫、等であることに応答して以前にインスタンス生成された)ためにブロック1670に到達することがある。
ブロック1675では、オーバーライド、スティッキーサブスクリプション依存性、又は非サブスクリプション上方宣言依存性のために、新プロデューサフローがコールされるかどうか決定される。もしそうであれば、制御はブロック1680へ進み、さもなければ、制御はブロック1660へ進む。ブロック1675は、テーブル2のコール形式列をチェックして、それが、オーバーライドされたプロデューサに対するコールであるか、スティッキーサブスクリプション依存性に対するコールであるか、又は非サブスクリプション上方宣言依存性に対するコールであるか調べることにより、遂行される。
ブロック1680では、ブロック1640と同様に、プロデューサは、非実行とマークされ、制御はブロック1665へ進む。ブロック1680は、種々の理由で到達する。
ブロック1665では、プロデューサは、それがまだ存在しない場合に実行スタートログに追加され、そして制御は、ブロック1660へ進む。
プロデューサ非オーバーライドコマンドに応答して(ブロック1690)、制御はブロック1695へ進む。ブロック1695では、プロデューサが非オーバーライドとマークされ、制御はブロック1640へ進む。図11Cの本発明の実施形態を参照すれば、プロデューサの行のプロデューサ出力キャッシング及びオーバーライドプロデューサ出力指示列1170がアクセスされ、そしてプロデューサがもはやオーバーライドされないことを指示するように変更される。このフローを続けると、ブロック1640は、ブロック1645へ通じ、又、プロデューサが何らかの依存性を有する場合には、ブロック1650へ通じ、これは、プロデューサのもとでのプロデューサグラフがまだない場合には、それを発見し構築するようにさせる。プロデューサのもとでのプロデューサグラフが既に発見され構築されている場合には、新プロデューサコマンドをインボークすると、フローが1600から1605へ、1670へ、等々と進み、更に、ブロック1660においてプロデューサのもとでのグラフのプロデューサの実行状態を返送すると、ブロック1655において実行スタートログにプロデューサが追加されるかどうか決定される。しかしながら、プロデューサのもとでのプロデューサグラフが発見及び構築されない場合には、新プロデューサコマンドをインボークすると、それが発見及び構築され、フローは、1600から1605へ、1610へ、等々と進む。
図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へ進む。
図21は、本発明の一実施形態によりプロデューサをオーバーライドするためのフローチャートである。図10を参照すれば、図21のフローは、オーバーライドプロデューサモジュール1045(又は図10に関する別の実施形態を参照して述べたように、オーバーライド及び非オーバーライドを取り扱うモジュール)により遂行される。
オーバーライドプロデューサコマンドに応答して(ブロック2110)、制御はブロック2120へ進む。ブロック2120では、オーバーライドプロデューサコマンドにより識別されたプロデューサに対して新プロデューサコマンドがインボークされ、制御はブロック2130へ進む。ブロック2120は、本発明の一実施形態では、オーバーライドされるべきプロデューサがまだインスタンス生成されていない場合、プロデューサを非実行とマークし(ブロック1640又は1680)そしてそれを実行スタートログにログする(ブロック1665)ように遂行される。まだインスタンス生成されていないプロデューサのオーバーライドを許さない本発明の別の実施形態では、ブロック1605と1610との間で付加的なチェックを行って、この新プロデューサコマンドがオーバーライドプロデューサコマンドに応答してコールされたかどうか決定し、そしてこの新プロデューサコマンドがオーバーライドプロデューサコマンドに応答してコールされた場合にはエラーを指示する。
ブロック2130では、プロデューサ出力キャッシュ(及びフィールドの場合にはインスタンス)における出力がセットされ、そしてプロデューサが、オーバーライドされたとしてマークされる。
グローバルな実行コマンド
図22Aは、本発明の一実施形態により現在プロデューサグラフを実行するためのフローチャートの一部分であり、一方、図22Bは、本発明の一実施形態により現在プロデューサグラフを実行するためのフローチャートの別の部分である。図10を参照すれば、図22のフローは、プロデューサグラフ実行モジュール1070により遂行される。
グローバルな実行コマンドに応答して、ブロック2200は、候補プロデューサのセットが、実行スタートログにおけるプロデューサに基づいて実行されるべく選択されることを示し、制御はブロック2205へ進む。オーバーライドされたプロデューサが非実行とマークされ、それを実行すると、それらのオーバーライドされた結果が返送される(それらのメソッドを実行させるのではなく)本発明の一実施形態では、候補プロデューサの現在セットは、実行スタートログにおけるプロデューサである。オーバーライドされたプロデューサが非実行とマークされ、それを実行すると、それらのオーバーライドされた結果が返送される(それらのメソッドを実行させるのではなく)本発明の一実施形態を上述したが、別の実施形態は、異なる仕方で動作してもよい(例えば、オーバーライドされたプロデューサを実行とマークし、そして候補プロデューサの現在セットの選択時に、実行スタートログの独立プロデューサ及び実行スタートログにおけるオーバーライドされたプロデューサの親が選択される)。
ブロック2205では、実行の準備ができたプロデューサのサブセットが候補プロデューサのセットから選択され、そして制御はブロック2210へ進む。ブロック2205を遂行する例示的な仕方をここに説明する。
ブロック2210では、レディプロデューサの現在セットの中のプロデューサは、形式により分類され、標準プロデューサは、ブロック2215へ進み、そして依存性決定プロデューサは、ブロック2225へ進む。本発明の一実施形態では、ブロック2210は、プロデューサのリターンクラスをチェックすることにより遂行される。図10及び図11Dを参照すれば、メソッド追跡構造がアクセスされ、プロデューサの出力クラスがDEPであるかどうか決定し、従って、このプロデューサは、依存性決定プロデューサである。
ブロック2215では、レディプロデューサの現在セットにおける標準的プロデューサが実行されて、制御はブロック2220へ進む。本発明の一実施形態では、ブロック2215は、引数依存性から生じる子プロデューサの出力からマップされた入力パラメータでメソッドをコールすることにより遂行される(引数については、リンクモードの引数IDを使用して、適切な子プロデューサの出力を、実行されているメソッドの適切な入力引数へとマップする。本発明のある実施形態では、このような実行は、所与のメカニズムに出力を書き込む子プロデューサのメソッドにおけるコード(例えば、グローバル変数をセットし、プロデューサ出力でないインスタンスのフィールドをセットし、外部データソースにインパクトを与え、等々)、又は所与のメカニズムからその出力を読み取る親プロデューサのメソッドにおけるコードを実行させる。ブロック2220では、これらの実行された標準プロデューサのいずれかにアブソービングサブスクリプションを有する親がもしあれば、それらに対して、サブスクリプションは、未完了とマークされる。ブロック2220から、制御はブロック2245へ進む。図14Aを参照すれば、完了列1420の適切な行は、未完了を指示するようにセットされる。
ブロック2225では、レディプロデューサの現在セットにおける依存性決定プロデューサが実行準備され、そして制御はブロック2230へ進む。ブロック2225を遂行する例示的な仕方は、以下に述べる。
ブロック2230では、レディプロデューサの現在セットにおける依存性決定プロデューサが実行され、そして制御はブロック2235へ進む。本発明の一実施形態では、ブロック2230は、ブロック2215と同様に遂行される。
ブロック2235では、発見されたプロデューサに対して新プロデューサコマンドが実行され、そしてサブスクリプションに対してサブスクリプションログ及び処理が遂行される。ブロック2235の新プロデューサコマンド部分は、ブロック1750と同様に遂行され、一方、サブスクリプションログ及び処理は、ブロック1740及び1745と同様に遂行される。
ブロック2240では、実行スタートログに新たに追加された候補プロデューサのセットに追加がなされる。ブロック2240から、制御はブロック2245へ進む。ブロック2240は、ブロック2230及び2235の結果として実行スタートログに新たに追加されたプロデューサのみが候補プロデューサのセットに追加されることを除いて、ブロック2200と同様に遂行される。
ブロック2245では、実行されたプロデューサが、実行されたとマークされ、プロデューサ出力キャッシング(及びインスタンスキャッシング)が、必要に応じて更新され、実行されたプロデューサの親プロデューサが候補プロデューサの現在セットに追加され、そして実行されたプロデューサが候補及びレディプロデューサの現在セットから除去される。ブロック2245から、制御はブロック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では、現在選択されたプロデューサが依存するところのプロデューサが実行されるかどうか決定される。実行されない場合には、制御がブロック2325へ進み、さもなければ、制御がブロック2320へ進む。図11Cに示す本発明の実施形態に関して、子依存性の行に対する増分的実行マーキング列1180がチェックされて、現在選択されたプロデューサの子の実行状態が決定される。
ブロック2320では、現在選択された候補プロデューサがレディプロデューサの現在セットに追加され、制御はブロック2325へ進む。
ブロック2325では、ブロック2305で選択された現在プロデューサに対してフローが終了となる。
図24は、本発明の一実施形態による図22のブロック2225のフローチャートである。従って、制御は、ブロック2210からブロック2225におけるブロック2405へ進む。ブロック2405では、各依存性決定プロデューサに対して、次のブロック2410−2430が遂行される。
ブロック2410では、現在選択された依存性決定プロデューサにより発生された以前の依存性の形式が決定される。依存性の形式が非サブスクリプションである場合には、制御がブロック2420へ進み;その形式がアブソービングサブスクリプションである場合には、制御がブロック2415へ進み;一方、その形式がスティッキーサブスクリプションである場合には、制御がブロック2425へ進む。ブロック2410は、プロデューサ出力キャッシングに記憶されたプロデューサの現在出力をチェックすることにより決定される。クラスDEPを参照すれば、出力は、非サブスクリプション、アブソービングサブスクリプション、及びスティッキーサブスクリプションを指示する。
両ブロック2415及び2425において、サブスクリプションログからエントリーが除去される。図14A−Cに示す本発明の実施形態を参照すれば、次のことが行われる。1)アブソービングサブスクリプション(ブロック2415)に対して、依存性決定プロデューサ(例えば、プロデューサ1455)を使用して、プロデューサグラフ(1つ又は複数)におけるその親プロデューサ(例えば、プロデューサ1450)が決定され、次いで、サブスクリプションログにおいて親プロデューサがルックアップされて、そのエントリーが除去され;及び2)スティッキーサブスクリプション(ブロック2425)に対して、サブスクリプションログにおいて依存性決定プロデューサ(例えば、プロデューサ1470)がルックアップされ、そしてそのエントリーが除去される。ブロック2415から、制御がブロック2420へ進み;ブロック2425から、制御がブロック2420へ進む。
ブロック2420では、現在選択された依存性決定プロデューサにより既に生成されたリンクがプロデューサグラフ(1つ又は複数)からクリアされ、そして制御がブロック2430へ進む。図11Cに示す本発明の実施形態を参照すれば、次のことが行われる。依存性決定プロデューサが既存のプロデューサにおいて「スティッキー」状態であるかどうか最初に決定される。これは、図11Cにおける依存性決定プロデューサの子プロデューサリンク列をスキャニングし、そしてリンクの1つが、スティッキーを指示するスティッキーインジケータを有するかどうかチェックすることで行われる。
依存性決定プロデューサが既存のプロデューサにおいてスティッキー状態でない場合には、1)非サブスクリプション下方宣言依存性(引数、フィールド又はシーケンス依存性)を発生した依存性決定プロデューサに対して、依存性決定プロデューサの親が、プロデューサグラフにおいて、現在選択された依存性決定プロデューサの行での親プロデューサリファレンス(1つ又は複数)列1150を通してアクセスされ、この親プロデューサエントリーにおいて、依存性決定プロデューサリファレンスとマッチングさせるように子プロデューサ(1つ又は複数)リンク(1つ又は複数)列1160がアクセスされ、そしてその依存性決定プロデューサリファレンスを有する子プロデューサの全リファレンスがクリアされ;2)非サブスクリプション上方宣言依存性を発生した依存性決定プロデューサに対して、依存性決定プロデューサの親が、プロデューサグラフにおいて、現在選択された依存性決定プロデューサの行での親プロデューサリンク(1つ又は複数)列1150を通してアクセスされ、この親プロデューサエントリーにおいて、依存性決定プロデューサリファレンスとマッチングさせるように親プロデューサリンク(1つ又は複数)列1150がアクセスされ、そしてその依存性決定プロデューサリファレンスを有する親プロデューサの全リファレンスがクリアされ;3)アブソービングサブスクリプションを発生した依存性決定プロデューサに対して、非サブスクリプション下方宣言依存性と同じ振舞いが遂行され;及び4)スティッキーサブスクリプションを発生した依存性決定プロデューサに対して、サブスクリプションを除去する前にサブスクリプションログ14Aの列1421から抽出された依存性決定プロデューサリファレンスが、プロデューサグラフ(1つ又は複数)構造において、親プロデューサリンク(1つ又は複数)列1150にてルックアップされ、そしてその依存性決定プロデューサリファレンスを有する親プロデューサの全リファレンスがクリアされる。
非サブスクリプション上方宣言依存性又はスティッキーサブスクリプションの結果として、依存性決定プロデューサが既存のプロデューサにおいてスティッキー状態である場合には、依存性決定プロデューサがスティッキー状態となっている子プロデューサがアクセスされ(スティッキーを指示するスティッキーインジケータを伴う列1160における子プロデューサ)、そしてこの子プロデューサエントリーにおいて、依存性決定プロデューサリファレンスとマッチングさせるように親プロデューサリンク(1つ又は複数)列1150がアクセスされ、そしてその依存性決定プロデューサリファレンスを有する親プロデューサの全リファレンスがクリアされる。
ブロック2430では、ブロック2405で選択された依存性決定プロデューサに対してフローが終了となる。
図25は、本発明の一実施形態による図22のブロック2260のためのフローチャートである。従って、制御は、ブロック2255から、ブロック2260におけるブロック2505へ進む。ブロック2505では、未完了のアブソービングサブスクリプション依存性を伴う各プロデューサに対して、次のブロック2510−2525が遂行される。
ブロック2510では、全てのマッチングプロデューサが実行されたかどうか決定される。もしそうであれば、制御はブロック2515へ進み、さもなければ、制御はブロック2525へ進む。図11C及び14Aの実施形態を参照すれば、適切な行におけるマッチングプロデューサ列1415がアクセスされて、マッチングプロデューサが決定され、そして適切な行における増分的実行列1180が各マッチングプロデューサについてチェックされる。
ブロック2515では、アブソービングサブスクリプションが完了とマークされ、制御はブロック2520へ進む。図14Aの実施形態を参照すれば、適切な行における完了列1420が、完了を指示するようにセットされる。
ブロック2520では、ブロック2505で選択されたプロデューサが候補プロデューサの現在セットに追加され、そして制御はブロック2525へ進む。
ブロック2525では、ブロック2505で選択されたプロデューサについてフローが終了となる。
シナリオ
ある実施形態では、シナリオは、同じインスタンスの同じメソッドを異なるパラメータで複数回インボークする結果を伴う集合のファイリングを指定する仕方を与え、従って、異なるパラメータで同じインスタンスの同じメソッドを複数回インボケーションすることを手動インボケーションシーケンスコードに書き込む必要性を回避する。ダイナミック依存性をサポートする本発明の幾つかの実施形態では、異なるインスタンス、異なるメソッド、及び/又は異なるクラスがシナリオに使用される場合に、アプリケーションの2つの異なるシナリオが、構造上個別のプロデューサグラフ又はサブグラフをアプリケーションのプロデューサグラフに有することができる。例えば、数値の名前付きベクトルを入力として得る数学的モデルに基づいて出力を計算するための例示的アプリケーションプログラムが与えられる。異なる名前付きベクトルを使用するインパクトを評価するため、異なるベクトルインスタンスを使用するシナリオを生成することができ、ここで、各インスタンスは、個別のベクトルに対応する。或いは又、例示的アプリケーションプログラムは、同じベクトルインスタンスを使用するが、異なる数学的モデルを使用して、問題とする出力を計算してもよい。第2の数学的モデルの採用に対する第1の数学的モデルの採用のインパクトを評価するために、第1のシナリオ及び第2のシナリオを生成することができる。第1のシナリオでは、第1モデルを表す第1メソッドがインボークされる。第2のシナリオでは、第2モデルを表す第2メソッドがインボークされる。更に、第1シナリオにおけるクラスは、第2シナリオにおけるクラスと同じでもよいし、そうでなくてもよい。第1及び第2のメソッドが同じクラス内であるように定義される場合には、クラスは、第1及び第2シナリオにおいて同じままである。しかしながら、第1メソッドが第1クラス内であるように定義され、且つ第2メソッドが第1クラスとは異なる第2クラス内であるように定義される場合には、第1及び第2のシナリオは、異なるクラスを有する。第1クラスの第1メソッド及び第2クラスの第2メソッドは、同じ名前を有してもよいし、そうでなくてもよいことに注意されたい。
図26は、シナリオをサポートする本発明の別の実施形態を示す。図1Aに示した1つの実施形態と同様に、オブジェクト指向のソースコード100は、クラス102を含み、このクラスは、次いで、メソッド104、及びメソッド104に対するプロデューサ依存性宣言106を含む。もちろん、クラス102は、典型的に、1つ以上のフィールド(図示せず)及び付加的なメソッド(図示せず)を含む。更に、オブジェクト指向のソースコード100は、典型的に、付加的なクラスを含む。
図1Aを参照して上述したように、ランタイム中に、クラス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の親プロデューサと称される)によって消費することができる。幾つかの実施形態では、プロデューサ110、親プロデューサ114、及び子プロデューサ112を含むプロデューサグラフは、独特の第1シナリオキーを有する第1シナリオに関連付けられる。
第1シナリオとは個別の第2シナリオに対するプロデューサグラフ又はサブグラフを生成するために、1つ以上のプロデューサ110、112及び114をストレス化することができる。プロデューサをストレス化するために、プロデューサが複写される。一実施形態では、プロデューサは、クラス宣言102、所与のメソッド104、及びプロデューサ依存性宣言106からプロデューサをインスタンス生成することにより複写することができる。或いは又、プロデューサは、リファレンスシナリオ(上述した第1シナリオのような)に対して対応する既存のプロデューサをクローン化又はコピーすることにより複写されてもよい。両技術の幾つかの実施形態の詳細を以下に述べる。一般的には、直接的にインパクトされる全てのプロデューサがストレス化される。更に、直接的にインパクトされるプロデューサに依存するプロデューサ、即ち間接的にインパクトされるプロデューサがストレス化されてもよい。一実施形態では、間接的にインパクトされるプロデューサは、その間接的にインパクトされるプロデューサが、問題とするプロデューサと、直接的にインパクトされるプロデューサとの間の経路に入る場合に、ストレス化される。図26に戻ると、プロデューサ110が第2シナリオに対する直接的にインパクトされるプロデューサであるとすれば、プロデューサ110は、第2シナリオに対するストレス化プロデューサを発生するようにストレス化される。プロデューサ110の全ての親プロデューサ114は、その全ての親プロデューサ114がプロデューサ110に依存するので、間接的にインパクトされる。親プロデューサ114のセット内の親プロデューサが、問題とするプロデューサと、プロデューサ110との間の経路に入る場合には、親プロデューサがストレス化される。プロデューサ110のストレス化された親プロデューサ(1つ又は複数)の集合は、第2のシナリオに対してセット2614により表される。更に、セット2614内の幾つかのプロデューサ間にダイナミック依存性がある場合に、セット2614内のプロデューサは、第2のシナリオに対して繰り返しストレス化されてもよい。プロデューサ110の子プロデューサ112に関して、子プロデューサ112は、第2のシナリオに対してストレス化されなくてもよい。というのは、子プロデューサ112は、プロデューサ110に依存しないからである。しかしながら、セット112内の子プロデューサが第2のシナリオにおいて直接的又は間接的にインパクトされる場合には、セット112内のインパクトされる子プロデューサは、第2のシナリオに対してストレス化された子プロデューサを発生するようにストレス化されてもよい。プロデューサ2610、2612及び2614間の依存性は、第2のシナリオにおいて不変のままでもよい。或いは又、プロデューサ2610、2612及び2614間の依存性の幾つか又は全部が第2のシナリオにおいて変化してもよい。図26において、第2のシナリオのプロデューサグラフが破線で示されている。
本発明の一実施形態において、アプリケーションプログラムの第1プロデューサグラフ内の全てのプロデューサが新たなシナリオに対してストレス化される。その結果、ストレス化されたプロデューサのプロデューサグラフが生成されて、アプリケーションプログラムを表すプロデューサグラフの集合に追加される。しかしながら、幾つかの実施形態では、プロデューサのサブセットのみをストレス化して、新たなシナリオに対して第1プロデューサグラフ内のサブグラフを生成するように、最適化を許すことができる。シナリオに対するプロデューサグラフ又はサブグラフの生成の幾つかの実施形態の更なる詳細を以下に述べる。
図27Aは、本発明の一実施形態により、プロデューサグラフ指向のプログラミングサポート及びシナリオサポートを伴うランタイムを示すブロック図である。参照番号320、325、330、335、340、380、384及び345の詳細を、図3Aを参照して述べる。シナリオをサポートするために、ランタイム335は、シナリオインスタンス生成情報328も受け取る。このシナリオインスタンス生成情報328は、種々の仕方を経て、例えば、クライアントコード(例えば、グラフィックユーザインターフェイス(GUI)、コマンドラインインターフェイス(CLI)、等)を経て、ランタイム335に与えることができる。或いは又、シナリオインスタンス生成情報328は、プロデューサ依存性宣言(例えば、プロデューサ依存性宣言ステートメント又はプロデューサ依存性宣言コード)において指定されてもよい。或いは又、シナリオインスタンス生成情報328の幾つか又は全部が、ストレス化プロデューサ発生プロデューサのメソッドのソースコードにおいて指定されてもよい。ストレス化プロデューサ発生プロデューサの詳細を以下に述べる。
本発明の一実施形態によれば、シナリオインスタンス生成情報328がランタイム335の新シナリオモジュール337に与えられる。シナリオインスタンス生成情報328に基づいて、新シナリオモジュール337は、新たなシナリオをインスタンス生成する。幾つかの実施形態では、ランタイム335は、シナリオキーと、1つ以上の直接的にインパクトされるプロデューサのセット及びその直接的にインパクトされるプロデューサの対応所定出力又は出力変換を指定できるシナリオオブジェクトに対するリファレンスと、シナリオによりインパクトされるプロデューサのリストをその後に保持するインパクト経路追跡構造と、を記憶するためのシナリオ追跡構造338を含む。出力を問題とする1つ以上のストレス化されたプロデューサの現在セット325に基づいて、自動プロデューサグラフ発生モジュール340は、シナリオ追跡構造338に作用することにより問題とする1つ以上のストレス化されたプロデューサに対するプロデューサグラフ又はサブグラフを発生することができる。シナリオにおける1つ以上の直接的にインパクトされるプロデューサの1つ以上の所定の出力により問題とするストレス化されたプロデューサに及ぼされるインパクトを評価するために、プロデューサグラフ実行モジュール345は、シナリオに対する所定の出力又は出力変換により直接的又は間接的にインパクトされるプロデューサを実行するために発生されるプロデューサグラフ又はサブグラフを通してウオークすることができる。
幾つかの実施形態では、シナリオ情報328は、リファレンスシナリオキーと、ターゲットシナリオキーと、1つ以上の直接的にインパクトされるプロデューサ及びその直接的にインパクトされるプロデューサの対応する所定の出力のリストと、を含む。一般的に、シナリオキーとは、シナリオを識別するための独特のキーである。ある実施形態では、リファレンスシナリオとは、アプリケーションプログラムの現在状態及び出力を含む既存のシナリオである。ターゲットシナリオとは、直接的にインパクトされるプロデューサ及びそれに対応する出力のリストに起因するインパクトの集合である。ターゲットシナリオの場合に、直接的にインパクトされるプロデューサのリストにより識別されるプロデューサの出力は、そのリストに指定された出力でオーバーライドされようとする。ランタイム335は、リファレンスシナリオを使用して、直接的にインパクトされるプロデューサにより間接的にインパクトされるプロデューサを見出すことができる。直接的にインパクトされるプロデューサにより問題とするストレス化されたプロデューサに及ぼされるインパクトは、リファレンスシナリオを上書き又は変更せずにターゲットシナリオを使用して評価することができる。換言すれば、プロデューサの既存の出力及び/又はインスタンスは、第1シナリオに対して保存され又は維持される。ある実施形態では、リファレンスシナリオのプロデューサグラフの一部分は、問題とするプロデューサがその一部分に依存し且つその一部分がターゲットシナリオにおける直接的にインパクトされるプロデューサにより直接的又は間接的にインパクトされない場合には、ターゲットシナリオのプロデューサグラフにリンクすることができる。換言すれば、リファレンスシナリオのプロデューサグラフ内にターゲットシナリオのサブグラフを生成することができる。
図27Bは、本発明の一実施形態により、増分的実行及びオーバーライドされたプロデューサ出力、並びにシナリオもサポートするプロデューサグラフ指向のプログラミングサポートを伴うランタイムを示すブロック図である。コンポーネント320、325、350、352、354、360、365、380、382、384、370、396、390、392及び394の詳細は、図3Bを参照して上述した。シナリオをサポートするために、シナリオインスタンス生成情報328が自動プロデューサグラフ発生モジュール365へ入力される。シナリオインスタンス生成情報328の幾つかの実施形態の詳細は、図27Aを参照して上述した。シナリオインスタンス生成情報328に基づいて、自動プロデューサグラフ発生モジュール365は、各シナリオに対するプロデューサグラフ又はサブグラフを構成することができる。シナリオに対するプロデューサグラフ又はサブグラフの構造の幾つかの実施形態を以下に詳細に述べる。問題とするストレス化されたプロデューサ(即ち、特定のシナリオに対する問題とするプロデューサ)に対するインパクトを評価するために、プロデューサグラフ実行モジュール370は、そのシナリオに対して生成されたプロデューサグラフ又はサブグラフを通してウオークし、それに応じてプロデューサを実行する。シナリオに対するプロデューサグラフ又はサブグラフの実行の幾つかの実施形態を以下に詳細に述べる。
幾つかの実施形態では、シナリオインスタンス生成情報328は、対応するシナリオにおける1つ以上の直接的にインパクトされるプロデューサの出力をオーバーライドするオーバーライドプロデューサ出力モジュール390に送られる。このオーバーライドプロデューサ出力モジュール390のオペレーションの詳細は、図3を参照して上述した。
図28A−Dは、異なるシナリオに対するアプリケーションプログラムの幾つかの例示的プロデューサグラフを示す。図28Aを参照すれば、シナリオ1に対するプロデューサグラフが上部に示され、そしてシナリオ2に対するプロデューサグラフが下部に示されている。シナリオ1及び2は、各々、シナリオキー“S1”及び“S2”を有する。幾つかの実施形態では、シナリオ1は、デフォールトシナリオ又はリファレンスシナリオとも称される。サンプルアプリケーションプログラムは、少なくとも7つのプロデューサ、即ちプロデューサ1ないしプロデューサ7を有し、ここで、プロデューサ1は、プロデューサ3及びプロデューサ4に直接依存し、プロデューサ2は、プロデューサ4に直接依存し、プロデューサ3は、プロデューサ5及びプロデューサ6に直接依存し、そしてプロデューサ4は、プロデューサ7に直接依存する。シナリオ1において、プロデューサ7の出力は、X1の値を有し、そしてプロデューサ1の出力は、Z1の値を有する。
幾つかの実施形態において、ストレス化されたプロデューサは、一対のプロデューサキー及びシナリオキーにより識別される。例えば、シナリオ2におけるストレス化されたプロデューサ1は、対{プロデューサ1、S2}により識別される。ストレス化されたプロデューサは、種々の仕方を経て、例えば、クライアントコード(例えば、GUI、CLI、等)を経て、ユーザにより指定することができる。或いは又、アプリケーションプログラムは、1つ以上のストレス化されたプロデューサを発生するためにストレス化プロデューサ発生プロデューサを含んでもよい。ストレス化プロデューサ発生プロデューサ、即ちプロデューサ8の実施形態が図28Bに示されている。図28Bを参照すれば、プロデューサ8の例示的疑似コードが図面の右側に示されている。最初、ストレス化プロデューサのクラスは、問題とするプロデューサキーを表すフィールド及びシナリオを表すフィールドを有するものとして定義される。ここに示す例では、プロデューサ8は、独立であり、プロデューサ8のプロデューサ依存性宣言ステートメントは、ナルである。次いで、プロデューサ8のメソッドは、シナリオ2のシナリオ情報を与え、ストレス化プロデューサのフィールドに値を指定し、そしてストレス化プロデューサの集合を出力することができる。
図28Aに戻ると、シナリオ2は、次のシナリオ情報により定義される。即ち、リファレンスシナリオキー=ナル、ターゲットシナリオキー=S2、並びに直接的にインパクトされるプロデューサ及びそれに対応する出力のリスト。ここに示す例では、直接的にインパクトされるプロデューサのリストは、指定出力X2を有する1つのプロデューサ、即ちプロデューサ7しか有していない。しかしながら、シナリオには直接的にインパクトされるプロデューサが複数あることが明らかであろう。幾つかの実施形態では、図28Aに示すように、プロデューサ1ないしプロデューサ7の各々を生成することにより、シナリオ2に対してプロデューサグラフ全体が再現される。シナリオ2に対するプロデューサグラフにおいて、直接的にインパクトされるプロデューサ、即ちプロデューサ7の出力は、シナリオ2の定義で指定された出力、即ちX2でオーバーライドされる。ここに示す例における問題とするプロデューサは、プロデューサ1である。シナリオ2に対するプロデューサグラフを実行することにより、問題とするストレス化プロデューサ、即ちシナリオ2のプロデューサ1の出力がZ2であることが決定される。既存のプロデューサグラフ内のシナリオに対するサブグラフを発生するための別の解決策を利用することができ、その幾つかの実施形態を以下に説明する。
シナリオ2に対する第2のプロデューサグラフが生成されるので、シナリオ2に対してなされる変更(例えば、プロデューサ7の出力をオーバーライドすること)がシナリオ1に対するプロデューサグラフに影響を及ぼすことはない。従って、シナリオ1に対するプロデューサの出力は、シナリオ2に対してなされる変更でアプリケーションプログラムを実行することにより上書きされない。従って、シナリオを生成する技術は、アプリケーションプログラムにおけるプロデューサの既存の出力を失うことなく、変更の潜在的な又は考えられるインパクト及び/又は作用を評価する上で有用である。種々の理由で、例えば、限定された相違を使用してプロデューサの導関数を自動的に決定するために、プロデューサの既存の出力を保持し又は保存することが有用である。図28Aの実施形態に戻り、そしてZ1、Z2、X1及びX2が数値であると仮定すれば、シナリオ1からシナリオ2への問題とするプロデューサ、即ちプロデューサ1の導関数は、シナリオ1及びシナリオ2の両方からの出力を使用して次のように容易に計算することができる。
プロデューサ1の導関数=(Z2−Z1)/(X2−X1)
更に、高次の導関数、即ちN次の導関数(但し、Nは、1より大きい整数)も、異なるシナリオからの出力を使用して容易に計算することができる。幾つかの実施形態では、あるシナリオから別のシナリオへ2つ以上の入力が変化するときに、問題とするプロデューサの出力の交差導関数を計算することができる。例えば、あるシナリオから別のシナリオへ入力X1及びY1がX2及びY2へ各々変化されると仮定する。その結果、問題とするプロデューサの出力がZ1からZ2へ変化される。次いで、問題とするプロデューサの出力の交差導関数は、次のように計算することができる。
問題とするプロデューサの交差導関数=(Z2−Z1)2/((X2−X1)*(Y2−Y1))
ランタイムは、異なるシナリオに対するプロデューサ出力を追跡でき且つプロデューサの導関数を自動的に決定できるので、プログラマーは、手動のインボケーションシーケンスコードを書き込んで、アプリケーションプログラムを複数回実行し、それに対応する出力を追跡し、そしてそれに対応する出力を使用して導関数を計算するメソッドをコード化する必要がない。
上述したように、シナリオ2に対するサブグラフを発生するための別の解決策を利用することができる。幾つかの別の解決策が図28C及び28Dに例示されている。
図28Cを参照すれば、シナリオ1(即ち、リファレンスシナリオ)に対するプロデューサグラフの一部分をリンクするための技術を使用して、シナリオ2(即ち、ターゲットシナリオ)に対するプロデューサグラフが発生される。最初、ランタイムは、問題とするプロデューサがプロデューサ1であることを指示するために、ユーザからクライアントコードを経て新ストレス化プロデューサコマンドを受け取ることができる。或いは又、ストレス化プロデューサ発生プロデューサ、例えば、プロデューサ8が、新ストレス化プロデューサコマンドのインボケーションをトリガーしてもよい。新ストレス化プロデューサコマンドに応答して、ランタイムは、デフォールトシナリオ又はリファレンスシナリオとも称されるシナリオ1に対するプロデューサ1のためのプロデューサグラフを構成する。次いで、第2の新ストレス化プロデューサコマンドがユーザからクライアントコードを経て受け取られるか、又はストレスプロデューサ発生プロデューサ(例えば、プロデューサ8)によりトリガーされて、問題とするプロデューサがプロデューサ2であることを指示する。第2の新ストレス化プロデューサコマンドに応答して、ランタイムは、プロデューサ2をシナリオ1のためのプロデューサグラフへ追加する。
次いで、ランタイムは、シナリオ2を定義するシナリオ情報を受け取る。この場合も、シナリオ情報は、クライアントコードからのものでよい。シナリオ情報は、リファレンスシナリオキーが“S1”であると指定し、ターゲットシナリオキーが“S2”であると指定し、そしてターゲットシナリオに対する直接的にインパクトされるプロデューサ及びその対応出力のリストを指定する。直接的にインパクトされるプロデューサのリストは、ここに示す例では1つのプロデューサ、即ちプロデューサ7、及びプロデューサ7の出力、即ちX2しか含まない。
アプリケーションプログラムにおいて、プロデューサ1のようなプロデューサに対するシナリオ2のインパクト又は作用、即ちプロデューサ7の出力をX2に変化させることを評価するために、プロデューサ1が、問題とするプロデューサとして識別される。更に、プロデューサが、問題とするシナリオで識別される。従って、問題とするプロデューサキー及びシナリオキーの対であるストレス化プロデューサが識別され、即ち{プロデューサ1、S2}となる。幾つかの実施形態では、問題とするプロデューサが、ユーザにより、GUI、CLI、等のクライアントコードを経て識別される。或いは又、問題とするプロデューサが、ストレス化プロデューサ発生プロデューサ(例えば、プロデューサ8)の出力において識別されてもよい。
プロデューサとシナリオ情報との間の依存性に基づいて、ランタイムは、シナリオ2に対する直接的及び間接的にインパクトされる両プロデューサを識別することができる。直接的及び間接的にインパクトされるプロデューサの識別は、追跡と称されてもよい。直接的及び間接的にインパクトされるプロデューサは、インパクトされた経路追跡構造(IPTS)を使用して追跡することができる。ここに示す例では、インパクトされた経路追跡構造は、プロデューサ7、プロデューサ4、プロデューサ1、及びプロデューサ2を含む。プロデューサ1、2及び4は、シナリオ2に対する間接的にインパクトされるプロデューサであり、一方、プロデューサ7は、直接的にインパクトされるプロデューサであることに注意されたい。幾つかの実施形態では、シナリオ2のインパクトリストを使用して、ランタイムは、直接的にインパクトされるプロデューサ(1つ又は複数)を識別することができる。次いで、ランタイムは、シナリオ1に対するプロデューサグラフを使用して、図28Cに[B]、[C]、[D]及び[E]で示すように、直接的にインパクトされるプロデューサからシナリオ1に対するプロデューサグラフを横断することにより、間接的にインパクトされるプロデューサを追跡することができる。シナリオ1に対するプロデューサグラフがまだ構成されていない場合には、ランタイムは、間接的にインパクトされるプロデューサを追跡する前に、シナリオ1に対するプロデューサグラフを構築することができる。或いは又、リファレンスシナリオが与えられないか、又はリファレンスシナリオのプロデューサグラフがまだ構成されない場合に、ランタイムは、問題とするプロデューサ、直接的にインパクトされるプロデューサ、及びシナリオ2に対してこれら問題とするプロデューサと直接的にインパクトされるプロデューサとの間の経路に入る中間プロデューサを、前記プロデューサの対応するメソッド及びプロデューサ依存性宣言を使用して、生成することができる。
幾つかの実施形態では、ランタイムは、インパクトされた経路追跡構造を通して進み、そのインパクトされた経路追跡構造における各インパクトされたプロデューサに対する新ストレス化プロデューサコマンドをインボークする。発生されたストレス化プロデューサは、シナリオ1に対する既存のプロデューサグラフのサブグラフを形成するように相互接続される。インボケーションのシーケンスは、重要でない。というのは、新ストレス化プロデューサ(即ち、シナリオ2に対するプロデューサ1、2、4及び7)は、図28Cに[G]で示されたように、それらが生成されるときに互いに相互接続されるからである。問題とするプロデューサがリファレンスシナリオに存在しない実施形態では、そのような問題とするプロデューサは、インパクトされた経路追跡構造において追跡されない。それでも、ランタイムは、そのような問題とするプロデューサに対して新ストレス化プロデューサコマンドをインボークし、シナリオ2に対するプロデューサグラフを生成する。
シナリオ2に対するプロデューサグラフを最適化するために、プロデューサ7によって直接的又は間接的にインパクトされず問題とするプロデューサに依存するプロデューサ、即ちプロデューサ1は、シナリオ2において複写又はストレス化されなくてもよい。むしろ、それらのプロデューサは、シナリオ1からシナリオ2のプロデューサグラフにリンクされる。ここに示す例では、これらプロデューサは、プロデューサ3、5及び6を含み、ここで、プロデューサ1はプロデューサ3に直接依存し、プロデューサ3はプロデューサ5及び6に直接依存する。図28Cに示すように、[F]においてシナリオ1のプロデューサ3をシナリオ2のプロデューサ1にリンクするためのリンクが生成される。従って、プロデューサ3及びプロデューサ3の子プロデューサ(即ち、プロデューサ5及びプロデューサ6)を有するシナリオ1のプロデューサグラフのサブセットがシナリオ2のプロデューサグラフにリンクされる。換言すれば、シナリオ1に対するプロデューサグラフ内のサブグラフがシナリオ2に対して生成される。プロデューサ3は、プロデューサ7に直接的又は間接的に依存しないので、シナリオ2に対するプロデューサ7へのインパクトは、プロデューサ3に影響しないことに注意されたい。
シナリオ2のプロデューサグラフを生成するプロセスを更に最適化するために、ランタイムは、問題とするプロデューサが直接的又は間接的に依存していないプロデューサを、そのようなプロデューサがシナリオ2においてインパクトされるかどうかに関わらず、複写もストレス化もしない。このような最適化の一例が図28Dに示されている。図28Cと同様に、シナリオ1に対するプロデューサグラフが生成され、そしてプロデューサ1がシナリオ2における問題とするプロデューサとして識別され、ここで、シナリオ2は、上述したように定義される。幾つかの実施形態では、図28Dに[A]で示すように、問題とするプロデューサ、即ちプロデューサ1において、新ストレス化プロデューサコマンドがインボークされる。この新ストレス化プロデューサコマンドは、ユーザによりクライアントコードを経てインボークされてもよいし、又はストレス化プロデューサ発生プロデューサ、例えば、図28Bのプロデューサ8によりトリガーされてもよい。
初期依存性宣言順序に基づき、ランタイムは、プロデューサ1がその順序において依存するプロデューサ上で新ストレス化プロデューサコマンドをインボークすることができる。例えば、初期依存性宣言においてプロデューサ4の前にプロデューサ3が到来する場合には、新ストレス化プロデューサコマンドが、先ず、プロデューサ3上で、次いで、プロデューサ4上でインボークされ、そしてその逆のことも言える。新ストレス化プロデューサコマンドがプロデューサ3上でインボークされると、プロデューサ3はシナリオ2においてインパクトされないので、シナリオ2におけるプロデューサ1をシナリオ1におけるプロデューサ3にリンクするためのリンクが[F]において生成される。新ストレス化プロデューサコマンドがプロデューサ4上でインボークされると、図28Dに[G]で示すように、ストレス化プロデューサ4がシナリオ2においてクローン化される。ストレス化プロデューサ4をシナリオ2においてクローン化するために、ランタイムは、プロデューサ4からの情報をシナリオ1のプロデューサグラフに使用して、シナリオ2に対するサブグラフにおいてプロデューサ4のコピーを作成することができる。或いは又、ランタイムは、プロデューサ4のプロデューサ依存性宣言及びメソッドに基づいてプロデューサ4をインスタンス生成することにより新たなプロデューサ4を生成してもよい。ストレス化プロデューサ4がプロデューサグラフに追加された後に、図28Dに[H]で示すように、プロデューサ7上で新ストレス化プロデューサコマンドがインボークされて、シナリオ2に対するプロデューサ7をストレス化する。プロデューサ4と同様に、プロデューサ7は、インスタンス生成又はクローン化によりストレス化されてもよい。たとえプロデューサ2がプロデューサ7により間接的にインパクトされても、シナリオ2における問題とするプロデューサ即ちプロデューサ1がプロデューサ2に直接的にも又は間接的にも依存しないので、シナリオ2においてプロデューサ2をストレス化せずに、図28Dに示すように、シナリオ2に対するサブグラフが今や完全に構成されたことに注意されたい。その結果、シナリオ2に対するサブグラフを生成するプロセスが更に最適化される。
図29は、本発明の一実施形態により、ランタイムクライアントの論理的実行フローと、プロデューサグラフ指向のプログラミングサポートを伴うランタイムに対するその関係とを示すフローチャートである。図29において、破線の分割線600は、ランタイムクライアント610の論理的実行フローを、プロデューサグラフ指向のプログラミングサポートを伴うランタイム640から分離している。ブロック615、620、625、630、645、650、655及び660の詳細は、図6を参照して上述した。シナリオをサポートするために、ランタイムクライアント610は、先ず、ブロック616において、新たなシナリオがあるかどうかチェックする。新たなシナリオがある場合には、ランタイムクライアント610は、ブロック617において、新たなシナリオ情報を決定する。更に、新たなシナリオをインスタンス生成するために、シナリオインスタンス生成コマンドがインボークされ又はコマンドログ665にログインされる。新たなシナリオコマンドに応答して、ランタイム640は、ブロック648において、新たなシナリオをインスタンス生成する。次いで、ランタイムクライアント610は、ブロック615へ移行して、実行フローを続ける。さもなければ、ランタイムクライアント610は、ブロック617をスキップし、ブロック615へ移行して、実行フローを続ける。ブロック615では、ランタイムクライアント610は、出力が問題である1つ以上のストレス化プロデューサのセットを決定する。次いで、ランタイムクライアント610は、図6を参照して上述したように、ブロック620へ移行して、実行フローを続ける。
シナリオに対する問題とする1つ以上のプロデューサへのインパクトを評価するために、ブロック630において、プロデューサグラフ実行モジュールがインボークされる。次いで、プロデューサグラフ実行モジュールは、ブロック660において、プロデューサグラフ又はシナリオのサブグラフを通してウオークし、追跡に基づき実行されるべきプロデューサを実行することができる。ブロック630では、プロデューサグラフ実行モジュールがインボークされ、そして制御は、任意であるが、ブロック615、ブロック625、及び/又はブロック616へ戻る。
図30は、シナリオをサポートする本発明の一実施形態による別の具現化のブロック図である。図30において、破線の分割線1000は、ランタイムクライアント1002を、プロデューサグラフ指向のプログラミングサポートを伴うランタイム1004から分離している。ランタイムクライアント1002及びランタイム1004の種々のコンポーネントの詳細は、図10を参照して上述した。従って、以下の説明は、シナリオに関連したコンポーネントに集中して行う。幾つかの実施形態では、ランタイム1004は、更に、シナリオをサポートするために新シナリオモジュール1096及びシナリオ追跡構造1050を備えている。
図10を参照して上述したように、新クラスモジュール1095は、クラス定義1010に基づくクラスをインスタンス生成する。インスタンス生成されたクラスの情報は、クラス追跡構造1092に記憶される。クラス追跡構造1092の一実施形態が図31Aに示されている。図31Aを参照すれば、クラスキー1110及びクラスリファレンス1115(クラスポインタのような)が、インスタンス生成されるクラスごとにクラス追跡構造に記憶される。図30に戻ると、ランタイムクライアント1002の側のクラス定義1010は、本発明の一実施形態によりストレス化プロデューサ発生プロデューサコード1018を含む。図28Bを参照して上述したように、ストレス化プロデューサ発生プロデューサは、プロデューサキー及びシナリオキーを各々含むストレス化されたプロデューサの集合を出力するプロデューサである。ストレス化プロデューサ発生プロデューサコード1018の幾つかの例示的疑似コードも、図28Bに示されている。シナリオをサポートするために、ランタイムクライアント1002は、シナリオキーを伴うシナリオインスタンス生成コマンド1019を更に与える。シナリオキーは、インスタンスをそれに対応するシナリオ(1つ又は複数)に関連付けるために新たなインスタンスのインスタンス生成に使用される。インスタンス生成されたインスタンスの情報は、インスタンス追跡構造1065に記憶される。インスタンス追跡構造1065の実施形態が図31Bに示されている。インスタンス生成されたインスタンスごとに、シナリオキー1123、インスタンスリファレンス1120、及びストレス化インスタンスリファレンス1125が、図31Bの例示的インスタンス追跡構造に記憶される。
図30に戻ると、ランタイムクライアント1002は、新たなシナリオを生成するために独特のシナリオキーでシナリオインスタンス生成コマンド1019をインボークすることができる。シナリオインスタンス生成コマンド1019に応答して、新シナリオモジュール1096は、新たなシナリオ情報(図27Aのシナリオ情報328のような)をシナリオ追跡構造1050にセーブすることができる。シナリオ追跡構造1050の実施形態が図31Dに示されている。幾つかの実施形態では、シナリオ追跡構造1050は、図31Dに示すように、シナリオキーの列、シナリオリファレンスの列、及びインパクト経路追跡構造の列を有するテーブルを含む。シナリオキー3110は、シナリオを識別するためにシナリオに指定された独特なキーでよい。シナリオリファレンス3112は、シナリオオブジェクトを指す。インパクト経路追跡構造3113は、それに対応するシナリオにおいてインパクトされるプロデューサを追跡する。
図31Eは、シナリオオブジェクト追跡構造の一実施形態を示す。シナリオオブジェクト追跡構造は、シナリオごとに行を有するテーブルを含む。シナリオごとに、リファレンスシナリオキー3120、ターゲットシナリオキー3122、及びインパクトリストへのリファレンス3124が、シナリオオブジェクト追跡構造に記憶される。ターゲットシナリオキー3122は、構築されるべきシナリオを識別する。従って、ターゲットシナリオキー3122は、図31Dのシナリオ追跡構造における対応シナリオキー3110と同じである。リファレンスシナリオキー3120は、ターゲットシナリオを構築するベースとなるシナリオを識別する。リファレンスシナリオがない場合には、リファレンスシナリオキー3120がナルである。シナリオのインパクトリストへのリファレンス3124は、図31Fに示す例示的インパクトリストのような、シナリオのインパクトリストを指す。
図31Fにおいて、シナリオの例示的インパクトリストは、次の各々に対する列を含む。即ち、直接的にインパクトされるプロデューサキー3130、相対的又は絶対的インジケータ3134、出力インスタンス3132、変換パラメータ3136、変換メソッド名及びメソッドクラス3138。対応するシナリオにおける各直接的にインパクトされるプロデューサは、インパクトリストの行を占有する。直接的にインパクトされるプロデューサキー3130は、シナリオにおける直接的にインパクトされるプロデューサを識別する。
幾つかの実施形態では、出力値に絶対値又は相対値が指定される。相対的又は絶対的インジケータ3134は、出力値に絶対値が指定されるか相対値が指定されるか指示する。インジケータ3134が、それが絶対値であることを指示する場合には、直接的にインパクトされるプロデューサへの入力に関わらず、直接的にインパクトされるプロデューサの出力値が出力インスタンス3132であると指定される。さもなければ、変換パラメータ3136が、直接的にインパクトされるプロデューサの現在出力(即ち、リファレンスシナリオのための直接的にインパクトされるプロデューサの出力)に適用され、変換メソッド名及びメソッドクラス3138と共に変換メソッドを使用して直接的にインパクトされるプロデューサの現在出力を変換する。次いで、ターゲットシナリオに対する直接的にインパクトされるプロデューサの出力が、変換された現在出力でオーバーライドされる。直接的にインパクトされるプロデューサの出力は、値(数値のような)でもインスタンスでもよいことに注意されたい。例えば、直接的にインパクトされるプロデューサの現在出力が数値であり、変換パラメータ3136が係数値であり、そして変換メソッドが乗算である場合には、ターゲットシナリオに対する直接的にインパクトされるプロデューサの出力は、係数値と、直接的にインパクトされるプロデューサの現在出力値との積に等しい値である。別の例では、変換パラメータ3136が拡散値であり、そして変換メソッドが加算である場合には、ターゲットシナリオに対する直接的にインパクトされるプロデューサの出力は、拡散値と、直接的にインパクトされるプロデューサの現在出力値との和に等しい。直接的にインパクトされるプロデューサの出力値は、他の実施形態では、他の式を現在出力値の関数として使用して発生されてもよいことが明らかであろう。
図30に戻ると、自動ストレス化プロデューサグラフ発生モジュール3040がシナリオ追跡構造1050にアクセスする。プロデューサキー及びシナリオキーを伴うストレス化プロデューサインスタンス生成コマンド1025に応答して、自動ストレス化プロデューサグラフ発生モジュール3040は、シナリオ追跡構造1050、クラス追跡構造1092、メソッド追跡構造1058、インスタンス追跡構造1065、及びインスタンス1052からの対応シナリオのシナリオ情報に基づき、ストレス化プロデューサをインスタンス生成することができる。或いは又、クラス定義1010内のストレス化プロデューサ発生プロデューサコード1018は、ストレス化プロデューサ発生プロデューサ3054のクラス及びストレス化プロデューサ3056を発生するメソッドを発生するためにランタイム1004により処理される。発生されたクラス及びメソッドは、自動ストレス化プロデューサグラフ発生モジュール3040へ入力され、このモジュールは、それに応じてストレス化プロデューサをインスタンス生成する。自動ストレス化プロデューサグラフ発生モジュール3040は、対応するシナリオのためのプロデューサグラフ又はサブグラフを発生するためにインスタンス生成されたストレス化プロデューサを相互接続する。シナリオをサポートする新ストレス化プロデューサインスタンス生成フローの幾つかの実施形態を、図34A−34Gを参照して以下に詳細に説明する。
本発明の一実施形態によれば、プロデューサグラフがプロデューサグラフ構造1060に記憶される。例示的なプロデューサグラフ構造が図31Cに示されている。プロデューサグラフ構造は、図11Cに示すものと実質的に同じである。各シナリオは、それに対応するプロデューサグラフ又はサブグラフにおいて個々に追跡されるので、ストレス化プロデューサグラフ実行モジュール3070は、シナリオに対する対応プロデューサグラフ又はサブグラフを通してウオークし、シナリオに対するストレス化プロデューサの少なくとも幾つかを実行して、シナリオに対する問題とする1つ以上のストレス化プロデューサへのインパクトを、他のシナリオに対するプロデューサの出力を上書きも変更もせずに評価することができる。シナリオをサポートするプロデューサグラフの実行フローの幾つかの実施形態を、図35A及び35Bを参照して以下に詳細に説明する。
上述したランタイムクライアント1002及びランタイム1004においてシナリオをサポートするモジュール及び構造は、図12に示されたもののようなコンティンジェント及びサブスクリプション形式のダイナミックプロデューサ依存性をサポートする幾つかの実施形態に追加できることに注意されたい。
図32は、本発明の一実施形態による新シナリオインスタンス生成フローを示すフローチャートである。ブロック3210において、ランタイムは、新シナリオインスタンス生成コマンドを受け取る。次いで、ランタイムは、ブロック3220において、新シナリオインスタンス生成コマンドにより識別されたシナリオが既に存在するかどうかチェックする。シナリオが既に存在する場合には、ブロック3290において、新シナリオインスタンス生成のフローが終了となる。さもなければ、ランタイムは、シナリオ情報、例えば、ターゲットシナリオキー、リファレンスシナリオキー、及びシナリオのインパクトリストへのリファレンスを、ブロック3230において、シナリオ追跡構造に追加する。次いで、ランタイムは、ブロック3290へ移行し、新シナリオインスタンス生成フローが終了となる。
図33は、本発明の一実施形態によりシナリオをサポートする新インスタンスインスタンス生成フローを示すフローチャートである。図33は、図15に実質的に類似し、フローの詳細は、図15を参照して上述したことに注意されたい。シナリオをサポートするために、ランタイムは、図33のブロック3360において、クラスのインスタンスをインスタンス生成し、そしてインスタンスをインスタンスキー、ストレス化インスタンスリファレンス及びシナリオキー(1つ又は複数)と共に記憶する。上述したように、シナリオごとに独特のシナリオキーがある。従って、インスタンスが複数のシナリオに関連付けられる場合には、複数のシナリオキーが存在する。一実施形態では、図31Bに示したように、インスタンスキー及びシナリオキー(1つ又は複数)がインスタンス追跡構造に記憶される。図31Bを参照すれば、インスタンス追跡構造は、シナリオキー1123、インスタンスキー1120、及びストレス化インスタンスリファレンス1125の各々に対して1つの列を含む。
図34A−34Gは、本発明の一実施形態によるターゲットシナリオにおける新ストレス化プロデューサのインスタンス生成のフローチャートである。図34A−34Cは、新ストレス化プロデューサのインスタンス生成の全フローを示し、一方、図34D−34Gは、全フローにおける幾つかのオペレーションの拡張フローを示す。
図34Aを参照すれば、ランタイムは、ブロック1600において、新ストレス化プロデューサコマンドを受け取る。新ストレス化プロデューサコマンドは、プロデューサキー及びターゲットシナリオキーを指定する。プロデューサキー及びターゲットシナリオキーを伴うプロデューサは、新ストレス化プロデューサコマンドにより発生されるストレス化プロデューサである。本発明の一実施形態では、新ストレス化プロデューサコマンドは、種々の状況に応答して実行することができる。以下のテーブル3は、本発明の実施形態により通用される種々の状況及びパラメータを示す。
テーブル3
新ストレス化プロデューサコマンドに応答して、ランタイムは、ブロック1605において、ストレス化プロデューサ(即ち、プロデューサキー及びターゲットシナリオキーを伴うプロデューサ)が既に存在するかどうかチェックする。ストレス化プロデューサが既に存在する場合には、ブロック1670において、プロデューサが依存性のためにコールされれば、ランタイムがプロデューサをプロデューサグラフにリンクする。さもなければ、ストレス化プロデューサが存在しない場合には、ブロック1601において、プロデューサが問題とするプロデューサであれば、ランタイムが、直接的及び間接的にインパクトされるプロデューサの両方を識別する。ブロック1601の詳細は、図34Dを参照して以下に述べる。次いで、ランタイムは、ブロック1602へ移行して、シナリオを取り扱い、その間に、ランタイムは、プロデューサ生成の値をセットする。幾つかの実施形態では、プロデューサ生成は、3つの考えられる値、即ち、無生成、新生成、及びクローン化を有する。ブロック1602の詳細は、図34Eを参照して以下に述べる。ランタイムは、ブロック1603において、プロデューサ生成の値をチェックする。プロデューサ生成が新生成である場合には、ランタイムは図34Bの入口点Aへ移行する。プロデューサ生成がクローン化である場合には、ランタイムは、図34Bの入口点Bへ移行する。プロデューサ生成が無生成である場合には、ランタイムは、ブロック1670へ移行する。
ブロック1670の後に、ランタイムは、ブロック1675において、プロデューサがオーバーライドされたか、スティッキーサブスクリプションを有するか、又は上方に宣言されたかをチェックする。もしそうであれば、ランタイムは、ブロック1680において、プロデューサを非実行とマークすると共に、ブロック1665において、プロデューサを実行スタートログにログさせる。次いで、ランタイムは、ブロック1660において、プロデューサの実行状態を返送する。さもなければ、プロデューサがオーバーライドさればい場合には、ランタイムがブロック1660へ移行して、プロデューサの実行状態を返送する。図34Bを参照すれば、プロデューサ生成が新生成である場合には、ランタイムが入力点Aへ進む。入力点Aから、ランタイムはブロック1610へ移行し、新たなインスタンスモジュールをコールする。次いで、ランタイムは、ブロック1615において、プロデューサのインスタンスのクラス定義にアクセスする。次いで、ランタイムは、ブロック1620において、クラス定義におけるプロデューサのメソッド及びプロデューサ依存性宣言ステートメントにアクセスする。次いで、ランタイムは、ブロック1625において、プロデューサをターゲットシナリオのプロデューサグラフに追加する。ランタイムは、その後、ブロック1604へ移行する。
図3Aのブロック1603へ戻ると、プロデューサ生成がクローン化である場合には、ランタイムは、図34Bの入口点Bへ移行する。入口点Bから、ランタイムは、ブロック1626へ移行して、新インスタンスモジュールをコールし、空インスタンスをインスタンス生成する。次いで、ランタイムは、ブロック1627において、プロデューサキー及びリファレンスシナリオキーを伴うプロデューサから情報をコピーし、空インスタンスを埋める。次いで、ランタイムは、ブロック1628において、埋められたインスタンスでプロデューサをクローン化する。次いで、ランタイムは、ブロック1629において、ターゲットシナリオキーを伴うクローン化されたプロデューサをプロデューサグラフに追加する。その後、ランタイムは、ブロック1604へ移行する。
ブロック1604において、ランタイムは、プロデューサがシナリオのインパクトリストにある場合にインパクトを処理する。ブロック1604の詳細は、図34Gを参照して以下に述べる。次いで、ランタイムは、ブロック1630において、登録された各サブスクリプションに対してサブスクリプションフィルタリング基準を処理する。プロデューサが依存性のためにコールされる場合に、ランタイムは、1635において、プロデューサをプロデューサグラフへリンクする。次いで、ランタイムは、入口点Cへ移行する。
図34Cを参照すれば、ランタイムは、入口点Cからブロック1640へ移行して、プロデューサを非実行とマークする。幾つかの実施形態では、ランタイムは、ブロック1690において、プロデューサ非オーバーライドコマンドを受け取る。プロデューサ非オーバーライドコマンドに応答して、ランタイムは、ブロック1695において、プロデューサをオーバーライドされずとマークし、次いで、ブロック1640へ移行する。
ブロック1640から、ランタイムは、ブロック1645へ移行し、プロデューサが何らかの依存性を有し、且つオーバーライドされていないかどうかチェックする。プロデューサが依存性をもたず、且つオーバーライドされていない場合には、ランタイムは、入口点Dへ移行し、図34Aのブロック1665へ戻る。さもなければ、ランタイムは、ブロック1650へ移行する。ブロック1650において、ここで決定されるべき依存性宣言における各依存性に対して、ランタイムは、プロデューサの数を決定し、そしてその各々について新ストレス化プロデューサコマンドをインボークする。全ての依存プロデューサが存在し且つ実行されている場合には、ランタイムは、ブロック1655において、実行スタートログにプロデューサを追加し、そして入口点Eへ移行して、図34Aのブロック1660へ戻る。
図34Dは、本発明の一実施形態によるブロック1601の拡張フローチャートである。ランタイムは、先ず、ブロック3405において、シナリオ追跡構造及びシナリオキーを使用してインパクト経路追跡構造を探索する。次いで、ランタイムは、ブロック3410において、シナリオ追跡構造におけるインパクト経路追跡構造が既にインスタンス生成されたかどうか決定する。インパクト経路追跡構造が既にインスタンス生成された場合には、直接的及び間接的にインパクトされたプロデューサの両方が既に識別されている。従って、ランタイムは、ブロック3419へ移行して、フローを終了する。さもなければ、ランタイムは、ブロック3412へ移行する。ブロック3412では、インパクト経路追跡構造がインスタンス生成され、そしてシナリオ追跡構造に記憶される。次いで、ランタイムは、ブロック3413へ移行する。シナリオ定義における各直接的にインパクトされたプロデューサに対し、ランタイムは、シナリオ定義において対応プロデューサキー及びリファレンスシナリオキーを伴うプロデューサを探す。ランタイムは、ブロック3415において、このようなプロデューサが存在するかどうか決定する。このようなプロデューサが存在する場合には、ランタイムは、ブロック3417において、プロデューサを全ての祖先と共にインパクト経路追跡構造に追加し、次いで、ブロック3418へ移行する。さもなければ、ランタイムは、ブロック3417をスキップし、ブロック3418へ移行する。ブロック3418では、ランタイムは、更に多くの直接的にインパクトされたプロデューサがシナリオ定義にあるかどうかチェックする。もしあれば、ランタイムは、ブロック3413へ戻り、上述したオペレーションを繰り返す。さもなければ、ランタイムはブロック3419へ移行して、フローを終了する。
図34Eは、本発明の一実施形態によるブロック1602の拡張フローチャートである。ランタイムは、ブロック3420において、インパクト経路追跡構造が空であるかどうかチェックする。インパクト経路追跡構造が空である場合には、ランタイムはブロック3429へ移行する。さもなければ、ランタイムは、ブロック3422において、リファレンスシナリオキーを伴うプロデューサがインパクト経路追跡構造にあるかどうかチェックする。もしあれば、ランタイムは、ブロック3424において、プロデューサ生成を「クローン化」にセットする。さもなければ、ランタイムは、ブロック3426において、リファレンスシナリオを伴うプロデューサグラフにプロデューサが存在するかどうかチェックする。もし存在すれば、ランタイムは、ブロック3428において、プロデューサ生成を「無生成」にセットする。これは、ターゲットシナリオに対するプロデューサグラフの一部分しか複写させない最適化である。生成もクローン化もされないプロデューサは、リファレンスシナリオからターゲットシナリオに対するサブグラフへリンクされる。さもなければ、ランタイムは、ブロック3429へ移行する。ブロック3429では、ランタイムは、プロデューサ生成を「新生成」にセットする。
図34Fは、本発明の一実施形態による図34Aのブロック1605の拡張図である。ブロック1605において、ランタイムは、ストレス化プロデューサが既に存在するかどうかチェックする。幾つかの実施形態では、ランタイムは、クラスキー、インスタンスキー、メソッドキー、及びシナリオキーの組み合せがプロデューサテーブルに既に存在するかどうかチェックする。その組み合わせが存在する場合には、ストレス化プロデューサが存在する。さもなければ、ストレス化プロデューサは、存在しない。
図34Gは、本発明の一実施形態によるブロック1604の拡張フローチャートである。幾つかの実施形態では、プロデューサ出力を得てセットするための対応する専用インターフェイスがある。ブロック3430において、ランタイムは、プロデューサへのインパクトが相対的であるかどうかチェックする。もしそうでなければ、プロデューサへのインパクトは絶対的である。従って、ランタイムは、ブロック3436において、シナリオのインパクトリストからの出力インスタンスをターゲットシナリオにおけるプロデューサの新たな出力として指定する。次いで、ランタイムは、ブロック3440へ移行する。さもなければ、プロデューサへのインパクトは相対的であり、ランタイムは、ブロック3432において、プロデューサの現在出力を得る。次いで、ランタイムは、ブロック3434において、現在出力及びそれに対応する変換メソッド並びにシナリオのインパクトリストにおける対応変換パラメータを使用して、プロデューサの新たな出力を発生する。次いで、ランタイムは、ブロック3440へ移行する。
幾つかの実施形態では、ランタイムは、拡散値を現在出力に追加することにより新たな出力を発生することができる。或いは又、ランタイムは、現在出力に係数値を乗算することにより新たな出力を発生することができる。
ブロック3440において、ランタイムは、出力がフィールドである場合に、プロデューサの出力を、プロデューサ出力キャッシュ及びインスタンスに発生される新たな出力値にセットする。次いで、ランタイムは、ブロック3442において、プロデューサをオーバーライドされたとマークし、そして図34Bのブロック1630へ移行する。
図35A−35Bは、本発明の一実施形態によるストレス化プロデューサグラフ実行フローを示すフローチャートである。ブロック2200において、ランタイムは、実行スタートログにおけるプロデューサに基づき実行されるべき候補プロデューサのセットを候補プロデューサの現在セットとして選択する。次いで、ランタイムは、ブロック2205において、実行する準備のできた候補プロデューサの現在セットからのプロデューサのサブセットをレディプロデューサの現在セットとして選択する。レディプロデューサの現在セットにおける各プロデューサに対して、ランタイムは、ブロック2210において、プロデューサの形式をチェックする。一実施形態では、3つの形式のプロデューサ、即ち標準プロデューサ、ストレス化プロデューサ発生プロデューサ、及び依存性宣言プロデューサがある。
プロデューサが標準プロデューサである場合には、ランタイムは、ブロック2215へ移行し、プロデューサを実行する。次いで、ランタイムは、ブロック2220において、実行されたプロデューサに対するアブソービングサブスクリプション依存性を有する親を未完了とマークし、入口点Aへ移行する。
プロデューサがストレス化プロデューサ発生プロデューサである場合には、ランタイムは、ブロック3710へ移行して、プロデューサを実行する。次いで、ランタイムは、ブロック3720において、実行されたプロデューサに対するアブソービングサブスクリプション依存性を有する親を未完了とマークする。次いで、ランタイムは、ブロック3730において、発見されたプロデューサに対するストレス化プロデューサコマンドをインボークし、サブスクリプションをログしそして処理する。次いで、ランタイムは、ブロック3740において、実行スタートログに新たに追加されるプロデューサに基づき候補プロデューサのセットに追加する。次いで、ランタイムは、入口点Aへ移行する。
プロデューサが依存性宣言プロデューサである場合には、ランタイムは、ブロック2225において、依存性決定プロデューサを準備する。次いで、ランタイムは、ブロック2230において、依存性決定プロデューサを実行して、解明される準備のできた未解明の依存性を解明する。次いで、ランタイムは、ブロック2235において、発見されたプロデューサに対する新たなストレス化プロデューサコマンドをインボークし、サブスクリプションをログしそして処理する。ランタイムは、ブロック2240において、実行スタートログに新たに追加されたプロデューサを候補プロデューサのセットに追加する。次いで、ランタイムは、入口点Aへ移行する。
図35Bを参照すれば、ランタイムは、入口点Aからブロック2245へ移行する。ブロック2245において、ランタイムは、プロデューサを実行されたとマークし、そしてプロデューサ出力キャッシング及びインスタンスキャッシングを必要に応じて更新する。更に、ランタイムは、親プロデューサを、実行されるべき候補プロデューサのセットに追加し、非実行とマークする。ランタイムは、更に、候補及びレディプロデューサの現在セットから、実行されたプロデューサを除去する。ブロック2245から、ランタイムは、ブロック2250へ移行して、候補プロデューサのセットが空であるかどうかチェックする。もし空でない場合には、ランタイムは、入口点Bを経てブロック2205へ移行し、上述したフローを繰り返す。候補プロデューサのセットが空である場合には、ランタイムは、ブロック2255へ移行して、全てのサブスクリプションが完了されたかどうかチェックする。完了でなければ、ランタイムは、ブロック2260において、未完了のアブソービングサブスクリプションプロデューサを処理し、次いで、入口点Bを経てブロック2205へ戻る。さもなければ、全てのサブスクリプションが完了されており、ランタイムは、ブロック2248へ移行する。ブロック2248において、シナリオ追跡構造がスキャンされ、全てのインスタンス経路追跡構造が解除される。次いで、ランタイムは、ブロック2265へ移行し、フローを終了する。
手続き型言語
上述したように、適切に書かれた手続き型言語、非リフレクティブなオブジェクト指向の言語、及び非リフレクティブなオブジェクトベースの言語コードは、リフレクティブなオブジェクト指向の言語コードへと変換することができる。例えば、あるクラスは、データ構造と、データ構造のインスタンスへのポインタを第1パラメータとして有するスタティックファンクションのセットとを通してエミュレートすることができる。これらファンクションの中には、コンストラクタ及びデストラクタがある。コンストラクタは、データ構造に対するポインタを割り当てた後にランタイムによってインボークされ、データ構造内のエレメントに対するデフォールトを与え、又、デストラクタは、データ構造に対するポインタを解除した後にランタイムによりインボークされる。各クラスは、次のものを含むファイルを通してその記述を有する。1)データ構造;2)クラスを記述し、構造のサイズ及びファンクションに対するポインタのセットを保持する別の構造;3)コードを伴うスタティックファンクションのリスト(非リフレクティブなオブジェクト指向の言語及び非リフレクティブなオブジェクトベースの言語に対して、スタティックファンクションのコードは、リアルクラスのメソッドをスキャンし、そして関連メソッドの有効なインボケーションを遂行するスタティックなファンクションをメソッドごとに生成することにより自動的に発生される);及び4)各ファンクションの最上部のアノテーション(コメントがプロデューサ依存性宣言を保持する)、及びそれらの形式(コンストラクタ、デストラクタ、プロパティ、等)。手続き型の非リフレクティブなオブジェクト指向又は非リフレクティブなオブジェクトベースの言語におけるクラスのこの定義に加えて、ダイナミックインボケーションも具現化される。より詳細には、コンパイラーは、クラスごとに次のような初期化コード、即ち次のことを行うために(新クラスモジュールにより)一度コールされるコード、を発生する。1)クラスを記述する構造をインスタンス生成し、ファンクションに対するポインタを有効なスタティックファンクションで埋め;2)クラスのマップを伴うこの構造のインスタンス(クラス追跡構造)をクラス名に対応するキーで登録し;及び3)ファンクションのマップにおけるファンクションに対する全ポインタ(メソッド追跡構造)をファンクション名に対応するキーで登録する(ArgumentDependencies、SequencingDependencies、FieldDependencies、UpwardDependencies、WeaklyConstrainedDependencies、出力クラスキー、及び付加的なアノテーションと共に)。マッピングは、次のことを実行できる一般的なインボケーションファンクションの、ランタイムにおける具現化を許す。1)クラスのインスタンスを名前で(新インスタンスモジュールで)インスタンス生成し(より詳細には、ランタイムは、a)データ構造のサイズに基づいてメモリを割り当て、クラスを記述する構造に対するポインタを記憶するためにポインタにヘッダを追加し、それ故、スマートポインタ(例えば、それらの形式を問合せできるポインタ)を具現化し);及びb)マップからスタティックファンクションに対する関連ポインタを検索した後に適切なコンストラクタファンクションをインボークし);及び2)マップからスタティックファンクションに対する関連ポインタを検索した後に全てのパラメータが適切にパスしたとすればメソッドを名前でインボークする。ファンクションに対するポインタで識別されたファンクションにパラメータを適切にパスすることは、アッセンブリ言語や、入力及び出力パラメータに対するスタックへの/からのプッシュ及びポップエレメントを通して行われる。上述したメソッドは、データ構造の観念の存在、及び手続き型の非リフレクティブなオブジェクト指向又は非リフレクティブなオブジェクトベース言語におけるファンクションに対するポインタの観念の存在を仮定している。
例示的なオブジェクト指向のソースコードシンタックス
A.クライアントコード
本発明の一実施形態では、クライアントコードは、次のようなシンタックスをとる(ヘッダ形態で示す)
ProducerKey
New (String ClassKey, InstanceKey InstanceKey, String MethodKey);
Rumtime
New ()
AddProducerOfInterest (ProducerKey ProducerOfInterestKey);
SetProducerOutput (ProducerKey ProducerToOverrideKey, Object
ProducerOutputInstance);
Execute ();
ProducerKey及びRuntimeは、クラスであるが、New、AddProducerOfInterest、SetProducerOutput、及びExecuteは、メソッドである。AddProducerOfInterestは、テーブル2の問題とするプロデューサの状態に対して適切な値をもつ新プロデューサコマンドのインボケーションを生じさせる。ProducerOutputInstanceは、オーバーライドされたプロデューサ出力クラスのインスタンスである。従って、これは、対応するプロデューサ出力クラスコンストラクタを通してインスタンス生成される。
B.ステートメント
1.依存性宣言ステートメントシンタックス
argumentDependency=”Argument1Dependency; Argument2Dependency;...”
fieldDependency=”FieldDependency1; FieldDependency2:...”
sequencingDependency=”SequencingDependency1; SequencingDependency2;...”
upwardDependency=”UpwardDependency1; UpwardDependency2;...”
weaklyConstrainedDependency=”WeaklyConstrainedDependency1; WeaklyConstrainedDependency2;...”
unConstrainedDependency=”unConstrainedDependency1; unConstrainedDependency2;...”
2.依存性シンタックス
a.fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#C: ClassKey'::#I;'InstanceKey'::#M:'MethodKey'
b.argumentXDependencyシンタックス:
AerumentID::#C:'ClassKey'::#I:'InstanceKey'::#M:'MethodKey'
本発明の一実施形態では、ArgumentIDがシンタックスにおいて省略され、そしてargumentDependenciesが宣言される順序は、ArgumentIDを表す。従って、信頼性を向上させるために、ArgumentIDが追加される。
3.ショートカット及び非ショートカット
シンタックスは、非ショートカットの場合と同じであるが、プロデューサキーがショートカットを指示する前には#S::を使用する。
a.fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#S::#C: ClassKey'::#I;'InstanceKey'::#M:'MethodKey'
b.argumentXDependencyシンタックス:
AerumentID::#S::#C:'ClassKey'::#I:'InstanceKey'::#M:'MethodKey'
この場合に、依存性により指示されるプロデューサキーは、依存性決定プロデューサではない。他のシンタックス具現化は、ショートカットが、ある依存性形式(例えば、フィールド)に対するデフォールト依存性であると仮定し、そして#S::を省略することができる。この場合に、#DDPは、DDPの存在を指示するのに使用できる。
4.コンティンジェント及び非コンティンジェント
上述したように、<P>は、コンティンジェントなエレメントの前に入れることができる。
a.コンティンジェントクラス及びメソッドの例
1)fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#C:<P>'ClassDeterminationMethodKey'::#I:'InstanceKey'::#M:
<P>'MethodDeterminationMethodKey'
2)argumentXDependencyシンタックス:
ArgumentID::#C:<P>'ClassDeterminationMethodKey'::#I:'InstanceKey'::#M
M:<P>'MethodDeterminationMethodKey'
b.コンティンジェントメソッドの例
1)fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#C:'ClassKey'::#I:'InstanceKey'::#M:
<P>'MethodDeterminationMethodKey'
2)argumentXDependencyシンタックス:
ArgumentID::#C:'ClassKey'::#I:'InstanceKey'::#M
<P>'MethodDeterminationMethodKey'
c.コンティンジェントインスタンスの例
1)fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#C:'ClassKey'::#I:<P>'InstanceDeterminationMethodKey'::#M:
'MethodKey'
2)argumentXDependencyシンタックス:
ArgumentID::#C:'ClassKey'::#I
<P>'InstanceDeterminationMethodKey'
5.ショートハンド技術
親プロデューサエレメントと同一であると考えられるクラス、インスタンス又はメソッドのようなエレメントは、省略される。これは、典型的に、ショートカットフィールドに対するケースである。以下の例は、ショートハンド技術とショートカット宣言とを結合する(ショートカットは、#S::で示される)。
a.クラス及びインスタンスが省略される例
1)fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#S::#M:'MethodKey'
2)argumentXDependencyシンタックス:
ArgumentID::#S::#M:'MethodKey'
b.クラスが省略される例
1)fieldDependencyX, sequencingDependencyX,
upwardDependencyX, weaklyConstrainedDependencyX,
unConstrainedDependencyXシンタックス:
#S::#I:'InstanceKey'::#M:'MethodKey'
2)argumentXDependencyシンタックス:
ArgumentID::#S::#I:'InstanceKey'::#M:'MethodKey'
別の実施形態
添付図面のフローチャートは、本発明の実施形態によって遂行されるオペレーションの特定の順序を示しているが、このような順序は、例示に過ぎない(例えば、別の実施形態では、オペレーションを異なる順序で遂行し、あるオペレーションを結合し、あるオペレーションを重畳し、等々も行える)ことを理解されたい。
本発明を多数の実施形態について説明したが、当業者であれば、本発明は、ここに述べる実施形態に限定されず、特許請求の範囲の精神及び範囲内で変更及び修正を伴って実施できることが明らかであろう。従って、この説明は、限定のためではなく例示のためのものと考えるべきである。