(57)【要約】【課題】コンポーネント間の所望のネゴシエーションを実行する。【解決手段】第１、第２のコンポーネント間でネゴシエーションを実行する方法では、各コンポーネントはそれぞれのデータ処理サービスを具体化し、処理システムにおいて、ａ）第１のコンポーネントに関連する第１のネゴシエーションデータを確定すること、及びｂ）前記第２のコンポーネントに関連する第２のネゴシエーションデータを確定することであって、第１、第２のネゴシエーションデータは、それぞれ、ｉ）ネゴシエーションの選択肢、及びｉｉ）各選択肢に関連するそれぞれの重み付けを含むネゴシエーションリストを示す、こと、ｃ）前記第１のネゴシエーションリストを前記第２のネゴシエーションリストと比較すること、並びにｄ）前記比較及び前記それぞれの重み付けの結果を使用して前記ネゴシエーションの選択肢のうちの１つを選択すること、を含む。【選択図】図８
2014044748.tif 000002
【特許請求の範囲】
【請求項１】
第１のコンポーネントと第２のコンポーネントとの間のネゴシエーションを実行する方法であって、各コンポーネントはそれぞれのデータ処理サービスを具体化し、処理システムにおいて、
ａ）前記第１のコンポーネントに関連する第１のネゴシエーションデータを確定すること、該第１のネゴシエーションデータは、
ｉ）少なくとも１つのネゴシエーションの選択肢、及び
ｉｉ）各ネゴシエーションの選択肢に関連するそれぞれの重み付け
を含む第１のネゴシエーションリストを示し、
ｂ）前記第２のコンポーネントに関連する第２のネゴシエーションデータを確定すること、該第２のネゴシエーションデータは、
ｉ）少なくとも１つのネゴシエーションの選択肢、及び
ｉｉ）各ネゴシエーションの選択肢に関連するそれぞれの重み付け
を含む第２のネゴシエーションリストを示し、
ｃ）前記第１のネゴシエーションリストを前記第２のネゴシエーションリストと比較すること、並びに
ｄ）前記比較及び前記それぞれの重み付けの結果を使用して前記ネゴシエーションの選択肢のうちの１つを選択すること
を含む方法。
【請求項２】
所定のアルゴリズムを使用して前記ネゴシエーションの選択肢のうちの１つを選択することを含む請求項１に記載の方法。
【請求項３】
ａ）両ネゴシエーションリストに共通する任意のネゴシエーションの選択肢を選択すること、及び
ｂ）各選択された共通のネゴシエーションの選択肢に対し、各ネゴシエーションリストにおける前記それぞれの重み付けから形成される結合された重み付けを確定すること、及び
ｃ）前記確定された結合された重み付けに従って前記共通のネゴシエーションの選択肢のうちの１つを選択すること
により、前記処理システムにおける前記ネゴシエーションリストを比較することを含む、請求項１に記載の方法。
【請求項４】
前記処理システムにおいて、
ａ）各ネゴシエーションリストにおける前記重み付けを正規化すること、
ｂ）各ネゴシエーションリストにおける前記それぞれの重み付けの平均を確定するこ  とにより、前記結合された重み付けを確定すること
を含む、請求項３に記載の方法。
【請求項５】
前記１つの共通のネゴシエーションの選択肢を、前記処理システムにおいて、
ａ）結合された重み付けが最も高い重み付けを有する前記共通のネゴシエーションの選択肢を選択すること、並びに
ｂ）少なくとも２つの共通のネゴシエーション選択肢が等しく最も高い結合された重み付けを有する場合、
ｉ）前記少なくとも２つの共通のネゴシエーション選択肢の各々に対して確定される平均自乗誤差、及び
ｉｉ）任意の規則の使用
のうちの少なくとも１つを使用すること
によって選択することを含む請求項３に記載の方法。
【請求項６】
前記処理システムにおいて、ｎｅｇｏｔｉａｔｉｏｎコンポーネントを実装することによって、前記ネゴシエーションを実装することを含む請求項１に記載の方法。
【請求項７】
前記処理システムは、前記第１のコンポーネントに対応する第１のコンポーネントサーバを実装する請求項１に記載の方法。
【請求項８】
前記処理システムにおいて、
ａ）コンポーネント要求を受け取ること、及び
ｂ）前記コンポーネント要求に応じて前記第１のコンポーネントサーバを実装すること
を含む請求項７に記載の方法。
【請求項９】
前記処理システムにおいて、前記第２のコンポーネントに対応する第２のコンポーネントサーバを実装する第２の処理システムから前記第２のネゴシエーションデータを受け取ることを含む請求項８に記載の方法。
【請求項１０】
前記処理システムにおいて、
ａ）少なくとも１つのエージェントを実装すること、及び
ｂ）該少なくとも１つのエージェントに対し、前記第２のコンポーネントサーバによって実装される１つ又は複数のエージェントと通信させることによって、前記第２のネゴシエーションデータを確定することを含む、請求項９に記載の方法。
【請求項１１】
前記コンピュータシステムにおいて、
ａ）接続要求の一部として接続データを受け取り、該接続データは、前記第２のコンポーネントサーバに関連する前記１つ又は複数のエージェントのエージェントアドレスを含むこと、及び
ｂ）前記接続要求に応じて前記第１のコンポーネントサーバを実装することを含む請求項１０に記載の方法。
【請求項１２】
前記処理システムにおいてコードフラグメントを生成し、該コードフラグメントは前記ネゴシエーションの結果によって決まることを含む請求項１に記載の方法。
【請求項１３】
各コンポーネントは、対応するコンポーネントサーバを実装することによって実装され、各コンポーネントサーバは、適当な処理システムで実行されると、該処理システムに対し、
ａ）ネゴシエーション、
ｂ）所定のデータ処理サービス、及び
ｃ）それぞれのコードフラグメントの生成
のうちの少なくとも１つを実行させる実行可能コードから形成される請求項１に記載の方法。
【請求項１４】
コンポーネントの組み合わせにおける少なくとも１つの他のコンポーネントとのネゴシエーションを実行するコンポーネントであって、適当にプログラムされた処理システムで実装されると、該処理システムに対し、
ａ）第１のコンポーネントに関連する第１のネゴシエーションデータを確定させ、該第１のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーションの選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第１のネゴシエーションリストを示し、
ｂ）前記コンポーネントに関連する第２のネゴシエーションデータを確定させ、該第２のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第２のネゴシエーションリストを示し、
ｃ）前記第１のネゴシエーションリストを前記第２のネゴシエーションリストと比較させ、且つ、
ｄ）前記比較の結果及び前記それぞれの重み付けを使用して前記ネゴシエーション選択肢のうちの１つを選択させる、計算機によって実行可能なコードによって具体化されるコンポーネント。
【発明の詳細な説明】
【技術分野】
【０００１】
（発明の背景）
本発明は、コンピュータによって実行可能なコードを生成する方法及び装置に関し、特に、各々が、それぞれのコードの断片の生成等、データを処理する各サービスに対応するコンポーネントを使用して、コンピュータによって実行可能なコードを生成する方法及び装置に関する。
【背景技術】
【０００２】
（背景技術の説明）
本明細書におけるいずれの従来技術への参照も、従来技術が通常の一般的な常識を成すと認めるものではなく、又は示唆ものでもない。また、そのように解釈されるべきではない。
【０００３】
現在のソフトウェア開発技法には、たとえば以下に例示する多数の問題がある。
・バグ又はミス−高レベルのソフトウェアの欠陥。
・ソフトウェアの肥大化−実行可能コードの容量が、その機能に不相応に大幅に増大すること。
・複雑性の限界−増大する要求による複雑性が、こうしたシステムを設計する能力を脅かす。
・予測不能性−開発コスト、スケジュール、パフォーマンス、又は資源使用量が予測不能である。
・生産性−過去１０年において開発者の生産性は著しく向上していない。
【０００４】
特に、これらの問題は、現在のソフトウェア生成技術に存在するものであり、現在のソフトウェア生成技術では、一般化されていないため最適化されていないライブラリを使用して、限られたレベルでのみコードを再使用することによって、走り書き（scratch）からコードを作成することが、かなりの程度まで、熟練したプログラマに必要とされる。移植性が高く且つ条件（コンテキスト；context(s)）から独立したコードを生産することに重きが置かれている。
【０００５】
諸問題を解決するために複数の以下の試みがなされた。
・プログラマをマシンコードから切り離すことを目指した、第３世代言語、第４世代言語及び第５世代言語の開発が、初期のいくらかの生産性における成功に貢献した。プログラム言語が今日まで、生産性向上を追求するにあたっての核心であり続けているほどに、初期の生産性増大は成功した。
・データを、そのデータの処理に使用されるコードと一緒にカプセル化する新しいタイプの抽象化であるオブジェクト指向プログラミングが、許容を達成しているが、いかなる有効な生産性の向上も提供していない。
・大きなソフトウェアの開発の複雑性の管理を支援することを目指したコンピュータ支援ソフトウェア工学（ＣＡＳＥ）。
・以前の知的努力を再使用しようとする取り組みであるコード再使用。
・数学的証明を利用して正確性を検証するとともに、ソフトウェア開発に伴う多数の欠陥及びバグに取り組む、形式的方法。
・履歴コードから知的内容を抽出するデコンパイラ。
【０００６】
しかし、これらの構想にもかかわらず、ソフトウェア生産の向上においては、ほとんど進歩がない。
【０００７】
同時係属出願ＰＣＴ／ＡＵ０３／０１４７４号は、実行可能コードが生成されるのを可能にするデータ処理を実行する技術について記載する。特に、このシステムは、データ処理サービスをカプセル化するためにコンポーネントを利用する。これは、コンポーネントを結合することにより、連続したデータ処理が実行されるのを可能にし、それによりコンピュータによって実行可能なコードが生成されるのを可能にする。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ソフトウェア生産の向上を向上させるコード生成方法を提供する。
【課題を解決するための手段】
【０００９】
［発明の概要］
第１の幅広い形態において、本発明は、所望の機能を実行する実行可能コードを生成する方法を提供し、本方法は、
ａ）所望の機能に基づいて、
ｉ）実装されるコンポーネント、
ｉｉ）コンポーネント間の接続
を示すコンポーネントの組み合わせを定義すること、
ｂ）コンポーネントを組み合わせたコンポーネントであって、該コンポーネントのうちの少なくともいくつかは接続を使用して通信し且つコードフラグメントを生成し、コンポーネントのうちの少なくとも２つは条件を確定するために通信し、コードフラグメントのうちの１つ又は複数は、少なくとも部分的に、確定された条件に基づいたコンポーネントが実装されるようにすること、
ｃ）生成されたコードフラグメントを結合することによって、実行可能コードを形成すること、
ｄ）実行可能コードを計算機の処理システムに提供することよって該実行可能コードの該処理システムによる実行により、該処理システムが所望の機能を実行するようにすること
を含む。
【００１０】
通常、実行可能コードは、コンポーネントを実装するために使用される。
【００１１】
通常、コードフラグメントは、実行可能コードの断片である。
【００１２】
通常、実行可能コードは、
ａ）前記条件、
ｂ）前記コンポーネントの組み合わせ、
ｃ）コンポーネント間の１つ又は複数の合意、及び
ｄ）１つ又は複数のネゴシエーションによる設定
のうちの少なくとも１つによって定義される方法で前記コードフラグメントを連結することによって形成される。
【００１３】
通常、結合は、
ａ）コンポーネントのうちの１つ又は複数、及び
ｂ）処理システム
のうちの少なくとも１つによって実行される。
【００１４】
通常、本方法は、コンポーネントに対しデータシーケンスで提供されるデータ部分を処理させることを含み、データ部分は、実行可能コードの断片であり、処理は、
ａ）データ部分をシーケンスの所定の場所に追加すること、
ｂ）シーケンス内の第１の場所から第２の場所にデータ部分を移動させること、
ｃ）シーケンスからデータ部分を除去すること、及び
ｄ）シーケンスのデータ部分を変更すること
を含む。
【００１５】
通常、本方法は、コンポーネントに対し、それらのそれぞれの条件を確定するようにネゴシエートさせることを含む。
【００１６】
通常、本方法は、少なくともメモリ、スタック及びレジスタを含む処理システムを使用して実行され、条件は、レジスタ、スタック及びメモリのうちの少なくとも１つの状態のうちの少なくとも１つを含む。
【００１７】
通常、条件は、
ａ）定義されたコンポーネントの組み合わせにおける他のコンポーネント、
ｂ）定義されたコンポーネントの組み合わせにおける他のコンポーネントとの合意、
ｃ）定義されたコンポーネントの組み合わせにおける他のコンポーネントとのネゴシエーションの結果、及び
ｄ）偶発的要因
のうちの少なくとも１つを含む。
【００１８】
通常、本方法は、データ処理を
ａ）ディザリング、
ｂ）メッシング、及び
ｃ）遮蔽
のうちの少なくとも１つによる条件に依存することを含む。
【００１９】
通常、本方法は、少なくとも１つのコンポーネントに対し、他のコンポーネントの１つ又は複数のエージェントと通信する１つ又は複数のエージェントを生成することを含む。
【００２０】
通常、エージェントは、所定の順序で２つ以上の他のエージェントと通信する。
【００２１】
通常、順序は、
ａ）コンポーネントの組み合わせ、及び
ｂ）１つ又は複数のネゴシエーションによる設定
のうちの少なくとも１つによって定義される。
【００２２】
通常、本方法は、通信ネットワークを介して１つ又は複数のコンポーネント処理システムに接続される処理システムを使用して実行され、各コンポーネント処理システムは、１つ又は複数のそれぞれのコンポーネントを実装するようになっている。
【００２３】
通常、各コンポーネント処理システムは、実行可能コードから形成され、且つコンポーネント処理システムに対し、
ａ）所定のデータ処理サービス、及び
ｂ）それぞれのコードフラグメントの生成
のうちの少なくとも１つを実行させる、コンポーネントサーバを実装する。
【００２４】
通常、コンポーネントサーバは、本発明の第１の形態の方法を使用して生成される実行可能コードから形成される。
【００２５】
通常、本方法は、処理システムにおいて、且つコンポーネントの組み合わせの各コンポーネントに対し
ａ）コンポーネントの仕様を受け取ること、及び
ｂ）コンポーネントの仕様を使用してコンポーネント要求を生成し、コンポーネント要求は、コンポーネント処理システムに転送されることによって、コンポーネントに対応するコンポーネントサーバの実装がもたらされること
を含む。
【００２６】
通常、本方法は、各コンポーネント処理システムに対し、
ａ）少なくとも１つのエージェントを実装させること、及び
ｂ）少なくとも１つのエージェントに対し、１つ又は複数の他のコンポーネント処理システムによって実装される１つ又は複数のエージェントと通信させるようにさせることを含む。
【００２７】
通常、本方法は、コンポーネント処理システムへのエージェント接続を表す接続データを提供することによって、少なくとも１つのエージェントが１つ又は複数の他のエージェントと通信することができるようにすることを含む。
【００２８】
通常、接続データは、１つ又は複数の他のエージェントに対するアドレスを含み、アドレスは、エージェントを通信できるようにするためのエージェントメッセージが転送されるアドレスを示す。
【００２９】
通常、コンポーネント要求は接続データを含む。
【００３０】
通常、コンポーネントの組み合わせを確定する方法は、処理システムにおいて、
ａ）利用可能なコンポーネントのリストからコンポーネントを選択すること、及び
ｂ）コンポーネントのそれぞれのエージェント間の接続を定義すること
を含む。
【００３１】
通常、本方法は、処理システムに対し、
ａ）１つ又は複数の選択されたコンポーネントのグラフィカル表現を生成させること、及び
ｂ）ユーザから受け取られた入力コマンドに応じてグラフィカル表現を処理することによって、コンポーネントの組み合わせを定義させること
を含む。
【００３２】
通常、本方法は、
ａ）選択されたコンポーネントが１つ又は複数の選択肢を有するか否かを判断すること、及び
ｂ）肯定的な判断に応じて、
ｉ）選択肢のうちの１つ又は複数を設定すること、及び
ｉｉ）各設定された選択肢の指示を、対応するコンポーネントを実装するために使用されるコンポーネント処理システムに転送すること
を含む。
【００３３】
通常、本方法は、
ａ）コンポーネントの仕様から１つ又は複数の選択肢を確定すること、
ｂ）選択肢のうちの１つ又は複数を設定すること、及び
ｃ）設定された選択肢に基づいて更新されたコンポーネントの仕様を確定すること
を含む。
【００３４】
通常、本方法は、第２の処理システムに対し、
ａ）いくつかのコンポーネントの詳細を確定させること、及び
ｂ）詳細を使用して第１の処理システムを介して利用可能なコンポーネントのリストをユーザに提供させること
を含む。
【００３５】
通常、詳細は、
ａ）それぞれのデータ処理サービスの指示、
ｂ）コンポーネントのグラフィカル表現、及び
ｃ）他のコンポーネントに必要な任意の接続の指示
のうちの少なくとも１つを含む、コンポーネントの仕様を含む。
【００３６】
通常、本方法は、第２の処理システムに対し、
ａ）コンポーネントの実装に関連する１つ又は複数の基準を表すパフォーマンス情報を確定させること、及び
ｂ）パフォーマンス情報をユーザに提供し、ユーザはパフォーマンス情報に従ってコンポーネントを選択する、提供させること
を含む。
【００３７】
通常、パフォーマンス情報は、
ａ）コンポーネントを実装するエンティティの指示、
ｂ）エンティティが格納される位置の指示、
ｃ）コンポーネントを実装するための時間の指示、
ｄ）それぞれのコンポーネントを実装することに関するコストの指示、及び
ｅ）コンポーネントの出来を示す格付け
のうちの少なくとも１つを含む。
【００３８】
通常、本方法は、各コンポーネントの使用に対して費用を課すことにより利益を生じさせることを含む。
【００３９】
通常、本方法は、
ａ）コンポーネントを実装するそれぞれのエンティティに対し利益の少なくとも一部を提供すること、及び
ｂ）第２の処理システムの運営者に対し、利益の少なくとも一部を保持させること
を含む。
【００４０】
第２の形態において、本発明は、所望の機能に基づいて組み合わされるコンポーネントの組み合わせを実装することにより所望の機能を実行する計算機が実行可能なコードを生成する方法であって、本方法は、処理システムにおいて、
ａ）コンポーネントの組み合わせから
ｉ）実装されるコンポーネント、
ｉｉ）コンポーネントのそれぞれの間の接続
を確定すること、
ｂ）各コンポーネントに対し、任意の必要な接続を表す接続データを含み、コンポーネントの実装を要求するコンポーネント要求を生成すること、
ｃ）コンポーネント要求をコンポーネント処理システムに転送することによりコンポーネント処理システムのうちの少なくともいくつかに対し接続を使用して通信させ且つコードフラグメントを生成させ、コンポーネント処理システムのうちの少なくとも２つは、条件を確定するために通信し、コードフラグメントのうちの１つ又は複数は、少なくとも部分的に、確定された条件に基づいていること、
ｄ）コンポーネント処理システムからコードフラグメントを受け取り、コードフラグメントは、結合されると、実行可能コードを形成すること
を含む。
【００４１】
通常、本方法は、
ａ）実行可能コードを形成するコードフラグメントを結合すること、及び
ｂ）所定の順序でフラグメントを受け取ること
のうちの少なくとも１つを含む。
【００４２】
通常、コンポーネントの組み合わせを確定する方法は、
ａ）利用可能なコンポーネントのリストからコンポーネントを選択すること、及び
ｂ）コンポーネントのそれぞれのエージェントの間の接続を定義すること
を含む。
【００４３】
通常、本方法は、処理システムを使用して実行され、処理システムにおいて、且つコンポーネントの組み合わせにおける各コンポーネントに対し
ａ）コンポーネントの仕様を受け取ること、及び
ｂ）コンポーネントの仕様を使用してコンポーネント要求を生成し、コンポーネント要求はコンポーネント処理システムに転送されることによって、コンポーネントに対応するコンポーネントサーバの実装がもたらされること
を含む。
【００４４】
第３の形態において、本発明は、所望の機能を実行する実行可能コードを生成するために使用されるコンポーネントを提供する方法を提供し、本方法は、実装されるコンポーネントとコンポーネントの間の接続とを示すコンポーネントの組み合わせを使用し、処理システムにおいて、
ａ）任意の必要な接続を表す接続データを含むコンポーネント要求を受け取ること、
ｂ）接続を使用して他のコンポーネント処理システムと通信することによって、条件を確定すること、
ｃ）確定された条件に基づいてコードフラグメントを生成すること、及び
ｄ）コードフラグメントを別の処理システムに転送し、コードフラグメントは、他のコードフラグメントと結合されると実行可能コードを形成し、実行可能コードは、適当な処理システムによって実行されると、処理システムに対し所望の機能を実行させること、
を含む。
【００４５】
第４の形態において、本発明は、データ処理サービスを提供するためにコンポーネントサーバを実装し、計算機が実行可能なコードを生成する方法を提供し、本方法は、
ａ）コンポーネントの組み合わせを確定し、コンポーネントの組み合わせは少なくとも２つのコンポーネントシーケンスを含み、各コンポーネントシーケンスはデータ処理サービスを提供するそれぞれの方法を表し、コンポーネントの組み合わせは、
ｉｉ）実装されるコンポーネント、
ｉｉ）コンポーネント間の接続
を示し、
ｂ）コンポーネントの組み合わせにおけるコンポーネントが実装されるようにし、コンポーネントのうちの少なくともいくつかは接続を使用して通信し、且つ各コンポーネントシーケンスに対応する少なくとも１つのコードフラグメントを含むコードフラグメントを生成すること、
ｃ）生成されたコードフラグメントを結合することによって実行可能コードを生成すること、及び
ｄ）実行可能コードを処理システムに提供し、実行可能コードの処理システムによる実行により、処理システムが、各コンポーネントシーケンスに対応する生成されたコードフラグメントのうちの少なくとも１つを実行することによってコンポーネントサーバを実装するようにすることによって、データ処理をそれぞれの方法で提供すること
を含む。
【００４６】
通常、実行可能コードは、いずれのコードフラグメントが実行されるかを選択する機能を備えることを含む。
【００４７】
通常、コンポーネントの組み合わせは、実装されると、選択コードフラグメントの生成をもたらす選択コンポーネントシーケンスを含み、コンポーネントサーバが実装されると、選択コードフラグメントは実行するためにコードフラグメントのうちの１つを選択する。
【００４８】
通常、コードフラグメント選択は条件に依存する。
【００４９】
通常、条件は、データ処理が実行される条件を反映する。
【００５０】
通常、コードフラグメントの選択は、コンポーネントサーバと１つ又は複数の他のコンポーネントサーバとのネゴシエーションの結果に応じて実現される。
【００５１】
通常、コードフラグメントの選択は、データ処理サービスが提供される方法に関連する選択肢に対応する。
【００５２】
通常、選択肢は、コンポーネントサーバの実装を要求するエンティティによって選択される。
【００５３】
通常、コンポーネントサーバは、処理結果のコンポーネントの組み合わせの一部として使用される処理結果のコンポーネントを実装するために使用される。
【００５４】
通常、処理結果のコンポーネントは、処理結果のコンポーネントの組み合わせを実装するエンティティによって定義可能な１つ又は複数の関連選択肢を含み、選択肢は、いずれのコードフラグメントが実行されるかを選択するために使用される。
【００５５】
通常、データ処理サービスは、処理結果のコードフラグメントの生成を含み、処理結果のコードフラグメントは、実行されるコードフラグメントによって決まる。
【００５６】
通常、各コンポーネントは、対応するコンポーネントサーバを実装することによって実装され、各コンポーネントサーバは、適当な処理システムにおいて実行されると、処理システムに対し、
ａ）所定のデータ処理サービス、及び
ｂ）それぞれのコードフラグメントの生成
のうちの少なくとも１つを実行させる実行可能コードから形成される。
【００５７】
第５の形態において、本発明は、処理システムを使用してコンポーネントに具体化されるサービスを提供する本方法は、処理システムに対し、
ａ）コンポーネント要求を受け取らせること、及び
ｂ）本発明の第１の幅広い形態の方法によって生成されるアプリケーションソフトウェアを実行させること
を含む。
【００５８】
第６の形態において、本発明は、コンポーネントの組み合わせを実装することによりコンポーネントサーバを実装し、計算機が実行可能コードを生成する方法であって、コンポーネントの組み合わせは所望のデータ処理サービスに基づいており、且つ少なくとも２つのコンポーネントシーケンスを含み、各コンポーネントシーケンスは、データ処理サービスを提供するそれぞれの方法を表す、方法であり、処理システムにおいて、
ａ）コンポーネントの組み合わせから
ｉ）実装されるコンポーネント、
ｉｉ）コンポーネントのそれぞれの間の接続
を確定すること、
ｂ）各コンポーネントに対し、コンポーネントの実装を要求するコンポーネント要求を生成し、コンポーネント要求は、任意の必要な接続を表す接続データを含むこと
ｃ）コンポーネント要求をコンポーネント処理システムに転送することによって、コンポーネント処理システムのうちの少なくともいくつかに対し、接続を使用して通信させ且つ各コンポーネントシーケンスに対応する少なくとも１つのコードフラグメントを生成させること、及び
ｄ）コンポーネント処理システムからコードフラグメントを受け取り、コードフラグメントは、結合されると、実行可能コードを形成し、実行可能コードは、適当な処理システムによって実行されると、処理システムに対しコンポーネントサーバを実装させ、コンポーネントサーバは、生成されたコードフラグメントのうちの少なくとも１つを実行することによりデータ処理サービスを提供すること
を含む。
【００５９】
第７の形態において、本発明は、コンポーネントサーバを実装するため計算機が実行可能なコードを生成するために使用されるコンポーネントを提供することによって、コンポーネントサーバがデータ処理サービスを提供することができるようにする方法であって、実装されるコンポーネントとコンポーネント間の接続とを示すコンポーネントの組み合わせを使用し、コンポーネントの組み合わせは少なくとも２つのコンポーネントシーケンスを含み、各コンポーネントシーケンスはデータ処理サービスを提供するそれぞれの方法を表し、本方法は、処理システムにおいて、
ａ）任意の必要な接続を表す接続データを含むコンポーネント要求を受け取ること、
ｂ）接続を使用して他のコンポーネント処理システムと通信すること、
ｃ）確定された条件に基づいてコードフラグメントを生成すること、及び
ｄ）コードフラグメントを別の処理システムに転送し、コードフラグメントは、他のコードフラグメントと結合されると実行可能コードを形成し、実行可能コードは、適当な処理システムによって実行されると、処理システムに対しコンポーネントサーバを実装させ、コンポーネントサーバは生成されたコードフラグメントのうちの少なくとも１つを実行し、それによりデータ処理サービスを提供すること
を含む。
【００６０】
第８の形態において、本発明は、第１のコンポーネントと第２のコンポーネントとの間のネゴシエーションを実行する方法であって、各コンポーネントはそれぞれのデータ処理サービスを具体化し、本方法は、処理システムにおいて、
ａ）第１のコンポーネントに関連する第１のネゴシエーションデータを確定すること、第１のネゴシエーションデータは、
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第１のネゴシエーションリストを示し、
ｂ）第２のコンポーネントに関連する第２のネゴシエーションデータを確定すること、第２のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第２のネゴシエーションリストを示し、
ｃ）第１のネゴシエーションリストを第２のネゴシエーションリストと比較すること、並びに
ｄ）比較及びそれぞれの重み付けの結果を使用してネゴシエーションの選択肢のうちの１つを選択すること
を含む。
【００６１】
通常、本方法は、所定のアルゴリズムを使用してネゴシエーション選択肢のうちの１つを選択することを含む。
【００６２】
通常、本方法は、
ａ）両ネゴシエーションリストに共通の任意のネゴシエーション選択肢を選択すること、及び
ｂ）各選択された共通のネゴシエーション選択肢に対し、各ネゴシエーションリストにおけるそれぞれの重み付けから形成される結合された重み付けを確定すること、及び
ｃ）確定された結合された重み付けに従って共通のネゴシエーションの選択肢のうちの１つを選択すること
により、処理システムにおけるネゴシエーションリストを比較することを含む。
【００６３】
通常、本方法は、処理システムにおいて、
ａ）各ネゴシエーションリストにおける重み付けを正規化すること、
ｂ）各ネゴシエーションリストにおけるそれぞれの重み付けの平均を確定することにより、結合された重み付けを確定すること
を含む。
【００６４】
通常、本方法は、１つの共通のネゴシエーション選択肢を、処理システムにおいて、
ａ）結合された重み付けが最も高い重み付けを有する共通のネゴシエーションの選択肢を選択すること、並びに
ｂ）少なくとも２つの共通のネゴシエーションの選択肢が等しく最も高い結合された重み付けを有する場合、
ｉ）少なくとも２つの共通のネゴシエーションの選択肢の各々に対して確定される平均自乗誤差、及び
ｉｉ）任意の規則の使用
のうちの少なくとも１つを使用すること
によって選択することを含む。
【００６５】
通常、本方法は、処理システムにおいて、ｎｅｇｏｔｉａｔｉｏｎコンポーネントを実装することであって、それによりネゴシエーションを実装することを含む。
【００６６】
通常、処理システムは、第１のコンポーネントに対応する第１のコンポーネントサーバを実装する。
【００６７】
通常、本方法は、処理システムにおいて、
ａ）コンポーネント要求を受け取ること、及び
ｂ）コンポーネント要求に応じて第１のコンポーネントサーバを実装すること
を含む。
【００６８】
通常、本方法は、処理システムにおいて、第２のコンポーネントに対応する第２のコンポーネントサーバを実装する第２の処理システムから第２のネゴシエーションデータを受け取ることを含む。
【００６９】
通常、本方法は、処理システムにおいて、
ａ）少なくとも１つのエージェントを実装すること、及び
ｂ）少なくとも１つのエージェントに対し、第２のコンポーネントサーバによって実装される１つ又は複数のエージェントと通信させることよって、第２のネゴシエーションデータを確定すること
を含む。
【００７０】
通常、本方法は、コンピュータシステムにおいて、
ａ）接続要求の一部として接続データを受け取ることであって、接続データは、第２のコンポーネントサーバに関連する１つ又は複数のエージェントのエージェントアドレスを含む、受け取ること、及び
ｂ）接続要求に応じて第１のコンポーネントサーバを実装すること
を含む。
【００７１】
通常、本方法は、処理システムにおいてコードフラグメントを生成し、コードフラグメントはネゴシエーションの結果によって決まることを含む。
【００７２】
通常、各コンポーネントは、対応するコンポーネントサーバを実装することによって実装され、各コンポーネントサーバは、適当な処理システムで実行されると、処理システムに対し、
ａ）ネゴシエーション、
ｂ）所定のデータ処理サービス、及び
ｃ）それぞれのコードフラグメントの生成
のうちの少なくとも１つを実行させる実行可能コードから形成される。
【００７３】
第９の形態において、本発明は、所望の機能を実行する実行可能コードを生成する方法を提供し、本方法は、
ａ）所望の機能に基づいてコンポーネントの組み合わせを定義し、コンポーネントの組み合わせは、ネゴシエーションを実行する少なくとも２つのコンポーネントを含むこと、及び
ｂ）コンポーネントの組み合わせにおけるコンポーネントが実装されるようにし、コンポーネントのうちの少なくともいくつかが通信して、結合されると実行可能コードを形成するコードフラグメントを生成し、少なくとも２つのコンポーネントは、共通のネゴシエーションの選択肢を確定するために通信するようになっており、コードフラグメントのうちの少なくとも１つは、確定されたネゴシエーションの選択肢に少なくとも部分的に依存して生成されること
を含む。
【００７４】
通常、本方法は、所定のアルゴリズムを使用していくつかのあり得るネゴシエーション選択肢から共通のネゴシエーション選択肢を選択することを含む。
【００７５】
通常、ネゴシエーションデータは、プロトコルに従って定義され、プロトコルは、いくつかの最小の所定のネゴシエーション選択肢を定義する。
【００７６】
通常、本方法は、少なくとも２つのコンポーネントの相対的な実装に関する条件を定義するために使用される。
【００７７】
第１０の幅広い形態において、本発明は、コンポーネントの組み合わせを実装することにより所望の機能を実行し、計算機が実行可能なコードを生成する方法であって、コンポーネントの組み合わせは所望の機能に基づき、且つネゴシエーションを実行する少なくとも２つのコンポーネントを含み、本方法は、
ａ）コンポーネントの組み合わせから
ｉ）実装されるコンポーネント、
ｉｉ）コンポーネントのそれぞれの間の接続
を確定すること、
ｂ）各コンポーネントに対し、コンポーネントの実装を要求するコンポーネント要求を生成し、コンポーネント要求は、任意の必要な接続を表す接続データを含むこと、
ｃ）コンポーネント要求をコンポーネント処理システムに転送することによって、コンポーネント処理システムの少なくともいくつかに対し、接続を使用して通信させ且つコードフラグメントを生成させ、コンポーネント処理システムのうちの少なくとも２つは、いくつかの利用可能なネゴシエーションの選択肢から共通のネゴシエーションの選択肢を確定するために通信し、コードフラグメントのうちの１つ又は複数は、少なくとも部分的に共通のネゴシエーション選択肢に基づいていること、
ｄ）コンポーネント処理システムからコードフラグメントを受け取り、コードフラグメントは、結合されると、実行可能コードを形成すること
を含む。
【００７８】
第１１の形態において、本発明は、コンポーネントの組み合わせにおける少なくとも１つの他のコンポーネントとのネゴシエーションを実行するコンポーネントであって、当該コンポーネントは、適当にプログラムされた処理システムで実装されると、処理システムに対し、
ａ）第１のコンポーネントに関連する第１のネゴシエーションデータを確定させ、第１のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第１のネゴシエーションリストを示し、
ｂ）コンポーネントに関連する第２のネゴシエーションデータを確定させ、第２のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第２のネゴシエーションリストを示し、
ｃ）第１のネゴシエーションリストを第２のネゴシエーションリストと比較させ、且つ、
ｄ）比較の結果及びそれぞれの重み付けを使用してネゴシエーション選択肢のうちの１つを選択させる、コンピュータによって実行可能なコードによって具体化される。
【００７９】
別の形態において、本発明は、第１のコンポーネント群と第２のコンポーネント群との間のネゴシエーションを実行する方法であって、各コンポーネントはそれぞれのデータ処理サービスを具体化し、本方法は、処理システムにおいて、
ａ）第１のコンポーネント群に関連する第１のネゴシエーションデータを確定し、第１のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第１のネゴシエーションリストを示し、
ｂ）第２のコンポーネント群に関連する第２のネゴシエーションデータを確定し、第２のネゴシエーションデータは
ｉ）少なくとも１つのネゴシエーション選択肢、及び
ｉｉ）各ネゴシエーション選択肢に関連するそれぞれの重み付け
を含む第２のネゴシエーションリストを示し、
ｃ）第１のネゴシエーションリストを第２のネゴシエーションリストと比較すること、及び
ｄ）比較の結果及びそれぞれの重み付けを使用してネゴシエーション選択肢のうちの１つを選択すること
を含む。
【００８０】
別の形態において、本発明は、所望の機能を実行し、計算機が実行可能なコードを生成する方法を提供し、本方法は、
ａ）所望の機能に基づいてコンポーネントの組み合わせを定義することであって、コンポーネントの組み合わせは、ネゴシエーションを実行する少なくとも２つのコンポーネント群を含み、コンポーネントの組み合わせは、
ｉ）実装されるコンポーネント
ｉｉ）コンポーネント間の接続
を示し、
ｂ）コンポーネントの組み合わせにおけるコンポーネントが実装されるようにし、コンポーネントのうちの少なくともいくつかは、接続を使用して通信し且つコードフラグメントを生成し、コードフラグメントは、結合されると実行可能コードを形成し、少なくとも２つのコンポーネント群は、共通のネゴシエーション選択肢を確定するために通信するようになっており、コードフラグメントのうちの少なくとも１つは、確定されたネゴシエーション選択肢に少なくとも部分的に依存して生成されること
を含む。
【００８１】
通常、各コンポーネント群は、
ａ）１つ又はコンポーネント、及び
ｂ）１つ又は複数のコンポーネント群
のうちの少なくとも１つから形成される。
【００８２】
第１２の幅広い形態において、本発明は、多段階データ処理サービスを表すコンポーネントを実装する方法を提供し、本方法は、処理システムにおいて、
（ａ）少なくとも１つの下位コンポーネントの組み合わせを表す内部略図を確定すること、
（ｂ）内部略図に従って各下位コンポーネントの実装をもたらすこと、
（ｃ）各下位コンポーネントが実装されると、各下位コンポーネントの終了をもたらすこと、
（ｄ）必要に応じてステップ（ａ）〜（ｃ）を繰り返すこと
を含む。
【００８３】
第１３の形態において、本発明は、多段階データ処理サービスを具体化する多段階コンポーネントを定義する方法を提供し、本方法は、
（ａ）１つ又は複数の下位コンポーネントの組み合わせを表す少なくとも１つの内部仕様を定義し、各下位コンポーネントは、それぞれのデータ処理サービスを表し、それにより定義された組み合わせは必要なサービスを表すこと、
（ｂ）いくつかのエージェントを定義し、エージェントのうちの少なくとも１つは、受け取ったデータに応じて内部略図を選択するようになっており、エージェントは、内部仕様の終了時に存続するようになっていること、及び
（ｃ）少なくとも１つの内部略図及びエージェントを定義する仕様を生成すること
を含む。
【００８４】
本方法は、通常、処理システムにおいて、
（ａ）１つ又は複数の他のコンポーネントと通信すること、及び
（ｂ）通信に従って内部仕様を選択すること
を含む。
【００８５】
本方法は、概して、いくつかの所定の内部仕様のうちの１つから内部仕様を選択することを含む。
【００８６】
本方法は、概して、エージェントを使用して通信することを含む。
【００８７】
本方法は、通常
（ａ）下位コンポーネントの各々に対して通知を生成させること、
（ｂ）通知の指示を終了コンポーネントに転送すること、
（ｃ）終了コンポーネントに対し、指示を受け取ることに応じて終了命令を生成させること、及び
（ｄ）終了命令を下位コンポーネントに転送すること
を含む。
【００８８】
第１４の形態において、本発明は、データ処理サービスを表すコンポーネントを実装する方法を提供し、本方法は、処理システムにおいて、
（ａ）下位コンポーネントの組み合わせを表す内部仕様を確定し、下位コンポーネントは少なくとも１つの局所基本コンポーネントを含むこと、
（ｂ）下位コンポーネントの各々の実装を、
（ｉ）各非局所基本コンポーネントに関連するそれぞれの処理システムにコンポーネント要求を転送すること、及び
（ｉｉ）局所基本コンポーネントを表す所定の実行可能コードを実装すること
によりもたらすこと、並びに
（ｃ）下位コンポーネントに対し、内部仕様に従って通信させることによって、データ処理サービスを実行すること
を含む。
【００８９】
第１５の形態において、本発明は、コンポーネントを使用してコードを生成する方法であって、各コンポーネントはそれぞれのデータ処理サービスに対応し、本方法は、処理システムにおいて、
（ａ）コード要求を定義するコンポーネントの組み合わせを確定し、コンポーネントは少なくとも１つの局所基本コンポーネントを含むこと、及び
（ｂ）コンポーネントの組み合わせを実装することによって定義されたデータ処理のシーケンスを実行し、それによってコンピュータコードが生成され、局所基本コンポーネントは処理システムを使用して所定のコードを実行することにより実装されること
を含む。
【００９０】
局所基本コンポーネントは、通常、コンポーネントインスタンスを表す実行可能コード内に埋め込まれる実行可能コードから形成される。
【００９１】
本方法は、通常、局所基本コンポーネントに対しコンポーネントインスタンス、処理システム及び他のコンポーネントのうちの少なくとも１つと通信させることを含む。
【００９２】
局所基本コンポーネントは、通常、所定のデータ処理サービスを具体化する。
【００９３】
本方法は、通常、局所基本コンポーネントを使用して、
（ａ）内部仕様内の下位コンポーネント間で転送されるデータを監視し、
（ｂ）処理システムからデータをロードし、且つ、
（ｃ）処理システムにデータを保存する
ことを含む。
【００９４】
第１６の形態において、本発明は、仕様内のコンポーネントに対し終了を実行する方法であって、コンポーネントはデータ処理サービスを表し、本方法は、処理システムにおいて、
（ａ）コンポーネントの完了を示す指示を受け取ること、及び
（ｂ）終了命令がコンポーネントに転送されるようにし、いくつかのコンポーネントは終了命令に応じて終了すること
を含む。
【００９５】
コンポーネントは、第２の処理システムによって実装され、本方法は、処理システムにおいて、第２の処理システムに終了指示を転送することを含み、第２の処理システムは、終了指示に応じて、
（ａ）通知指示を受け取ることに応じて終了命令を生成し、且つ
（ｂ）いくつかのコンポーネントのうちの少なくとも１つに終了命令を転送し、コンポーネントは終了命令に応じることによって終了する。
【００９６】
本方法は、通常、処理システムにおいて、
（ａ）いくつかの所定の規則を確定すること、及び
（ｂ）所定の規則に従って終了命令を生成すること
を含む。
【００９７】
本方法は、通常、処理システムにおいて、
（ａ）通知指示を受け取ること、及び
（ｂ）通知指示を使用していくつかの所定の規則を確定すること
を含む。
【００９８】
本方法は、通常、
（ａ）いくつかのコンポーネントのうちの１つ、
（ｂ）いくつかのコンポーネントのうちの複数、及び
（ｃ）いくつかのコンポーネントの各々
を終了させることを含む。
【００９９】
第１７の形態において、本発明は、第１のコンポーネントに提供されるいくつかのエージェントに関連するエージェントバンドルを提供することにより第１のコンポーネントが第２のコンポーネントと通信することができるようにし、各コンポーネントはそれぞれのデータ処理サービスを具体化し、本方法は、第１のコンポーネントにおいて、
（ａ）エージェントの各々に関連するそれぞれのバンドリングコンポーネントを提供すること、
（ｂ）各バンドリングコンポーネントに対し、
（ｉ）それぞれのエージェントに対する接続情報を確定させ、
（ｉｉ）エージェントバンドルに対して接続情報を追加させ、
（ｉｉｉ）エージェントバンドルに提供されるカウンタをインクリメントさせること、及び
（ｃ）エージェントバンドルを第２のコンポーネントに転送し、第２のコンポーネントはエージェントバンドルに応じて接続情報を確定すること
を含む。
【０１００】
第１８の形態において、エージェントをいくつかのエージェントに関連するエージェントバンドルに追加する本方法は、処理システムにおいて、
（ａ）エージェントバンドルを受け取ること、
（ｂ）それぞれのエージェントに対して接続情報を確定すること、
（ｃ）接続情報をエージェントバンドルに追加すること、
（ｄ）エージェントバンドルに提供されるカウンタをインクリメントすること、及び
（ｅ）変更されたエージェントバンドルを提供すること
を含む。
【０１０１】
接続情報は、通常、エージェントアドレスを含む。
【０１０２】
本方法は、第２のコンポーネントにおいて、
（ａ）エージェントバンドルを受け取ること、
（ｂ）エージェントの数をカウンタから確定すること、及び
（ｃ）対応する数のエージェントを実装することによって、その数のエージェントが処理されることが可能になること
を含むことができる。
【０１０３】
さらに他の形態において、本発明は、コンポーネントを使用してコードを生成する方法であって、各コンポーネントはそれぞれのデータ処理サービスを具体化する本方法は、
（ａ）コンポーネントの組み合わせを確定し、コンポーネントの組み合わせは一連のデータ処理を定義し、且つ所望の機能が実現され得るようにする要求に従って定義されること、
（ｂ）コンポーネントの組み合わせを、
（ｉ）組み合わせにおける各コンポーネントに対応するコンポーネントサーバの実装をもたらし、各コンポーネントサーバは処理システムによって実装されること、
（ｉｉ）各コンポーネントサーバに対し、定義された一連のデータ処理に従ってそれぞれのデータ処理サービスを実行させ、コンポーネントサーバのうちの少なくともいくつかは、データシーケンスと対話することによってそれぞれのサービスを実行し、コンポーネントサーバの少なくともいくつかは
（１）１つ又は複数のコンポーネントサーバと通信すること、及び
（２）さらなるコンポーネントの実装をもたらすこと
のうちの少なくとも１つによってサービスを実行すること
によってコンピュータコードを生成するように実装すること、
（ｃ）一連のデータ処理を実行する結果として且つデータシーケンスから、結果としてのデータシーケンスを取得し、結果としてのデータシーケンスはコンピュータコードであること、及び
（ｄ）コンピュータコードを処理システムに提供し、処理システムによるコンピュータコードの実行により、処理システムは所望の機能を実行すること
を含む。
【０１０４】
通常、本発明の任意の形態の方法を、本発明の他の形態のうちの任意の１つの方法を使用して実行してもよい。
【０１０５】
以下、添付図面を参照して本発明の一例について説明する。
【図面の簡単な説明】
【０１０６】
【図１】本発明によるソフトウェア生産の一例を概説した流れ図である。
【図２】コンピュータによって実行可能なコードを生成する処理システムの一例の概略図である。
【図３】コンピュータによって実行可能なコードを生成するウェブベースシステムの一例の概略図である。
【図４】図３のエンドステーションの一例の概略図である。
【図５】図３のエンティティ処理システムの一例の概略図である。
【図６Ａ】ＰｒｉｎｔＮｕｍｂｅｒコンポーネントを使用する略図の例の概略図である。
【図６Ｂ】ＰｒｉｎｔＮｕｍｂｅｒコンポーネントを使用する略図の例の概略図である。
【図７Ａ】ｎｅｇｏｔｉａｔｅコンポーネントの一例の概略図である。
【図７Ｂ】２つのｎｅｇｏｔｉａｔｅコンポーネントの動作の一例の概略図である。
【図７Ｃ】２つのｎｅｇｏｔｉａｔｅコンポーネントの動作の一例の概略図である。
【図７Ｄ】２つのｎｅｇｏｔｉａｔｅコンポーネントの動作の一例の概略図である。
【図８】図７Ａのｎｅｇｏｔｉａｔｉｏｎコンポーネントによって使用されるアルゴリズムの一例のフローチャートである。
【図９】複数のｎｅｇｏｔｉａｔｉｏｎコンポーネントの動作の一例の概略図である。
【図１０】ＡＤＤコンポーネントの一例の概略図である。
【図１１Ａ】ＡＬＥＲＴコンポーネントの一例の概略図である。
【図１１Ｂ】ＷＡＴＣＨコンポーネントの一例の概略図である。
【図１２Ａ】多段階トランザクションを実装する略図の概略図である。
【図１２Ｂ】多段階トランザクションを実装する略図の概略図である。
【図１２Ｃ】多段階トランザクションを実装する略図の概略図である。
【図１２Ｄ】多段階トランザクションを実装する略図の概略図である。
【図１３】ｔｅｒｍｉｎａｔｅコンポーネントの一例の概略図である。
【図１４Ａ】終了及び多段階トランザクションを説明する第１の特定の実施例の概略図である。
【図１４Ｂ】終了及び多段階トランザクションを説明する第１の特定の実施例の概略図である。
【図１４Ｃ】終了及び多段階トランザクションを説明する第１の特定の実施例の概略図である。
【図１５Ａ】ｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネントの概略図である。
【図１５Ｂ】ｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネントの概略図である。
【図１５Ｃ】ｎｕｍｂｅｒ ｓｉｎｋコンポーネントの概略図である。
【図１５Ｄ】ｎｕｍｂｅｒ ｓｉｎｋコンポーネントの概略図である。
【図１６Ａ】ネゴシエーション及びコンテキスト独立性を説明する第２の特定の実施例の概略図である。
【図１６Ｂ】ネゴシエーション及びコンテキスト独立性を説明する第２の特定の実施例の概略図である。
【図１６Ｃ】ネゴシエーション及びコンテキスト独立性を説明する第２の特定の実施例の概略図である。
【図１６Ｄ】ネゴシエーション及びコンテキスト独立性を説明する第２の特定の実施例の概略図である。
【図１６Ｅ】ネゴシエーション及びコンテキスト独立性を説明する第２の特定の実施例の概略図である。
【図１７Ａ】多対１接続を提供するｎｂｕｎｄｌｅコンポーネントの使用を示す概略図である。
【図１７Ｂ】多対１接続を提供するｎｂｕｎｄｌｅコンポーネントの使用を示す概略図である。
【図１７Ｃ】多対１接続を提供するｎｂｕｎｄｌｅコンポーネントの使用を示す概略図である。
【図１７Ｄ】多対１接続を提供するｎｂｕｎｄｌｅコンポーネントの使用を示す概略図である。
【図１７Ｅ】多対１接続を提供するｎｂｕｎｄｌｅコンポーネントの使用を示す概略図である。
【図１８Ａ】図１７Ｃのｔｅｓｔコンポーネントの内部略図の一例である。
【図１８Ｂ】図１７Ｃのｔｅｓｔコンポーネントの内部略図の一例である。
【図１８Ｃ】図１７Ｃのｔｅｓｔコンポーネントの内部略図の一例である。
【図１９Ａ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図１９Ｂ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図１９Ｃ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図１９Ｄ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図１９Ｅ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図１９Ｆ】エージェントｎｔｒｅｅの使用の例を示す概略図である。
【図２０Ａ】多点接続の例を示す概略図である。
【図２０Ｂ】多点接続の例を示す概略図である。
【図２０Ｃ】多点接続の例を示す概略図である。
【図２１Ａ】サーバ構築の例を示す概略図である。
【図２１Ｂ】サーバ構築の例を示す概略図である。
【図２１Ｃ】サーバ構築の例を示す概略図である。
【発明を実施するための形態】
【０１０７】
［好適な実施形態の詳細な説明］
コンピュータによって実行可能なコードを生産するプロセスの一例について、これより図１を参照して概説する。
【０１０８】
図１に示すように、最初のステップは、ステップ１００において、コンピュータによる実行可能なコードの作成要求があるかを決定することである。これは、結果として得られる、コンピュータによって実行可能なコードによって実装が必要な機能を考慮することによって実現する。所望の機能が決定されると、ステップ１１０において、複数のコンポーネントが選択される。
【０１０９】
各コンポーネントは、コンポーネントの適当な組み合わせによりコンピュータによって実行可能なコードが生産され得るようにそれぞれのデータ処理サービスを具体化する。使用の際、コンポーネントは、互いにデータを転送することによって通信する。このため、たとえば、１つのコンポーネントの出力を別のコンポーネントの入力に接続してもよく、それにより２つのサービスを連続して実行することができる。階層構造がより基本レベルのコンポーネントのうち適当なものを結合することにより、より複雑なサービスをより基本的なサービスの集まりとして実装することも可能である。
【０１１０】
その後、ステップ１２０において、選択されたコンポーネントの組み合わせが定義される。これにより、コンポーネントによって提供されるサービスがステップ１３０において実装されるときに、通信によって所望のコンピュータによって実行可能なコードが生成されるように、コンポーネントをどのように相互接続すべきかが指定される。
【０１１１】
この技術の実施態様は複数の方法で実現可能なことが理解されよう。しかし、最も広い形態では、このプロセスは、図２に例示する一つの処理システムを使用して実行することができる。
【０１１２】
具体的には、一般に、処理システム１０は、少なくとも、バス２４を介して図に示すように共に接続されたプロセッサ２０、メモリ２１、キーボード等の入力装置２２、ディスプレイ等の出力装置２３を備える。処理システムをデータベース１１等の記憶装置に接続するために、２５に示す外部インタフェースも設けることができる。
【０１１３】
使用の際に、処理システムは、利用可能なコンポーネントの詳細をデータベース１１に記憶することができるようになっている。次いで、ユーザが、入力装置２２及び出力装置２３を使用して、選択されたコンポーネントの組み合わせを定義することができ、処理システム１０がコンピュータによって実行可能なコードを生成できるようにする。これから、処理システム１０がコンピュータ、ラップトップ、サーバ、専用ハードウェア等、いずれの形態の処理システムであってもよいことが理解されよう。
【０１１４】
処理システム１０を使用してコンピュータによって実行可能なコードを生成することができる方法については、同時係属出願ＰＣＴ／ＡＵ０３／０１４７４号においてより詳細に説明されている。
【０１１５】
通常、システムは分散アーキテクチャを使用して実装される。その例を図３に示す。具体的には、この例では、１つ又は複数の中央処理システム１０（この例では、単に明確にするために２つを示す）がベースステーション１に設けられ、ベースステーション１は、インターネット２及び／又は複数のローカルエリアネットワーク（ＬＡＮ）４等の通信ネットワークを介して複数のエンドステーション３に接続される。
【０１１６】
使用の際、上述したように、コンポーネントは、処理システム１０に設けられ、且つ処理システム１０によって実装されることが可能である。別法として、図示するように、コンポーネントを、１つ又は複数のそれぞれのエンティティによって設けてもよく、それらエンティティの各々は、同じくインターネット２及び／又はＬＡＮ４に接続された１つ又は複数のそれぞれのエンティティステーション５（明確にするために２つのみを示す）を運用する。この例では、各エンティティステーション５は、図示するように、データベース１６等の記憶装置に接続されたエンティティ処理システム１５から形成される。
【０１１７】
使用の際、システムのユーザは、エンドステーション３を使用してベースステーション１と通信し、それにより適当なコンポーネントによって具体化されるサービスの提供を受けることができる。
【０１１８】
これは複数の方法で実現することができるが、この例では、単に例示を目的としてであるが、サービスへのアクセスはウェブページを使用することによって提供される。したがって、これを実現するために、各エンドステーション３は、必要に応じてウェブページにアクセスしデータをベースステーション１に転送するようになっている処理システムから形成される。
【０１１９】
適当なエンドステーション３の一例を図４に示す。図示するように、エンドステーション３は、バス３４を介して互いに接続されたプロセッサ３０、メモリ３１、キーボード等の入力装置３２、ディスプレイ等の出力装置３３を備える。処理システムには、必要に応じてエンドステーション３をインターネット２又はＬＡＮ４に接続する外部インタフェース３５も設けられる。
【０１２０】
使用の際、プロセッサ３０は、ベースステーション１に設けられた処理システム１０と通信ネットワーク２、４を介して通信して、処理システムのサービスへのアクセスを可能にするようになっている。したがって、エンドステーション３を、通常、データ転送を可能にし、場合によってはウェブブラウジングを可能にするアプリケーションソフトウェアを動かしている、適当にプログラムされたＰＣ、インターネット端末、ラップトップＰＣ、ハンドヘルドＰＣ等、任意の適当な処理システムから形成することができる、ということが理解されよう。
【０１２１】
コンポーネントは、コンポーネント及びコンポーネントにおいて提供されるサービスの性質に応じて、処理システム１０自体に実装することができ、又はエンティティ処理システム１５の１つに実装することもできる。
【０１２２】
したがって、エンティティ処理システム１５は、通信ネットワーク２、４を介して処理システム１０と通信できなければならない。これを実現するために、エンティティ処理システム１５は、一般的に、図５に示す処理システムと同様である。
【０１２３】
図示するように、エンティティ処理システム１５は、プロセッサ４０、メモリ４１、キーボード等の入力装置４２及びモニタ等の出力装置４３を備え、これらは、バス４４を介して互いに接続される。処理システムにはまた、必要に応じてエンティティステーション５をインターネット２又はＬＡＮ４、同様にデータベース１６に接続するための外部インタフェース４５も設けられる。
【０１２４】
使用の際、プロセッサ４０は、エンティティがそれぞれのコンポーネントにカプセル化されたサービスを実行できるようにするようする。したがって、エンティティステーション５を、適当にプログラムされたＰＣ、インターネット端末、ラップトップＰＣ、ハンドヘルドＰＣ等の任意の適当な処理システムから形成することができることが理解されよう。サービスはデータ集約的であり得るため、エンティティ処理システム１５はサーバ等から形成されることが多い。
【０１２５】
いずれの場合も、エンドステーション３及びエンティティステーションを、共通の処理システムを使用して実装してもよく、エンドステーション３とエンティティステーション５との区別は主に単に説明を目的としたものであることが理解されよう。
【０１２６】
エンドステーション３のユーザがベースステーション１を介してコンポーネントにおいて提供されるサービスにアクセスすることを依然として可能にしながら、コンポーネントをエンティティステーション５によって実装することができるようにするためには、通常、コンポーネントの少なくともいくらかの詳細がコンポーネントの仕様の形態でデータベース１１に格納される。
【０１２７】
コンポーネントの仕様は、多数の形式のうちのいずれの形式であってもよく、グラフィカル表現等を含んでもよい。しかしながら、一般に、コンポーネントの仕様は、ユーザがそれぞれのコンポーネントによって具体化されるサービスのタイプを確定するために十分な情報を含む。コンポーネントの仕様は、コンポーネントを選択し使用することができるようにするために十分な情報を提供することが留意されるべきである。したがって、コンポーネントの仕様は、実行することができるデータ処理の指示を含むが、これがどのように実現されるかについては必ずしも含まない。
【０１２８】
そして、ベースステーション１は、ユーザがコンポーネントの組み合わせを定義することによって、データ処理を実行し又はコンピュータコードを生成することができるようにする、フォーラムを提供することも可能である。一例では、これは、使用されるコンポーネント及びそれらの間の通信を設定する仕様を定義することによって実現される。仕様書は、通常、エンドステーション３を介して適当なＧＵＩを使用して定義され、したがって、それによりユーザは、フォーラムに提示されるコンポーネントを選択し、これらを略図にドラグアンドドロップし、それらコンポーネント間の適当な接続を定義してコンポーネントの通信を定義することができる。これに関して、フォーラムは、コンポーネントの仕様へのアクセスを提供するポータルとして作用する。
【０１２９】
仕様が完成すると、これを、ビルドとして知られるプロセスで実装することができる。ビルドの間、仕様の各コンポーネントに対してそれぞれのコンポーネントインスタンスを生成することができる。各コンポーネントインスタンスを、通常エンティティステーション５のそれぞれ１つを使用して実装されるそれぞれのコンポーネントサーバで作成してもよい。使用の際、システムが実装されると、データを、それぞれのコンポーネントインスタンスの間で転送することができ、コンポーネントインスタンスのうちの少なくともいくつかが受け取ったデータに対し必要なデータ処理を実行することによって、必要に応じて処理されたデータの出力が提供される。
【０１３０】
コンポーネントインスタンスは、互いに通信することができ、特に、両コンポーネントが理解できる形式で情報及びデータを転送できる、ということが理解されよう。
【０１３１】
一例では、これは、エージェントを使用して実現され、それぞれのエージェントはコンポーネントの各ポートに対して提供される。このため、１つのコンポーネントのポートに関連するエージェントは、別のコンポーネントのポートに関連するエージェントと協働する。ポートは、一般に、情報の双方向の交換に対して使用されるが、データの転送に関連する指向性があることが多く、したがって、ポートは通常入力及び出力と呼ばれる。
【０１３２】
エージェント間の通信は、通常、アドレス情報を含むヘッダと転送される任意のデータを含むペイロードとを含むメッセージを転送することによって実現される。エージェント間の通信は、１つのエージェントに対して別のエージェントにメッセージを送信させる程度に単純であってもよく、それ以上の通信は行われなくてもよい。別の方法として、実装によって通信の追加の段階を実行してもよい。
【０１３３】
ビルドプロセス中に仕様が構築される場合、仕様内のコンポーネントを提供する各エンティティに対して取得命令が送信される。そして、各エンティティは、関連する任意のエージェントとともにそれぞれのコンポーネントインスタンスを含むそれぞれのコンポーネントサーバを構築することができる。これが完了すると、エージェントは、コンポーネント間でデータを通信することにより、コンポーネントがそこにおいて具体化されるそれぞれのデータ処理を実行することが可能になる。
【０１３４】
データ処理は、多数のタイプのうちの任意の１つであってもよいが、一般に、処理コンポーネント及びコード生成コンポーネントとして知られる２つのカテゴリのうちの１つである。ビルドプロセス中、処理コンポーネントは、データを処理して出力を提供するかまたは別の動作を実行する。このため、たとえば、これは、２つの数字を受け取って加算することによって出力を提供することを含むことができる。
【０１３５】
対照的に、コンポーネントに対するコード生成により、コードの一部（コードフラグメントとして知られる）が生成され、それは、より大きい実行可能ファイルの一部として実行される場合、データ処理を提供する。このため、コンポーネントは、実行される時に２つの数字の加算が行われるようにするコードフラグメントを生成することができる。コンポーネントの２つの層を異なる方法で使用してもよいが、一般原理はコンポーネントの両タイプに適用される。したがって、明確にするために、以下の説明ではコンポーネントのタイプの間には必ずしも区別しない。このため、コンポーネントによって実行されるように説明する処理を、コンポーネント自体によって実行してもよく、又はコンポーネントによって生成されるコードフラグメントによって実行してもよい。
【０１３６】
この例では、エンティティは、コンポーネントに関連するエージェントと他のコンポーネントのエージェントとの間で形成される必要のある接続を指定する、それぞれのコンポーネントに対する取得命令を受け取る。特に、これには、コンポーネントインスタンス及び対応するエージェントが構築される時に、エージェントが他のエージェントと直接通信することができるように、他のエージェントのエージェントアドレスが含まれる。
【０１３７】
一例では、生成されたコードは、生成されたコードが以下のような要素に依存するという意味で、コンテキスト（context（ｓ）；条件）に依存するコードであってもよい。
・開始時の実行可能ファイルが既知の状態。このため、たとえば、結果としてのコンピュータによって実行可能なコードがアプリケーションである場合、開始時のアプリケーションの既知の状態はオペレーティングシステムによって確定される。
・前の命令からのレジスタの既知の状態
・スタック及びメモリの既知の状態
・レジスタ、スタック及びメモリの割り当て
・プロジェクト内のそれ自体（コンポーネント）の番号
・どのコンポーネントが自分のコンポーネントに接続されるか
・コードを置くべき場所
【０１３８】
コンテキストに依存するコードは、同じタスクを実行する多くの方法があり、方法によってはシステムの他の部分に依存することを利用する。コンテキストに依存するコードを作成することによって、第３者が、あまり書き換えることなくコードを容易に再使用することが防止されるか、又はリバースエンジニアリングすることが防止される。或るレベルの依存性を越えると、リバースエンジニアリングし書き換えるよりも、コンポーネントを単に再購入するほうが経済的になる。
【０１３９】
コンテキストの依存性は、結果によって生成されるコンテキストを供給者が調べることによって実現される。各コンテキストは一意であるため、各コンテキストをカスタマイズすることが可能である。
【０１４０】
コンテキストに依存するコードを生成することにより、従来のコードに比較してコードサイズを実質的に低減することができる。さらに、コンポーネント供給者がコード生成プロセスのわずかではあるが、詳細な態様に焦点を合わせることができるようにすることによって実現することができる特殊化により、信頼性、生産性及び最適化を劇的に向上させることができる。
【０１４１】
ここで、本発明のいくつかの追加の特徴について説明する。
【０１４２】
＜ネゴシエーション＞
使用の際、コンポーネントは、所定のデータ処理サービスを提供するように動作する。データ処理サービスには、データの処理又は実行可能ファイルの一部の生成が含まれてもよい。したがって、コンポーネントが実装される方法は、処理されるデータのタイプ、実行される処理のタイプ及びデータが処理されるコンテキスト等、複数の要素によって決まる。
【０１４３】
たとえば、コンポーネントは数字の加算を実行するようになっていてもよく、その場合、実装は、数字のフォーマット、又はその数字が別のコンポーネントから受け取られたペイロードの一部としてレジスタで提供されるか等の複数の要素によって決まってもよい。
【０１４４】
同様に、コンポーネントは、完全な実行可能プログラムの一部として実行される場合に２つの数字の加算を実行するように動作するコードフラグメントを生成してもよい。この場合、生成された実行可能コードは、この場合もまた加算される数字によって決まり、したがってコンテキスト依存となる。
【０１４５】
このため、たとえば、図６Ａは、数字をプリントするコードフラグメントを作成することに関与するＰｒｉｎｔＮｕｍｂｅｒコンポーネントを示す。これを実現するために、コンポーネントは、そのコンテキストから、コンピュータによって実行可能なコードが実行される時にその数字がどのように送られるかを判断しなければならない。
【０１４６】
概して、データ及びコンテキストのタイプは、通常、仕様内の他のコンポーネントによって決まり、そのため、それは、結果としての実行可能コードの異なる部分の動作に影響を与える。したがって、コンポーネントが複数の異なるコンポーネントと通信するために十分頑強でなければならない場合、それは異なるデータタイプ及び／又はコンテキストを操作するために十分柔軟でなければならない。
【０１４７】
これを、任意の状況においても、同じコンポーネントの実装を使用して操作されるのを可能にする一般化された機能性を提供することによって達成することができるが、これは、通常、それほど効率的ではなく、一般に実装するのがより複雑である。したがって、コンポーネントが、ビルドプロセス中にデータ及び／又はコンテキストのタイプを確定するためにネゴシエーションを利用することが一般的である。図６Ａにおいて、この目的のために、コンポーネントＰｒｉｎｔＮｕｍｂｅｒにおける専用の通信接続（ＰｒｉｎｔＣｏｄｅ）が確保され、エージェントＡは、エージェントＡとエージェントＰｒｉｎｔＣｏｄｅとの間の通信チャネルを介してＰｒｉｎｔＮｕｍｂｅｒコンポーネントに対して数字を送る方法を通信することに関与している。
【０１４８】
コンテキストを、コンポーネントがどのピアに接続されているかによって確定してもよい。これらのピアコンポーネントもまた、同様にそれらのそれぞれのコンテキストを確定することができる。このため、大抵の場合、コンポーネントは、それらの相互のコンテキストを確定するために通信しなければならない。この通信は、提供されているサービスの複雑性によって異なる。
【０１４９】
図６Ｂにおいて、コンポーネントＰｒｉｎｔＮｕｍｂｅｒは、種々の数字移送選択肢を使用して提供されるディジットをプリントする適当なコード断片を生産することができる知識を具体化する。同様に、ＲｅａｄＤｉｇｉｔコンポーネントは、キーボードから数字を読み取るコードフラグメントを作成することに関与してもよいが、また、コードが最終的に実行される時に数字をいかに送ることができるかを、そのコンテキストから確定しなければならない。
【０１５０】
ＰｒｉｎｔＮｕｍｂｅｒコンポーネントは、ＲｅａｄＤｉｇｉｔコンポーネントにそのエージェントＤｉｇｉｔを介して接続されるエージェントＰｒｉｎｔＣｏｄｅを有し、それによりそれらコンポーネントは、数字を送り／供給するためのコンテキストを発見するために通信することができる。
【０１５１】
しかしながら、通信は、このコンテキストにおいていくつかの有効なソリューションを有するコンポーネントＰｒｉｎｔＮｕｍｂｅｒ及びコンポーネントＲｅａｄＤｉｇｉｔによって複雑になる。これは、コンポーネントがコンテキストの範囲で動作するために十分に柔軟であることが必要である結果である。これらのコンポーネントは、いくつかの方法のうちの任意の１つで数字を移送するためのコードフラグメントを生成することによって、それらのサービスをうまく完了することができる。しかしながら、方法によっては、他の方法より複雑であるか又はより多くのコードを送る可能性があるため、他の方法よりコストがかかる。また、移送方法が与えられて各コンポーネントに対してコードフラグメントを確定する相対的なコストは異なる可能性がある。
【０１５２】
この問題を克服するために、ネゴシエーションとして知られるプロセスが使用される。ここで、ｎｅｇｏｔｉａｔｅコンポーネントを利用するネゴシエーションプロセスの一例について説明する。この例示の目的で、ｎｅｇｏｔｉａｔｉｏｎコンポーネントは、処理コンポーネントとみなされ、したがって、ビルド中にネゴシエーションサービスを提供する。しかしながら、代替形態として、ＰｒｉｎｔＮｕｍｂｅｒ及びＲｅａｄＤｉｇｉｔサーバは、ネゴシエーション処理をサーバ内に予め構築するネゴシエーションコードコンポーネントとともに部分的に構築されていることも可能である。これらのサーバは、動作時、ネゴシエーションが実行されるようにすることができる。この技法を、後により詳細に説明するように、より高レベルのコンポーネントを実装するために使用することができる。
【０１５３】
特に、図７Ａは、Ｉｎエージェント、Ｌｉｓｔエージェント、Ｔｙｐｅエージェント及びＶａｌｕｅエージェントを有するｎｅｇｏｔｉａｔｅコンポーネントを示す。このコンポーネントは、Ｌｉｓｔエージェントを使用してネゴシエーションによる設定のリストを検索するようになっており、それは後に、Ｉｎエージェントを介して別のｎｅｇｏｔｉａｔｉｏｎコンポーネントと交換され、それにより同様のリストが提供される。
【０１５４】
そして、各ｎｅｇｏｔｉａｔｉｏｎコンポーネントは、２つのリストを比較することによって共通のネゴシエーションによる設定を確定することができる。所定のアルゴリズムに従ってこれを実行することにより、各ｎｅｇｏｔｉａｔｉｏｎコンポーネントは相互の結果を確定することができる。
【０１５５】
これに続いて、ネゴシエーションによる設定の指示を、Ｔｙｐｅエージェントを介して仕様の後続するコンポーネントに転送することができ、必要に応じて、データ値はＶａｌｕｅエージェントを介して提供される。
【０１５６】
ここで、図７Ｂを参照してｎｅｇｏｔｉａｔｉｏｎコンポーネントの使用の一例についてより詳細に説明する。
【０１５７】
この例では、何らかの連続したデータ処理が実行されるのを可能にする２つのコンポーネント１０００、１０５０が設けられている。この場合、各コンポーネントは、同様に図示する２つの下位コンポーネント１０１０、１０２０及び１０６０、１０７０から形成される。コンポーネント１０００、１０５０はまた、図示するように、コンポーネント１０００、１０５０が相互接続されるのを可能にする外部エージェント１００１、１０５１と、それぞれの内部エージェント１００２、１０５２とを含む。
【０１５８】
コンポーネント１０１０、１０６０は、それぞれのＩｎエージェント１０１１、１０６１、Ｌｉｓｔエージェント１０１２、１０６２、Ｔｙｐｅエージェント１０１３、１０６３及びＶａｌｕｅエージェント１０１４、１０６４を有するｎｅｇｏｔｉａｔｉｏｎコンポーネントであり、コンポーネント１０２０、１０７０は各々、２つのエージェント１０２１、１０２２；１０７１、１０７２を含む。概して、コンポーネント１０００、１０２０、１０５０、１０７０は、他のエージェント及びそれぞれのデータ処理を提供する下位コンポーネントを有してもよいが、これは、明確にするためにこの説明から省略する。
【０１５９】
ここで、ｎｅｇｏｔｉａｔｉｏｎコンポーネントの動作について説明する。
【０１６０】
この例では、各コンポーネントは、エンティティステーション５のうちの１つによって取得命令が受け取られることに応じてそれぞれのコンポーネントサーバによってそれぞれのコンポーネントインスタンスとして実装されるものとする。
【０１６１】
特に、図示するように、取得命令が受け取られコンポーネント１０００及び１０５０が構築されると、エージェント１００１、１０５１が相互接続し、各コンポーネントサーバは取得命令を生成し、それによりコンポーネント１０１０、１０２０、１０６０、１０７０が生成される。
【０１６２】
これに続いて、エージェント１００１、１０５１は、それら自体によってそれ以上の動作が必要とされないと確定し、したがって、これらエージェントは受け渡しをし、エージェント１０１１、１０６１が直接相互接続することができるようにする。同様に、Ｌｉｓｔエージェント１０１２、１０６２は、それぞれの内部エージェント１００２、１０５２と接続し、それらからネゴシエーションポジションを表すリストを取得し、エージェント１０１３、１０１４；１０６３、１０６４はそれぞれ、図７Ｃに示すようにエージェント１０２１、１０２２；１０７１、１０７２と相互接続する。
【０１６３】
ネゴシエーションポジションは、通常、複数の選択肢及びそれらの選好の指示を含む。リストは、それぞれのコンポーネントによるそれぞれのデータ処理サービスの実装に基づくため、コンポーネントが最初に設計され、したがってコンポーネントの仕様等の一部として提供される、コンポーネントインスタンスを実装するために使用されるソフトウェア内にハードコード化されることが可能である時に確定される。いずれの場合も、エージェント１００２、１０５２は、それぞれのリストを、エージェント間通信に従ってメッセージペイロードの一部としてＬｉｓｔエージェント１０１２、１０６２に提供するように動作する。
【０１６４】
このため、たとえば、ネゴシエーションがレジスタの使用に関する場合、各リストは、それぞれのコンポーネント１０００、１０５０がサポートすることができるレジスタと、それぞれの重み付けによって指示される好ましい順序とを指示する。
【０１６５】
この時点で、エージェント１０１１、１０６１は、それらそれぞれのリストをペイロードとして含むメッセージを交換する。したがって、これに続いて、各ｎｅｇｏｔｉａｔｅコンポーネントが両リストのコピーを有することが理解されよう。そして、ｎｅｇｏｔｉａｔｅコンポーネント１０１０、１０６０は、合意に達するために所定のアルゴリズムを実行する。一例では、これは、最大合致（best match）ゲーム理論アルゴリズムの実装に基づく。ここで、この一例についてより詳細に説明する。
【０１６６】
一旦合意に達すると、各ｎｅｇｏｔｉａｔｉｏｎコンポーネント１０１０、１０６０は、それぞれのエージェント１０１３、１０６３を介してコンポーネント１０２０、１０７０に指示を提供することができる。エージェント１０１４、１０６４は、通常、受け渡し手続きを受け、そのためエージェント１０２２、１０７２は、図７Ｄに示すように直接相互接続する。この時点で、エージェント１０２２、１０７２によって交換されるメッセージのペイロードにデータを含めることにより、コンポーネント１０２０、１０７０間でデータを直接転送することができる。
【０１６７】
当業者には、コンポーネント１０２０、１０７０のいずれか１つの実装が、ネゴシエーションポジションの結果に依存してもよい、ということが理解されよう。したがって、同時係属出願ＰＣＴ／ＡＵ０３／０１４７４号に記載されているように、通常、コンポーネント１０２０、１０７０が動的構築手法を実装する。
【０１６８】
これは、エージェント１０２１、１０２２、１０７１、１０７２のうちの１つをセレクタエージェントにすることにより、コンポーネント１０２０、１０７０及びコンポーネント１０００、１０５０の実装の方法がネゴシエーションの結果によって決まるようにすることによって実現される。これは、選択されたネゴシエーションポジションか又は受け取られたデータのそれぞれの値のいずれかによって決まってもよく、コンポーネントがネゴシエーションのすべての結果をサポートすることができる限り無関係である。
【０１６９】
たとえば、ネゴシエーションは、数字が整数として交換されるということを確定してもよいが、コンポーネントの内部仕様の設計は、整数として転送されている数字だけでなく数字の値によって決まってもよい。
【０１７０】
ここで、図８を参照してネゴシエーションを実行するために使用されるアルゴリズムの一例について説明する。この例では、ｎｅｇｏｔｉａｔｅコンポーネント１０１０、１０６０に関連するポジションは、以下の表１に示す通りである。
【０１７１】
【表１】
2014044748.tif 000003
【０１７２】
ステップ２００において、ｎｅｇｏｔｉａｔｅコンポーネント１０１０、１０６０は、Ｉｎエージェント１０１１、１０６１を介してネゴシエーションポジションを交換するように動作する。この結果、両コンポーネントは互いの重み付きリストにアクセスすることができるようになる。ステップ２１０において、各コンポーネント１０１０、１０６０は、各リストの重み付けが合計して１になるように各リストを正規化するように動作する。この例では、上述した表１は事前に正規化されたリストを含むが、これは必須ではない。
【０１７３】
ステップ２２０において、各ｎｅｇｏｔｉａｔｉｏｎコンポーネント１０１０、１０６０は、各リストに対して最大化され正規化された重み付けを確定するように動作する。この例では、最大化された重み付け値は各リストに対して０．４である。
【０１７４】
ステップ２３０において、各ｎｅｇｏｔｉａｔｉｏｎコンポーネント１０１０、１０６０は、両リストに共通していないオプションを除去するように動作する。この場合、オプションＡ、Ｂ、Ｅ及びＦは両リストに共通しておらず、したがって除去され、その結果新たなリストが生成され、それは次いでステップ２４０において再正規化され、表２に示すリストとなる。
【０１７５】
【表２】
2014044748.tif 000004
【０１７６】
ステップ２５０において、各ｎｅｇｏｔｉａｔｉｏｎコンポーネント１０１０、１０６０は、両リストの各ネゴシエーションオプションに対して平均重み付けを確定するように動作する。この場合、Ｃ及びＤ両方の平均重み付けは０．５に等しい。
【０１７７】
ステップ２６０において、各ｎｅｇｏｔｉａｔｉｏｎコンポーネントは、明確な（distinct）選択肢があるか判断するように動作する。これは、たとえば、リストの選択肢のうちの１つが他の選択肢のすべてより高い重み付き平均を有する場合に発生する。この特定の例では、重み付け平均は等しく、したがって、プロセスはステップ２７０に進み最小平均二乗誤差を計算する。
【０１７８】
特に、ステップ２２０において確定されるような最大重み付き値からの最小平均二乗誤差は、標準技法に従って生成される。ステップ２８０において、ｎｅｇｏｔｉａｔｉｏｎコンポーネント１０１０、１０６０は、明確な選択肢があるか判断するように動作する。ここでもまた、これを、あるとすれば選択肢のいずれがより低い最小平均二乗誤差を有するか判断することによって実現してもよい。
【０１７９】
この場合、最小平均二乗誤差は両場合において０．０１に等しく、したがって、本方法はステップ２９０に進み任意の規則を使用して明確な選択肢を選択する。一例では、これは、後により詳細に論考するように、コンポーネントのいずれか一方又は両方のリストに現われる最初の選択肢を選択することを含んでもよい。したがって、この例では、任意の規則によって選択肢Ｃが選択されることになる。
【０１８０】
ステップ２６０、２８０又は２９０のいずれかにおいて適当な選択肢が確定されると、ネゴシエーションは完了する。
【０１８１】
ステップ２９０の前に優先ポジションが確定されていない場合、確実に、各ｎｅｇｏｔｉａｔｅコンポーネントが同じネゴシエーションポジションを選択し、これが、コンポーネント１０００、１０５０を実装するエンティティに対して過度に損害を与えることがないように公正に実行されることが必要である。
【０１８２】
当業者により、これをいくつかの方法で実現してもよい、ということが理解されよう。たとえば、アルゴリズムは、各ｎｅｇｏｔｉａｔｅコンポーネント１０１０、１０６０に関連するか又は各コンポーネント１０００、１０５０に関連する擬似乱数を生成することができ、その後それらが比較されることにより、最大の数を有するコンポーネントのネゴシエートリストが選択されることが可能になる。
【０１８３】
しかしながら、１つの好ましい例では、結合された状況におけるネゴシエーションポジションの選択は、ビルドプロセス中に割り当てられる一意のエージェントＩＤを使用することによって確定される。ここでもまた、この場合、最高エージェントＩＤを選択することがまたいくつかのエンティティに対して有利である可能性がある。したがって、これは、各ｎｅｇｏｔｉａｔｅコンポーネントに関連する一意のエージェントＩＤに所定のハッシュ関数を適用することにより数字を計算することによって回避される。こうした計算は、各エージェントがシステム全体を通して一意のＩＤを有するため、デッドロックがないことが保証され、一意のエージェントＩＤをハッシュすることにより、一貫して高いエージェントＩＤ番号を享受するコンポーネントから発生する可能性のある優位が回避される。
【０１８４】
プロトコル
要件の集まりを、プロトコルに分解することができ、ネゴシエーションはそれに関して実施され、異なるプロトコルは選択肢の異なるリストを定義する。
【０１８５】
図７Ａ及び図７Ｂに示す例では、ネゴシエーションは、数字プロトコルを使用する数字の移送方法に対するものである。数字プロトコルで利用可能な多くの移送方法がある可能性があり、これらの方法はプロトコルの一部として記録される。
【０１８６】
コンポーネントは、記録されたセットに加えて結果をサポートすることができ、それにより、既に販売されているコンポーネントを、より柔軟にすることによって強化することができる。しかしながら、コンポーネントがプロトコルとのコンプライアンスを宣伝したい場合にサポートしなければならない結果の最小セットがある。この最小セットは、プロトコルとのコンプライアンスを主張するコンポーネントの間の任意のネゴシエーションにおけるソリューションを保証し、したがって、ビルド例外（ビルドプロセス中のエラー）の頻度を最小限にする。
【０１８７】
ディシジョンツリー
ｎｅｇｏｔｉａｔｅコンポーネントをカスケードにすることによりディシジョンツリーを作成することができる。
【０１８８】
この一例を図９に示す。図９は、２つのコンポーネント１０８０、１０９０を表し、それらの各々は、図示されるように接続された２つのそれぞれのｎｅｇｏｔｉａｔｉｏｎコンポーネント１０８１、１０８２、１０９１、１０９２を含む。
【０１８９】
この例では、２つのｎｅｇｏｔｉａｔｅコンポーネント１０８１、１０９１はまず、図７に関して上で概説したように相互接続して合意に達する。
【０１９０】
これが完了すると、ｎｅｇｏｔｉａｔｅコンポーネント１０８１、１０９１によって確定される値は、それぞれのＶａｌｕｅエージェント及びＩｎエージェントを介してｎｅｇｏｔｉａｔｉｏｎコンポーネント１０８２、１０９２に転送される。そして、ｎｅｇｏｔｉａｔｅコンポーネント１０８２、１０９２は、必要に応じてさらなるネゴシエーションを実行する。
【０１９１】
この場合、ｎｅｇｏｔｉａｔｅコンポーネント１０８１、１０９１から得られる値は、ｎｅｇｏｔｉａｔｅコンポーネント１０８２、１０９２によってそれぞれのＬｉｓｔエージェントを介してそれぞれのリストを選択する際に使用される。このため、第１のネゴシエーションの結果を使用して、後に実行されるネゴシエーションの性質に影響を与えることができる。
【０１９２】
値は、後続するコンポーネント１０８１、１０９１のＩｎエージェントに接続されているように示されているが、先のｎｅｇｏｔｉａｔｉｏｎコンポーネント１０８１、１０９１のＴｙｐｅエージェントを仕様のセレクタエージェントに接続してもよく、それには、たとえば、後続するｎｅｇｏｔｉａｔｉｏｎコンポーネント１０８２、１０９２のＩｎエージェントが含まれてもよい、ということが理解されよう。このため、ネゴシエーションを、先のネゴシエーションによって確定されたタイプに応じるように行うことができる。
【０１９３】
これにより、ネゴシエートポジションのツリーを定義することができ、ツリーの各ブランチは先のネゴシエーションの結果を反映する。
【０１９４】
代替形態
ネゴシエーションを実行する代りに、強制されたネゴシエーションポジションを使用することができる。これを、たとえば単一ネゴシエーション選択肢のみが定義されたプロトコルを実装することによって実現することができる。別の方法として、これを、他のコンポーネントが所定の選択肢に従って直接通信するようにｎｅｇｏｔｉａｔｉｏｎコンポーネントを単に除去することによって実現してもよい。
【０１９５】
ネゴシエーションの選択肢を大幅に除去することにより、接続プロトコルが簡略化するが、コンポーネント間の通信が制限され、コンポーネントがよりもろくなることによって、ビルドプロセスにおけるエラーが増加する、ということが理解されよう。
【０１９６】
さらなる選択肢は、ビルドプロセス中にエラーの発生を可能にするというものである。このため、たとえば、２つのリストの間に共通のネゴシエーション選択肢がない場合、又はネゴシエーションが提供されない場合で、且つコンポーネントがたとえば異なるフォーマットの数字又はデータを転送しようと試みている場合、ビルドプロセス中にエラーを生成することが可能である。
【０１９７】
この例では、システムのユーザは、ビルドエラーが発生したという事実が警告され、それによりビルドエラーを何らかの方法で調整することが可能になる。これを、たとえば、ユーザが必要に応じてデータのフォーマットを変換するために、追加のコンポーネントを挿入することができるようにすることにより、実現することができる。システムは、こうした場合、手動プロセスに立ち戻ることができ、その場合、オペレータは、問題の性質を検査した後、難局を解決するために特注の仕様を構築する。
【０１９８】
多点ネゴシエーション
ネゴシエーションが２つのコンポーネント間で直接実行されることに加えて、より多くのコンポーネントの間で多重ネゴシエーションを実行することも可能である。ここで、この一例を、ＡＤＤコンポーネントの一例を示す図１０を参照して説明する。
【０１９９】
この例では、ａｄｄコンポーネントは、それぞれＩｎ１、Ｉｎ２及びＯｕｔと付された３つのエージェントを有し、それらは、実行時に加算するデータを収集し送る、結果としてのコード断片の設計において使用される移送選択肢をネゴシエートするために使用される。当業者には理解されるように、ビルドチェインに接続するためにＢｕｉｌｄエージェントが提供され、それにより結果としてのコードを送ることが可能になる。
【０２００】
コードは、ａｄｄコンポーネントによって生成されることが可能になる前に、仕様において隣接するコンポーネントから、データがいかにして収集され送られるかを確定しなければならない。この特定の例では、ａｄｄコンポーネントの実装の方法は、加算されるデータを移送するための選択肢及び結果を提供するための選択肢が多く存在することを意味する。したがって、ａｄｄコンポーネントは、この移送の正確な形式を確定するために他のコンポーネントとネゴシエートし、それにより加算関数が送られるコードにおいて具体化されることができるようにすることが必要である。
【０２０１】
一例では、データの移送に関連するネゴシエーションのすべてを、互いから分離して行うことができる。このため、たとえば、各エージェントＩｎ１、Ｉｎ２及びＯｕｔは、それぞれの移送メカニズムを提供するためにそれぞれのコンポーネントとネゴシエートすることができる。この例では、ａｄｄコンポーネントによって生成されるコードフラグメントは、所定のレジスタに提供される値を加算するようになっていてもよく、それによりこれらを、同様に所定のレジスタに提供されている結果と結合することができる。しかしながら、この技法による加算コード断片の動作には、加算関数が実行されるのを可能にするために必要な命令より多くの命令が必要となる可能性がある。これは、たとえば、値がレジスタ以外のメカニズムを使用して提供され、後にその値を要求されたレジスタに移動させなければならない場合に発生する可能性がある。これにより、速度、メモリ使用率等のパフォーマンスに不利益がもたらされる。
【０２０２】
したがって、１つのネゴシエーションの結果が別のネゴシエーションの結果に影響を与えるようにネゴシエーションを連鎖させることが好ましい。このため、ネゴシエーションを連鎖させることにより、それより前のネゴシエーションの結果に基づいてコンポーネントのネゴシエーションポジションが変更される。これにより、後にさらなるネゴシエーションが実行される前に、情報を収集しいくつかの設計選択肢を決定することができ、それにより合意されたネゴシエーションポジションを、すでに確定された気に入ったソリューションに基づいて確定することができる。
【０２０３】
連鎖を、それぞれの実装に応じて順方向に又は逆方向に行うことができ、ここでこの例について説明する。
【０２０４】
順方向連鎖の一例では、Ｉｎ１エージェント及びＩｎ２エージェントを介してデータを供給するコンポーネントは、所定のレジスタにデータを置くことを含むデータ移送の好ましい形態を有することができる。この場合、好ましい選択肢は、これらのレジスタを使用して加算を実行することである。このため、ネゴシエーションの結果を提供するためにレジスタを使用することに対し、Ｏｕｔエージェントによって後続するコンポーネントと実行される任意のネゴシエーションにおいて高い重み付けが与えられることになる。
【０２０５】
このため、この例では、供給者がデータをメモリレジスタにコピーすることによって移送することを好むため、ａｄｄコンポーネントは、Ｏｕｔエージェントに対しデータ移送のこの形態に対し高い重み付けを置くようになっている。Ｏｕｔエージェントに結合されたコンポーネントもまたメモリレジスタを介して転送されるデータを受け取ることができるものとすると、これは、すべてのコンポーネント間の合意されたネゴシエーションポジションであると確定されることになる。
【０２０６】
同様に、逆方向連鎖方法では、Ｏｕｔエージェントに結合されたコンポーネントは、まず、ネゴシエーション手続き中に、ａｄｄコンポーネントと後続するコンポーネントとの間のデータ移送の好ましい形態を確定する。たとえば、これは、特定のレジスタに対する選好なしにメモリレジスタを介してデータを移送することが好ましいと指定してもよい。そして、ａｄｄコンポーネントは、Ｉｎ１エージェント及びＩｎ２エージェントによって実行されるネゴシエーションに対しそれぞれのメモリレジスタのデータを移送するためにネゴシエーションポジションに対する重み付けを上昇させる。
【０２０７】
このため、ここでもまた、これを使用して、Ｉｎ１エージェント及びＩｎ２エージェントに結合されたコンポーネントによって生成されるコード断片が、実行時に事前に確定された（Ｉｎ１、Ｉｎ２を通してのネゴシエーションを介する）メモリレジスタ位置にデータを提供し、それによりソリューションのパフォーマンスが向上することを保証することができる。
【０２０８】
当業者には、ネゴシエーションを独立して行うことにより、加算機能を実装するために追加の命令コードを利用してａｄｄコンポーネントによってコードフラグメントが生成され得ることが理解されよう。特に、加算コードフラグメントには、データを所定のレジスタに移動させる２つの命令と、加算を実行するさらなる命令と、結果を適当なレジスタに移動させる最後の命令とが必要である。
【０２０９】
しかしながら、ネゴシエーションを連鎖させることにより、加算コードフラグメントは単一命令のみを必要とするようにすることができる。この場合、Ｉｎ１エージェント及びＩｎ２エージェントに結合されたコンポーネントからのコードフラグメントは、加算されるデータを、加算コードフラグメントによって要求される所定のレジスタに配置する。そして、加算コードフラグメントは、これらのレジスタの内容が加算されるようにする単一命令を生成することができ、結果レジスタもまた、ｏｕｔエージェントに接続されたコンポーネントとなされた移送合意を満足させる。
【０２１０】
＜局所基本要素＞
使用の際、ビルドプロセス中に仕様が実装されると、コンポーネントを、それぞれのコンポーネントサーバによってそれぞれのコンポーネントインスタンスとして実装することができる。コンポーネントサーバは、通常、コンポーネントサービスを構築し送るために使用されるコンポーネントの内部仕様を具体化する。この内部仕様は、それぞれのコンポーネント内に含まれる下位コンポーネントの相対編成を表し、結果は、コンポーネントサービスを送ることである。
【０２１１】
当業者には、これが階層配置であり、仕様全体において高い方のコンポーネントの内部仕様内の下位仕様として実装されるコンポーネント自体が、下位コンポーネントの配置を定義する内部仕様を含むことができる、ということが理解されよう。
【０２１２】
しかしながら、最終的に、自身がさらなる下位コンポーネントからは構成されておらず、したがってそれ自体が内部仕様を有していないコンポーネントが提供される。この特定の例では、コンポーネントは、たとえばオペレータに対してデータを手動で処理させるか、又は処理が実行可能コード等を使用して実行されるようにすることにより、データ処理を直接実行する。
【０２１３】
内部仕様を有しておらずそれ以上下位コンポーネントに分解されないこうしたコンポーネントを、一般に基本コンポーネントと呼ぶ。
【０２１４】
したがって、基本コンポーネントは、下位コンポーネントにそれ以上分解することができず、したがってそれ自体データ処理を実行するサーバによって実装されるコンポーネントである。当業者には、これらコンポーネントを基本コンポーネントと呼ぶが、それらは、単純な処理に制限されるものではなく、それらがそれぞれの実装及び実装するサーバの複雑性に応じて実行するサービスにおいて、任意に複雑であり得る、ということが理解されよう。
【０２１５】
このことから、後により詳細に説明するように、基本コンポーネントサーバ自体が、適当な仕様を構築することによって作成される実行可能コードであることが理解されよう。基本コンポーネントを提供することに加えて、局所基本コンポーネントと呼ばれるコンポーネントの追加の下位分類がある。
【０２１６】
局所基本コンポーネントは、高レベルのコンポーネントの内部仕様の一部として実装される基本コンポーネントである。内部コンポーネント内の下位コンポーネントに加えて、局所基礎コンポーネントは、より高レベルのコンポーネントを具体化するコンポーネントサーバの一部として実装される。
【０２１７】
このため、コンポーネントサーバがより高レベルのコンポーネントに対応するコンポーネントインスタンスを生成する場合、このコンポーネントインスタンスを表すコードは、局所基本コンポーネントの機能を組み込む。これにより、局所基本コンポーネントを内部仕様の一部として実装することができ、必要なデータ処理及び機能のすべてがコンポーネントサーバ自体によって実行される。そして、これにより、局所コンポーネントを局所的にすることができ、システムのパフォーマンスが大幅に向上する。
【０２１８】
このため、たとえば、コンポーネントが実装される場合、局所基本コンポーネントによって提供される機能は、それぞれのコンポーネントサーバ自体によって実装され、したがって、遠隔地でサービスが実行される必要はない。これにより、データをコンポーネントサーバから世界中の別の場所にある別のコンポーネントサーバに転送する必要が低減し、局所基本コンポーネントの機能を実装することができる。これにより、ネットワークトラフィックが低減し、局所基本コンポーネントによって具体化されるそれぞれのサービスに対する取得命令等の必要がなくなる。
【０２１９】
さらに、サーバ自体内に機能を提供することにより、コンポーネントがサーバ自体の挙動を変更することができるメカニズムが提供される。
【０２２０】
ここで、この一例を図１１Ａに示すａｌｅｒｔコンポーネントを参照して説明する。特に、ａｌｅｒｔコンポーネントは、図示するようにＩｎエージェント及びＯｕｔエージェントを含む。
【０２２１】
使用の際、トラフィックは、ａｌｅｒｔコンポーネントを通ってＩｎエージェントからＯｕｔエージェントにルーティングされ、したがって、これを、単に、コンポーネントの内部仕様内の２つのそれぞれの下位コンポーネント間の任意の接続に提供することができる。
【０２２２】
使用の際、ａｌｅｒｔコンポーネントは、そこを通って転送されるトラフィックを監視し、障害又は予測されないトラフィックが発生した場合にサーバオペレータに対してポップアップダイアログを表示するようになっている。これにより、サーバオペレータに対し、障害が発生した事実を警告することができ、ポップアップダイアログボックスは、障害の性質を示す。
【０２２３】
当業者には理解されるように、ａｌｅｒｔコンポーネントが異なるコンポーネントサーバのコンポーネントとして実装される場合、異なるマシンに提供されるａｌｅｒｔコンポーネントサーバは、ポップアップダイアログボックスを意味のあるコンテキストで表示するために親サーバのディスプレイにアクセスする必要がある。しかしながら、サーバの動作に関する情報がシステムの他のサーバによって要求されるため、これは深刻な安全性問題をもたらす。
【０２２４】
これに加えて、局所基本要素は、仕様等によって実行される計算で使用するためにサーバからの構築時間データへのアクセスを提供するようになされることが可能である。
【０２２５】
たとえば、局所基本コンポーネントを使用して、サーバのアクティブなインスタンスの数の指示を含む仕様を実装するコンポーネントサーバを提供してもよい。これにより、現サーバに対する負荷が管理不能となるように見える場合、処理を他の二次サーバにオフロードすることができる。
【０２２６】
局所基本コンポーネントのさらなる例には、ロード及び保存機能を提供するために必要とされるｌｏａｄコンポーネント及びｓａｖｅコンポーネントが含まれる。特に、コンポーネントインスタンスが、遠隔地からファイルをロードすることが必要とされる場合、サーバ自体によってロードプロセスが制御されることが好ましい。したがって、ｌｏａｄコンポーネントを、コンポーネントインスタンスの一部として提供することができ、それにより、コンポーネントインスタンス及び故にサーバがそれぞれのロード動作を実行することが可能になる。
【０２２７】
このように、局所基本コンポーネントがコンポーネントインスタンス自体の一部を形成することを確実にすることにより、局所基本コンポーネントが、コンポーネントサーバが利用することができる方法でその動作を実行するようにコンポーネントサーバと正確に通信することが保証され、したがって、上記例では、ファイルが局所設定に基づいて正確にロードされることが保証される。当業者には、異なるコンポーネントサーバにロードコンポーネントが提供された場合、このタスクははるかに複雑になるということが理解されよう。
【０２２８】
図１１Ｂに、基本コンポーネントの別の例を示す。特に、この例は、入力エージェントＩｎ、出力エージェントＯｕｔ及びｗａｔｃｈエージェントＷを有するｗａｔｃｈコンポーネントのものである。使用の際、ｗａｔｃｈエージェントは、上述したａｌｅｒｔコンポーネントと同様に、単に、入力Ｉｎにおいて受け取られた任意のデータを通過させ、通過するすべてのトラフィックを監視するように動作する。しかしながら、この例では、ｗａｔｃｈコンポーネントは、たとえばｗａｔｃｈエージェントＷを介してｗａｔｃｈコンポーネントに問い合わせることにより、ｗａｔｃｈエージェントを介してトラフィックの詳細を確定することを可能にするようになっている。
【０２２９】
コンポーネントの内部仕様内にいくつかのｗａｔｃｈコンポーネントを提供することによって、コンポーネントの実装を監督しているエンティティが、コンポーネントがビルドプロセス中にどのように動作しているかを監視し、ネゴシエーション又は他のエージェントメッセージを許可し、且つ実行中にメッセージのペイロードを監視することにより転送されているデータを確定することが可能になる。
【０２３０】
したがって、当業者には、これを、局所基本コンポーネントとして、又はそれぞれの監視サーバによって実装される標準基本コンポーネントとして実装することができることが理解され、それにより、局所基本コンポーネントとしての基本コンポーネントの状態が、その実装に依存し、コンポーネント自体の性質には必ずしも依存しないことが強調される。
【０２３１】
留意すべきさらなる点は、局所基本コンポーネントが、メインサーバ内に構築されるミニサーバとして実装される、ということである。したがって、取得及び管理を通して必要な処理を実行するような方法で配置される局所基本コンポーネントの集まりを使用して局所処理を実装するのではなく、且つメインサーバの一部として多くのミニサーバを実装するのではなく、局所処理を、メインコンポーネントサーバの実行可能ファイルの一部を形成するカスタムコードフラグメントにひとまとめにすることができる。これを使用して、部分的には基本コンポーネントであるが依然として下請けであるカスタムコンポーネントサーバを提供することができる。
【０２３２】
＜多段階トランザクション＞
状況によっては、連続して複数回コンポーネントを実装することができることが有用である。これを実現するために、コンポーネントが順に複数回定義される仕様を構築することが可能である。しかしながら、状況によっては、これは、問題に対する適当なソリューションを表していないことが理解されよう。
【０２３３】
たとえば、長さが不確定のループを実装することが必要である場合、それぞれのループにおいて各動作を実行するために必要なコンポーネントの数が未知であるため、単に複数のコンポーネントを合せて順に連鎖させることは不可能である。
【０２３４】
この問題に対する代替ソリューションは、コンポーネントの多段階トランザクション動作を提供することであり、ここで、この一例について、図１２Ａ〜図１２Ｄを参照して説明する。
【０２３５】
図１２Ａに示すように、それぞれの入力エージェント１１０１及び出力エージェント１１０２を有するコンポーネント１１００が提供される。コンポーネント１１００は、図示するようにそれぞれの入力エージェント１１１１及び出力エージェント１１１２を有する下位コンポーネント１１１０を含む。使用の際、文字列＄を外部エージェント１１０３から内部エージェント１１０１に転送することが望まれる。そして、文字列は、エージェント１１１１に転送され、コンポーネント１１１０を使用して操作される。結果としての変更文字列＄'は、エージェント１１１２及びエージェント１１０２を介して出力され、図示するように入力１１０１に再循環され、それにより文字列はコンポーネント１１１０を通過することができ、さらに変更される（＄"）。この構成では、ループは絶えず繰り返されることが理解されよう。
【０２３６】
コンポーネント１１００を単一動作ループコンポーネントとして提示することが望ましく、したがって、それには、コンポーネント１１００がコンポーネント１１１０を未知の回数実装することが必要である。これを実現するために、図１２Ｂに示す仕様構成が使用される。
【０２３７】
この例では、コンポーネント１１００の内部仕様は、コンポーネント１１００自体を破棄せずに、その動作の完了後に破棄される。これを、実施態様に応じて複数の方法で実現することができ、それについては後により詳細に説明する。
【０２３８】
コンポーネント１１００は、そのエージェント１１０１、１１０２の各々が複数のトランザクションを受けることができるという点で多段階コンポーネントである。これは、コンポーネント１１００の境界を越えた受け渡しを禁止することによって実現され、それにより、コンポーネント１１００を終了させることなく内部仕様を複数回構築し破棄することができる。これに加えて、エージェント１１０１はまた、セレクタエージェントとして動作するようになっており、たとえばエージェント１１０１によって受け取られるデータに応じて、コンポーネント１１００の内部仕様を選択することが可能となる。
【０２３９】
これに加えて、メモリコンポーネント１１２０が提供される。メモリコンポーネントは、図示するように仕様内で相互接続される３つのそれぞれのエージェント１１２１、１１２２及び１１２３を含む。この例では、図示するように、エージェント１１２３は、初期メモリ値を含むペイロードを受け取るように動作し、ペイロードは、エージェント１１２１を介してエージェント１１０１に転送される。メモリコンポーネント１１２０は、エージェント１１２２を介してペイロードを受け取ると、後により詳細に説明するように、ペイロードの値を記憶し、その後記憶した値を、エージェント１１２１を介してペイロードとして転送する。
【０２４０】
このため、図１２Ｂに示すように、ビルドプロセス中、エージェント１１０１、１１２１；１１０２、１１２２；及び１１２３、１１０３は、適当なメッセージを交換することによって相互接続する。この段階では、コンポーネント１１００の内部仕様は未決定である。
【０２４１】
通信が確立すると、エージェント１１２３は、エージェント１１０３から文字列＄を受け取り、これを、エージェント１１２１を介してエージェント１１０１に転送する。これは、通常、エージェント間で転送されるそれぞれのメッセージのペイロードとして文字列を提供することによって実行される。
【０２４２】
この時点で、エージェント１１０１は、コンポーネント１１００に対して内部仕様を確定するように動作し、したがってエージェント１１０１は、図１２Ｂに示す十字記号によって示すように多段階セレクタエージェントである。仕様は事前に定義されており、エージェント１１２１から受け取られたペイロードの内容によって決まってもよい。この例では、内部仕様は、上述したようにコンポーネント１１１０を含む。
【０２４３】
これに加えて、多段階トランザクションエージェント１１０１、１１０２は、それぞれ一時的エージェント１１０１Ｂ、１１０２Ｂを生成するように動作する。これら一時的エージェントは、内部仕様が終了した後に終了する単一段階トランザクションエージェントである。この場合、内部仕様は、図１２Ｃに示すように、エージェント１１１１、１１１２がそれぞれエージェント１１０１Ｂ、１１０２Ｂに接続するように構築される。
【０２４４】
一時的エージェント１１０１Ｂ、１１０２Ｂが使用されることにより、エージェント１１０１に提示されたペイロードを、「通過（hand through）」と呼ばれるプロセスで一時的エージェント１１０１Ｂを介してエージェント１１１１に転送することができるようにすることによって、多段階セレクタエージェント１１０１が開いたままである。したがって、通過は、上述した受け渡しの代替メカニズムである。
【０２４５】
通過では、エージェント１１０１Ｂを提示することにより、エージェント１１０１が開いたままであるのを可能にしながら接続を切断しエージェント１１０１Ｂを終了させることにより、コンポーネント１１００及び故にコンポーネント１１１０の内部仕様が正しく終了するようにすることができる。
【０２４６】
文字列＄はエージェント１１０１Ｂを介してエージェント１１１１に転送され、それにより、コンポーネント１１１０は文字列を変更して変更文字列＄'を生成することができ、これはエージェント１１１２を介してエージェント１１０２Ｂに転送される。
【０２４７】
この時点で、コンポーネント１１００は、内部仕様が必要な処理を実行したと判断し、これは、通常、仕様自体の中で固有である何らかの形態の終了メカニズムを使用して実現される。したがって、これを、後により詳細に説明するように、終了コンポーネント等を使用して実現してもよい。いずれの場合も、コンポーネント１１００及び故にコンポーネント１１１０の内部仕様は、図１２Ｄの点線によって表されるように終了する。通常、これには、コンポーネント１１１０を表すコンポーネントインスタンスを終了させるコンポーネントサーバが関与する。
【０２４８】
エージェント１１０１は、メッセージペイロードの変更文字列＄'をメモリコンポーネント１１２０のエージェント１１２２に転送し、それにより、メモリに格納された文字列＄は文字列＄'に置き換えられる。エージェント１１２１は、文字列＄'をセレクタエージェント１１０１に転送するように試みる。しかしながら、セレクタエージェントは、内部仕様が完全に終了するまでいかなる入来ペイロードもブロックするようになっており、それにより、新たな内部仕様を構築することができる。したがって、メモリコンポーネント１１２０は、その時点で新たな内部仕様を構築することができることを確認するエージェント１１０１からのメッセージを待ち、したがって、必要に応じて、且つ図１２Ｄに示すように、文字列＄'をエージェント１１０１に転送する。
【０２４９】
変更文字列＄'を受け取ると、多段階セレクタエージェント１１０１は、図１２Ｃに示す内部仕様が構築されるようにする取得命令を生成するように動作し、それによりループが繰り返されることが可能になる。
【０２５０】
この例では、このプロセスは連続的に繰り返されるため、文字列はコンポーネント１１１０によって変更され、その後、コンポーネント１１１０は、再取得されそれにより文字列を再度変更する前に終了する、ということが理解されよう。
【０２５１】
しかしながら、これとは対照的に、コンポーネント１１００は、より大きい仕様内では一度しか構築されず、ループの繰返し毎に再取得されないという点で不変である。このため、コンポーネント１１００は、外部的には不変コンポーネントを提示するが、内部的には再取得されたコンポーネントを利用して多段階トランザクションを実行する。
【０２５２】
より複雑な状況でこうしたループの平滑な動作を確実にするために、ループにおけるコンポーネントのすべてによるすべての処理が次のループの繰返しの前に確実に完了していることが重要であり、それにより同期問題が回避される。
【０２５３】
たとえば、上述した状況では、コンポーネント１１１０の終了前にエージェント１１０１に出力文字列＄'を提示することにより、問題が引き起こされる可能性がある。
【０２５４】
これを防止するために、エージェント１１０１は、通常、コンポーネント１１００が終了するまでブロックされ、これは、後により詳細に説明するように実現される。
【０２５５】
＜終了＞
コンポーネントが具体化されたサービスを実行すると、コンポーネントインスタンスは終了する。コンポーネントが終了していない場合、コンポーネントインスタンスがコンポーネントサーバで生成されると、これは無期限に持続することになる。その結果、コンポーネントサーバは、使用済みのそれ以上必要でないコンポーネントインスタンスによって過負荷状態となる。これを回避するために、コンポーネントを、適当なイベントが発生した時に実装サーバに対しそれぞれのコンポーネントインスタンスを閉じさせることにより終了させる。
【０２５６】
これは、たとえば、それぞれのサービスが完了した時に自動的に行われてもよい。以前、これは、コンポーネントインスタンスによるサービスの受け渡し又は完了等のイベントによってトリガされた。しかしながら、この場合、コンポーネントインスタンスは、仕様全体においてその義務を果たすために必要である時間しか持続しない。
【０２５７】
しかしながら、これに関連して多数の潜在的な欠点がある。
【０２５８】
特に、コンポーネントビルドが開始されると、コンポーネントがすでにそのタスクを完了し終了している場合、プロセスを停止して、いくつかのコンポーネントの実装を繰り返し、誤りを訂正することは不可能である。これに加えて、コンポーネントに対しそれらの現状態について問い合わせる必要のある場合がある。さらに、通常、コンポーネントは、タスクを上位コンポーネントから完全に受け渡しする下位コンポーネントに分解し、それによりタスクを委任した上位コンポーネントが終了することになる。
【０２５９】
最後に、コンポーネントを完成した時に自動的に終了させることにより、サービスを提供することによって、サービスの提供に対する正確な報酬を保証することが困難になる可能性がある。
【０２６０】
これを回避するために、一例では、コンポーネントは、終了コマンドによって命令されるまで終了しない。この終了コマンドは、通常、階層のより高いレベルにあるコンポーネントから受け取られる。この機能を、ｔｅｒｍｉｎａｔｉｏｎコンポーネントによって実現することができ、その一例を図１３に示す。
【０２６１】
ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、それぞれの仕様における他のコンポーネントから通知メッセージを受け取るようになっているエージェントＩｎを含む。この通知メッセージを使用して、ｔｅｒｍｉｎａｔｉｏｎコンポーネントに対し、コンポーネントがその処理を完了しており、したがってそれ以上必要とされないということが示される。
【０２６２】
通知メッセージを受け取ることに応じて、ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、仕様から確定されるように指定されたコンポーネントに転送される終了命令を提供する。これは、取得命令と同様のメカニズムを使用して転送される。このため、ｔｅｒｍｉｎａｔｅｉｏｎコンポーネントを、局所基本コンポーネントとして実装してもよく、それにより、コンポーネントインスタンスを実装するサーバが、終了しているコンポーネントを実装しているサーバに終了命令を転送する。
【０２６３】
これに加えて、ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、所定の規則にしたがって終了命令を生成するように動作してもよい。これは、終了命令が送信されるべき時刻を指定してもよく、それによりコンポーネントは、その処理を完了し、ｔｅｒｍｉｎａｔｉｏｎコンポーネントに通知メッセージを転送することができる。そして、ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、終了命令を生成する前に適当な時間待機する。
【０２６４】
別の方法として、これを、外部イベントに従って実現してもよく、それによりｔｅｒｍｉｎａｔｉｏｎコンポーネントがイベントに反応しそれによって終了をもたらす。
【０２６５】
これに加えて、これは、システム内の報酬に対するメカニズムを提供する。詳細には、報酬は、終了命令内に何らかの形態の報酬指標又は指示を含めることによって実現される。したがって、コンポーネントインスタンスは、終了命令を受け取ると、報酬指標を記録するように動作し、それによりエンティティが後に何らかの方法で報酬を得ることができるようにする。これは、報酬指標を適当な支払い機関に対して提示することによって実現され、これは、たとえば、フォーラムの銀行を通して実現されてもよい。
【０２６６】
概して、ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、内部仕様の階層のそれぞれのレベル内のすべてのコンポーネントが同時に終了するように動作する。このため、たとえば、コンポーネントが終了する時、そのコンポーネントが複数の下位コンポーネントを含む場合、ｔｅｒｍｉｎａｔｉｏｎコンポーネントは、通常、それらの下位コンポーネントの各々に対し実質的に同時に終了命令を提供する。このように、終了は、処理が順に完了するに従って仕様を通して伝播する。
【０２６７】
＜多接続機能＞
バンドリングの一例については、以前、本出願人による同時係属出願ＰＣＴ／ＡＵ０３／０１４７４号において述べられている。
【０２６８】
これらのバンドリングの形態では、既知の数のエージェントが互いにバンドルされることにより単一バンドルエージェントが形成される。そして、バンドルエージェントを別のコンポーネントのエージェントに転送し、その後バンドルコンポーネントの対応する構成を使用してバンドルを解除することができる。この意味で、エージェントのバンドルを使用する通信は、エージェントメッセージを使用して実現され、そのエージェントメッセージのペイロードは、バンドルコンポーネントの各々によって収集されたエージェントアドレスからのペイロードの組み合わせから形成される、ということが理解されよう。
【０２６９】
エージェントバンドルを受け取ると、コンポーネントは、そこに含まれるエージェントを抽出し、必要に応じてこれらをそのコンポーネント内のエージェントに接続することができなければならない。このため、コンポーネントは、エージェントバンドルを正確にバンドルを解除する場合、バンドルに含まれるエージェントと、エージェントが提供される順序とを知らなければならず、それにより、必要に応じてエージェントをバンドルから抽出し他のエージェントに接続することができるようになる。
【０２７０】
これを実現するために、したがってエージェントは、通常、標準化された方法でバンドルされ、それにより、エージェントの一定構造を有する標準バンドルが使用される。これにより、バンドルコンポーネントの事前に確定された構成をバンドルの形成及び分解に使用することができる。このため、これは、入力エージェント及び出力エージェントの数が事前に定義されている環境でしか使用することができない。
【０２７１】
しかしながら、例によっては、より多くのエージェントの単一エージェントへのバンドリングを提供することができることが有用である。この場合、この数をサポートする個々のコンポーネントの数が実際的でなくほど大きくなる。
【０２７２】
これを、１対１接続性に対応する機能を依然として維持しながら、たとえば、可変数の出力エージェントを単一入力エージェントに接続するために使用してもよく、又はその逆でもよい。この一例を図１７Ａに示す。
【０２７３】
この例では、３つのエージェントＡ１、Ａ２、Ａ３をｔｅｓｔコンポーネントの単一ＩＯエージェントに接続することが望まれる。しかしながら、３つのエージェントの使用は単に例として示されており、他の仕様では追加のエージェントを設けてもよい、ということが理解されよう。したがって、ｔｅｓｔコンポーネントが或る範囲の仕様で使用されるために十分汎用性がある場合、ＩＯエージェントは、未知の数のエージェントに接続することができなければならない。このため、ｔｅｓｔコンポーネントは、未知の数のエージェントのバンドルを受け取り、そのバンドルを正しく分解し解釈することができなければならない。
【０２７４】
一例では、これは、概してｎｂｕｎｄｌｅコンポーネントと呼ばれるバンドルコンポーネントの変更された形態を使用して実現される。ｎｂｕｎｄｌｅコンポーネントの２つの例を図１７Ｂに示す。
【０２７５】
この例では、ｎｂｕｎｄｌｅコンポーネントｎｂｕｎｄｌｅ１は２つのエージェントを含み、それらは、概念的に入力エージェント及び出力エージェントを形成する。後述するように、このコンポーネントを使用して、ｎｂｕｎｄｌｅコンポーネントのチェーンを終了させる。このため、入力エージェントは、エージェントＡ１、Ａ２、Ａ３のうちの１つと通信するようになっており、出力エージェントは、チェーンのより高い他のｎｂｕｎｄｌｅコンポーネントと通信するようになっている。
【０２７６】
これとは対照的に、第２のｎｂｕｎｄｌｅコンポーネントｎｂｕｎｄｌｅ２は、概念的には２つの入力エージェント及び１つの出力エージェントを形成する３つのエージェントを有する。この場合、入力エージェントのうちの１つは、チェーンのより低いｎｂｕｎｄｌｅコンポーネントに結合され、他の入力エージェントは、エージェントＡ１、Ａ２、Ａ３のうちの１つに結合される。出力エージェントは、チェーンのより高い他のｎｂｕｎｄｌｅコンポーネントに結合される。
【０２７７】
ｎｂｕｎｄｌｅコンポーネントがいかに結合されチェーンを形成するかの一例を図１７Ｃに示す。
【０２７８】
使用の際、ｎｂｕｎｄｌｅコンポーネントの動作は、いくつかの相違はあるが上述したｂｕｎｄｌｅコンポーネントの動作に類似する。第１に、ｎｂｕｎｄｌｅコンポーネントは、エージェントＡ１、Ａ２、Ａ３に結合される入力エージェントをブロックするように動作し、それによりエージェントＡ１、Ａ２、Ａ３がｎｂｕｎｄｌｅコンポーネントに任意のペイロードを転送するのを防止する。これにより、ｎｂｕｎｄｌｅコンポーネントとエージェントＡ１、Ａ２、Ａ３又はそれに関連する任意のコンポーネントとの直接の通信が防止される。第２に、ｎｂｕｎｄｌｅコンポーネントは、生成されたエージェントバンドル内のカウンタを維持するように作用し、それにより、ｎｂｕｎｄｌｅを受け取るコンポーネントがそれに含まれるエージェントの数を確定することができる。エージェントメッセージは、ＸＭＬファイルの形式であり、したがってカウンタは、適当なＸＭＬタグを使用することによって識別されるファイル内の数値として提供される。
【０２７９】
このため、使用の際、ｎｂｕｎｄｌｅコンポーネントは、結合されているエージェントのエージェントアドレスを、ｎｂｕｎｄｌｅ１コンポーネントを含むチェーンの底部から開始して収集することによって作用する。当業者には、同時係属特許出願ＰＣＴ／ＡＵ０３／０１４７４号に記載されているように、エージェントＡ１、Ａ２、Ａ３のアドレスが、そこに結合されたｎｂｕｎｄｌｅコンポーネントの構築を開始するために使用される取得命令の一部として提供されるということが理解されよう。
【０２８０】
このため、ｎｂｕｎｄｌｅ１コンポーネントは、エージェントＡ３のエージェントアドレスを確定し、これを、チェーンの次のｎｂｕｎｄｌｅコンポーネントｎｂｕｎｄｌｅ２に転送されるエージェントメッセージのペイロードに挿入する。同時に、ｎｂｕｎｄｌｅ１コンポーネントはまた、エージェントバンドルがこの時点で単一エージェントのみを含むことを示す、初期カウンタ値「１」をエージェントメッセージに提供する。
【０２８１】
エージェントメッセージは、次のｎｂｕｎｃｌｅ２コンポーネントに転送され、この場合、次のｎｂｕｎｄｌｅ２コンポーネントはエージェントＡ２のアドレスを追加し、エージェントメッセージをチェーンの次のｎｂｕｎｄｌｅコンポーネントに転送する前にカウンタを「１」だけインクリメントする。
【０２８２】
このことから、ｔｅｓｔコンポーネントは、エージェントＡ１、Ａ２、Ａ３のアドレス及びカウンタ値「３」を含む単一エージェントメッセージを受け取ることが理解されよう。
【０２８３】
このため、ＩＯエージェントの観点からすると、それは、単一エージェントメッセージを受け取って通信を開始し、したがって、１対１エージェント接続が提供されるかのように見える。
【０２８４】
使用の際、ｔｅｓｔコンポーネントは、バンドルからエージェントを抽出する何らかの形態のメカニズムを実装する。当業者には理解されるように、たとえば図１７Ｄに示すように、これを、それぞれのエージェントＢ１、Ｂ２、Ｂ３に接続されたｎｂｕｎｄｌｅコンポーネントの対応する構成を使用して実現してもよい。
【０２８５】
この場合、ｎｂｕｎｄｌｅコンポーネントの各々はエージェントアドレスを交換し、それによりｎｂｕｎｄｌｅコンポーネントは（上述した技法を使用して）受け渡しをすることができ、それによって、図１７Ｅに示すようにエージェントＢ１、Ｂ２、Ｂ３及びエージェントＡ１、Ａ２、Ａ３が直接接続する。このため、エージェントバンドルに対応するエージェントメッセージを受け取るｎｂｕｎｄｌｅコンポーネントは、エージェントメッセージをチェーンの次のｎｂｕｎｄｌｅコンポーネントに転送する前に、そこから第１のエージェントアドレスを抽出するように動作する。このプロセス中、カウンタの値もまたデクリメントされ、バウンドルの最後のエージェントを識別することができるようになる。
【０２８６】
ｔｅｓｔコンポーネント内のｎｂｕｎｄｌｅの必要なチェーンを正確に生成するためには、ｔｅｓｔコンポーネントの内部仕様を実装される際に変更することができることが必要である。当業者には、ＩＯエージェントによって受け取られるエージェントメッセージに提供されるカウンタ値に従ってこれを実行することができ、それによってｔｅｓｔコンポーネントがｎｂｕｎｄｌｅコンポーネントの適当なチェーンを生成することができ、それにより必要に応じてバンドルからエージェントを抽出することができる、ということが理解されよう。
【０２８７】
これを、セレクタエージェントの使用を介して実現することができ、ここでこの一例を、図１８Ａ〜図１８Ｅを参照して説明する。
【０２８８】
特に、図１８Ａは、上述したＤＵＰコンポーネントと、各々がそれぞれＸＭＬ Ｉｎエージェント、ＴＡＧ Ｉｎエージェント、Ｖａｌｕｅ Ｏｕｔエージェント、ＸＭＬ Ｏｕｔエージェント及びエラーＥエージェントを有する２つのＦｉｎｄ Ｔａｇコンポーネントとを利用する、ｔｅｓｔコンポーネントのための内部仕様の一例を示す。この内部仕様はまた、図示するようにＳｉｚｅエージェント及びＩｎｐｕｔエージェントを有するｄｅｃｉｓｉｏｎと付されたコンポーネントも含む。
【０２８９】
使用の際、２つのＦｉｎｄ Ｔａｇコンポーネントは、図示するように、ＤＵＰコンポーネントと、ｎｂｕｎｄｌｅタグエージェント及びｓｉｚｅ ｔａｇエージェントとに接続される。ＸＭＬ Ｏｕｔエージェント及びＥエージェントは、この例では使用されず、その結果、内部仕様の内部エージェントに接続される。この内部エージェントは、エージェントが別のエージェントに接続しその後正常に終了することができるように動作するエージェントである。
【０２９０】
使用の際、図１７Ｃに示すｎｂｕｎｄｌｅコンポーネントのシーケンスによって生成されるエージェントバンドルは、図１８Ａの左側に示すＩＯエージェントにおいて受け取られる。エージェントバンドルは、ＤＵＰコンポーネントに転送され、ＤＵＰコンポーネントは、エージェントバンドルのコピーを第１のＦｉｎｄ ＴａｇコンポーネントのＸＭＬエージェントとｄｅｃｉｓｉｏｎコンポーネントのＩｎｐｕｔエージェントとに転送する。
【０２９１】
Ｆｉｎｄ Ｔａｇコンポーネントは、ＸＭＬファイルを含むエージェントメッセージの形式であるエージェントバンドルを受け取る。ＸＭＬファイル内に含まれる特定のｎｂｕｎｄｌｅタグの指示は、Ｔａｇ Ｉｎエージェントを介して受け取られ、これは、通常、ルックアップテーブル（ＬＵＴ）等から取得される。Ｆｉｎｄ Ｔａｇコンポーネントは、ＸＭＬファイル内の指定されたタグを見つけ、そこに含まれる値をＶａｌｕｅ Ｏｕｔエージェントを介して図示する第２のＦｉｎｄ Ｔａｇコンポーネントに転送するように動作する。
【０２９２】
第２のＦｉｎｄ Ｔａｇコンポーネントは、同様の手続きを実行しｓｉｚｅ ｔａｇエージェントからサイズタグを受け取るように動作し、これには通常、ＬＵＴにアクセスすることが含まれる。サイズタグは、エージェントバンドルにおけるエージェントの数を指示するカウンタ値の指示を含む第１のＦｉｎｄ Ｔａｇコンポーネントから受け取られた値の中で提供される。この値は、図示するｄｅｃｉｓｉｏｎコンポーネントのｓｉｚｅエージェントに供給される。
【０２９３】
使用の際、ｓｉｚｅエージェントはセレクタエージェントであり、したがって、エージェントバンドルのサイズに従ってｄｅｃｉｓｉｏｎコンポーネントに対し内部仕様を確定するように動作する。このため、エージェントメッセージ内に含まれるインクリメントされたカウンタ値は、２つのＦｉｎｄ Ｔａｇコンポーネントによって抽出され、ｄｅｃｉｓｉｏｎコンポーネントに対しそれぞれの内部仕様を選択するために使用される。
【０２９４】
バンドルが２つ以上のエージェントを含む場合、選択される内部仕様は図１８Ｂに示すようなものである。詳細には、内部仕様は、図示するように、ＳＵＢコンポーネント、ＲＮＤコンポーネント、ｎｂｕｎｄｌｅ２コンポーネント、ｄｅｃｉｓｉｏｎコンポーネント及びｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントを含む。
【０２９５】
使用の際、エージェントバンドルは、ｉｎｐｕｔエージェントを介してｎｂｕｎｄｌｅ２コンポーネントに転送される。ｎｂｕｎｄｌｅ２コンポーネントは、階層構造の第１のエージェントのバンドルを解除するように動作し、これをｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントのｃｌｉｅｎｔエージェントに転送する。したがって、図１７Ｃの例では、第１のエージェントはエージェントＡ１に対応し、これは、ｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントのｃｌｉｅｎｔエージェントと相互接続される。エージェントバンドルの残りは、ｄｅｃｉｓｉｏｎコンポーネントのｉｎｐｕｔエージェントに転送される。
【０２９６】
このように、このプロセスは、エージェントＡ１のアドレスを分離するように動作し、エージェントメッセージにはエージェントＡ２、Ａ３のアドレスが残される。
【０２９７】
同時に、ｓｉｚｅエージェントを介して受け取られるサイズ値がＳＵＢコンポーネントのエージェント１に転送され、それにより、ＳＵＢコンポーネントは、エージェント２で受け取られた値、この場合は「１」を減算するように動作する。結果としての出力値は、エージェントＯ及びエージェントＩを介してＲＮＤコンポーネントに転送される。ＲＮＤコンポーネントは、受け取った値を丸め、結果としての整数値を出力エージェントＯからｄｅｃｉｓｉｏｎコンポーネントのｓｉｚｅエージェントに転送するように動作する。これが必要であるのは、この例では、ＳＵＢコンポーネントは１０進数値を生成するが、整数値が必要とされるためである、ということが理解されよう。
【０２９８】
これは、上述したようにエージェントバンドルからエージェントが除去されたことを示すために実行される。
【０２９９】
ここでもまた、ｄｅｃｉｓｉｏｎコンポーネントにおけるｓｉｚｅエージェントはセレクタエージェントであり、エージェントサイズにおいて提示される値に従ってｄｅｓｉｃｉｏｎコンポーネントに対し内部仕様を選択するように動作する。したがって、エージェントバンドルのサイズが依然として１を上回る場合、ｄｅｃｉｓｉｏｎコンポーネントは同じ内部仕様を使用して実装され、したがって上述したように動作する、ということが理解されよう。
【０３００】
このため、この例では、エージェントＡ２のアドレスはさらなるｐｒｏｃｅｓｓｏｒ ｃｏｎｎｅｃｔｉｏｎコンポーネントに送られ、エージェントバンドルの残りは対応するｄｅｃｉｓｉｏｎコンポーネントに転送される。
【０３０１】
ｓｉｚｅエージェントに提示されるサイズが「１」に等しい場合、ｄｅｃｉｓｉｏｎコンポーネントの内部仕様は図１８Ｃに示すようになる。このため、この場合、サイズエージェントは未接続のままであり、内部仕様を選択するためのみに使用される。入力エージェントがｎｂｕｎｄｌｅ１コンポーネントに結合されることにより、残りのエージェントＡ３をｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントのｃｌｉｅｎｔエージェントに接続することができる。
【０３０２】
したがって、ｔｅｓｔコンポーネントの内部仕様、詳細には、内部仕様がエージェントバンドルにおけるエージェントの数に基づいて選択されるｄｅｃｉｓｉｏｎコンポーネントの繰り返される取得により、任意の数のエージェントのバンドルを正しく解除することができる、ということが理解されよう。したがって、バンドル内に含まれる可変数のエージェントをｔｅｓｔコンポーネントのＩＯエージェントに提示することができ、それにより、ｔｅｓｔコンポーネントは、エージェントをそれぞれのｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントのそれぞれのｃｌｉｅｎｔエージェントに受け渡す。
【０３０３】
使用の際、ｎｂｕｎｄｌｅコンポーネントはその後、エージェントＡ１、Ａ２、Ａ３がそれぞれのｃｌｉｅｎｔエージェントと直接接続するように受け渡しをする。
【０３０４】
このため、カウンタを含むエージェントバンドルを実装するために変更されたｎｂｕｎｄｌｅコンポーネントを利用することができ、それによりそこに含まれるエージェントの数を確定することができる。これにより、可変数のエージェントを単一エージェントとして提示することができ、それにより図１７Ａに示すように、有効に、複数のエージェントを単一エージェントに接続することが可能になる。
【０３０５】
単純なｎｂｕｎｄｌｅチェーンを生成することができるようにすることに加えて、ｎｂｕｎｄｌｅコンポーネントを階層的に連鎖させることも可能であり、それにより以下エージェントｎｔｒｅｅと呼ぶｎｂｕｎｄｌｅツリーが実装される。
【０３０６】
ｎｔｒｅｅの一例を図１９Ａに示す。詳細には、この例では、階層の最下レベルでは３つのｎｂｕｎｄｌｅコンポーネントが相互接続されており、階層の中間レベルでは６つのｎｂｕｎｄｌｅコンポーネントが相互接続されており、階層の最上レベルでは５つのｎｂｕｎｄｌｅコンポーネントが相互接続されている。
【０３０７】
この例では、結果としての最終出力エージェントは、ツリーをバンドル解除するように動作するｎｔｒｅｅコンポーネントのエージェントＩＯに接続される。
【０３０８】
ｎｔｒｅｅコンポーネントの内部仕様の一例を図１９Ｂに示す。この例では、内部仕様は、図示するように２つのＤＵＰコンポーネント、３つのＦｉｎｄ Ｔａｇコンポーネント、ＣＡＴコンポーネント、ＬＵＴコンポーネント、ＳＷ１コンポーネント及びｎｔｒｅｅコンポーネントを含む。
【０３０９】
使用の際、エージェントツリーはエージェントＩＯで受け取られ、第１のＤＵＰコンポーネントに、その後第２のＤＵＯコンポーネントに転送され、３倍になることができる。エージェントバンドルは、第１のＦｉｎｄ Ｔａｇコンポーネント及び第２のＦｉｎｄ Ｔａｇコンポーネントと、ｎｔｒｅｅコンポーネントのエージェントＩＯとに転送される。
【０３１０】
第１のＦｉｎｄ Ｔａｇコンポーネントは、後続するＣＡＴコンポーネントの入力エージェント１に結合されるエラーエージェントＥを有し、ＣＡＴコンポーネントは、第２のＦｉｎｄ ＴａｇコンポーネントのエラーエージェントＥに結合される第２の入力エージェント２を有する。使用の際、エラーエージェントＥによって提供されるエラー値は、ＣＡＴコンポーネントによって連結され、ＬＵＴコンポーネントの入力エージェントＩに転送される。
【０３１１】
ＬＵＴの出力エージェントＯは、コンポーネントＳＷ１の入力エージェントＳに結合され、入力エージェント２は第３のＦｉｎｄ Ｔａｇコンポーネントのｖａｌｕｅ ｏｕｔエージェントに結合される。
【０３１２】
この内部仕様の動作は以下の通りである。詳細には、第１のＦｉｎｄ Ｔａｇコンポーネントに提供されるエージェントｎｔｒｅｅは、図示するように、ｎｅｇ１ ｔａｇエージェントから確定されるｎｅｇ１タグの存在を確定するために分析される。ｎｅｇ１タグ内に含まれる値と確定されたＸＭＬとは無視され、エラー値Ｅはｃａｔ１エージェントに転送される。ｎｅｇ１タグが存在する場合、ＴＲＵＥ値がＣＡＴコンポーネントに提供され、ｎｅｇ１タグにアクセスされる場合、ＦＡＬＳＥ値が提供される。
【０３１３】
これは、処理されるエージェントが、チェーンの最後に発生するもののようなｎｂｕｎｄｌｅからの抽出を必要とするエージェントを表すか否かを表す。
【０３１４】
したがって、受け取られたエージェントｎｔｒｅｅが、図１９Ａに示すコンポーネントの組み合わせによって生成されるｎｔｒｅｅに対応する場合、ＦＡＬＳＥ値が返される。
【０３１５】
同様に、第２のＦｉｎｄ Ｔａｇコンポーネントは、処理されるエージェントがエージェントｎｔｒｅｅを形成するか否かを示すｎｂｕｎｄｌｅタグを探索するように動作し、ＴＲＵＥ又はＦＡＬＳＥの出力を示す。この場合、ＴＲＵＥ値が返される。
【０３１６】
エージェントがエージェントｎｔｒｅｅである場合、値が確定され第３のＦｉｎｄ Ｔａｇコンポーネントに転送され、第３のＦｉｎｄ Ｔａｇコンポーネントは、サイズタグを探索し確定されたサイズ値をスイッチコンポーネントＳＷ１に転送するように動作する。サイズ値は、ｎｔｒｅｅのそれぞれのチェーンのサイズを表し、この場合、それは、上述したように第１のチェーンである。
【０３１７】
ｎｅｇ１タグ及びｎｂｕｎｄｌｅタグの存在は排他的であり、それにより結果としての連結はＦＡＬＳＥＴＲＵＥとなるか又はＴＲＵＥＦＡＬＳＥとなることが理解されよう。この例では、ＬＵＴコンポーネントは、ＴＲＵＥＦＡＬＳＥ又はＦＡＬＳＥＴＲＵＥの連結をそれぞれＴＲＵＥ値又はＦＡＬＳＥ値に変換するように動作する。
【０３１８】
スイッチコンポーネントＳＷ１は、ＴＲＵＥ／ＦＡＬＳＥ値を検査するように動作する。ＴＲＵＥが確定される場合、これは、受け取られたエージェントが処理されることを示し、値ｎｅｇ１が入力エージェント１から出力エージェントＡまで転送される。そうでない場合、入力エージェント２で受け取られたサイズ値が出力エージェントＡに転送される。
【０３１９】
先の例と同様に、ｎｔｒｅｅコンポーネントのｓｉｚｅエージェントは、ｎｔｒｅｅコンポーネントの内部仕様を選択するために使用されるセレクタエージェントである。
【０３２０】
この例では、受け取られるサイズ値がｎｅｇ１値に対応する場合、これは、次のエージェントが処理されることを示し、したがって、図１９Ｃに示す内部仕様が選択され、エージェントがｐｒｏｃｅｓｓ ｃｏｎｎｅｃｔｉｏｎコンポーネントに直接接続されることが可能になる。これは、上述した方法と同様に実現され、必要に応じて中間コンポーネントの受け渡しが実行される。
【０３２１】
受け取られたサイズ値が１より大きい場合、選択された内部仕様は図１９Ｄに示すようになる。
【０３２２】
この例では、エージェントｎｔｒｅｅはＩＯエージェントからｎｂｕｎｄｌｅコンポーネントに転送され、ｎｂｕｎｄｌｅコンポーネントはエージェントを抽出し、そのエージェントは、第１のＤＵＰコンポーネントに、故にさらなるＤＵＰコンポーネント、３つのＦｉｎｄ Ｔａｇコンポーネント、ＣＡＴコンポーネント、ＬＵＴコンポーネント及びＳＷ１コンポーネントに転送される。これらコンポーネントは、図１９Ｂを参照して上述した構成にある。
【０３２３】
したがって、これは、抽出されたエージェントを検査し、これが処理されるべきエージェント、この場合はｎｔｒｅｅ階層の第２のレベルであるエージェントｎｔｒｅｅのさらなる部分であるかを判断するように動作することが理解されよう。前者の場合、動作は、図１９Ｃに関して上述したようなものであり、第２の場合、これは、目下説明しているようなｎｔｒｅｅコンポーネントの内部仕様を選択するために使用される値を確定するために使用される。
【０３２４】
これに加えて、この例では階層の最高レベルにある次のエージェントであるチェーンの次の部分が抽出され、図示するように後続するｎｔｒｅｅコンポーネントのＩＯエージェントに転送される。これに加えて、受け取られたサイズ値は、ＳＵＢコンポーネントにより１だけ低減されＲＮＤコンポーネントにより整数に丸められる。このサイズはこの場合もまたそれぞれの内部仕様を選択するために使用される。
【０３２５】
サイズ値が「１」である場合、これは、これが考慮されるべきエージェントｎｔｒｅｅの最後のエージェントであることを示す。したがって、ｓｉｚｅエージェントは、図１９Ｅに示す内部仕様を選択する。
【０３２６】
この場合、仕様は、最終エージェントを抽出し、これが処理されるべきエージェント、又は階層の後続するレベルに対応するかを判断するように動作する。
【０３２７】
エージェントが階層の別のレベルである場合、選択されたチェーンのサイズは、ｎｔｒｅｅコンポーネントの内部仕様が図１９Ｄ又は図１９Ｅのいずれかに示される内部仕様であるように確定される。そうでない場合、図１９Ｃに示す内部仕様が選択され、エージェントが処理される。
【０３２８】
図１９Ｆに示すように、最終的に追加された接続を単一バンドルに隠すことが可能であり、その後それを、バンドルを操作する適当なコンポーネントの内部コマンドコンポーネントに提供される適当なセレクタエージェントを使用することによって操作することができる。このため、これにより、多対１、１対多又は多対多の接続が可能となり、可変数のエージェントが実装される。
【０３２９】
コンポーネントがｎｔｒｅｅ接続をサポートする場合、接続の単一エージェントを含む別のコンポーネントは、内部処理を使用して必要に応じて新たな接続を作成するためにｎｔｒｅｅの特性を利用することができる。所与のｎｂｕｎｄｌｅチェーンに対する任意の動的拡張は、チェーンが完了するまで所与のｎｂｕｎｄｌｅチェーンに対するラベル付き処理となることに留意することが重要である。
【０３３０】
このため、必要に応じて新たな接続を実現するために所与のｎｂｕｎｄｌｅチェーンを動的に拡張することは可能ではないが、一方は処理のために使用され他方は他の接続が必要に応じて確保される、２つのエージェントの完全なバンドルチェーンを供給することは可能である。
【０３３１】
別の接続が必要である場合、図１９Ｆに詳述するように、完全な２エージェントｎｂｕｎｄｌｅチェーンを未使用入力に接続することができ、それによりこの場合もまた一方のエージェントを処理のために使用し他方のエージェントをさらなる拡張のために確保することが可能になる、という点でプロセスが繰り返される。
【０３３２】
当業者は、多数の変形及び変更が明らかとなることを理解するであろう。当業者に明らかとなるこうした変形及び変更のすべてを説明していないが、それらは本発明の説明をする前の特許請求の範囲にあるようにみなされるべきである。
【０３３３】
＜多点接続＞
上述した例のほとんどにおいて、各エージェントは、他の１つのエージェントのみと相互接続するようになっている。この例では、多重接続が必要な場合、これがバンドリングを用いて実現される。
【０３３４】
しかしながら、これに対する代替形態として、複数の異なるエージェントと同時に相互接続することができる多点接続エージェントを提供することができる。
【０３３５】
この一例を図２０に示す。ここでは、コンポーネントＣの第１のエージェントＡは、複数のエージェントＳ１、Ｓ２、Ｓ３、Ｓ４と選択的に相互接続するようになっている。
【０３３６】
エージェントが仕様の２つ以上の他のエージェントと相互接続される場合にこれを実現するために、エージェントは多点エージェントとして定義される。これを、後により詳細に説明する選択肢を用いて実現してもよく、したがって、コンポーネント供給者はエージェントが単一エージェントであるか又は多点エージェントであるかを選択することができる。
【０３３７】
いずれの場合も、エージェントは、エージェントが必要に応じて多数の異なるエージェントアドレスからメッセージを受け取ることを可能にするように変更される。これを実現するために、コンポーネントＣによって受け取られる取得命令は、エージェントＡが接続すべきエージェントのアドレスを含む。このため、たとえば、取得命令がエージェントＳ１、Ｓ２、Ｓ３のアドレスを含む場合、これによりエージェントＡは多点接続を提供し、それによってエージェントはエージェントＳ１、Ｓ２、Ｓ３の各々とメッセージを交換することができるようになる。
【０３３８】
エージェントＡがエージェントＳ１、Ｓ２、Ｓ３と通信する方法は、当業者には理解されるようにそれぞれのコンポーネントの機能によって決まる。
【０３３９】
ビルドプロセス中に追加のエージェントＳ４が追加される必要がある場合、コンポーネントＣに対する取得命令がコンポーネントによってすでに影響されているため別個のプロトコルが必要である。したがって、追加の取得命令又は他の適当なメッセージを、コンポーネントＣを実装するコンポーネントサーバに転送しなければならず、それにより追加のエージェントアドレスをエージェントＡに関連するエージェントリストに追加することが可能になる。
【０３４０】
これを、ルートサーバを介してメッセージを転送することによって実現してもよい。しかしながら、エージェントＡのアドレスは、エージェントＳ４を実装するコンポーネントには既知でない場合があり、そのため、別法として、メッセージをビルドプロセス中に介入コンポーネントを介して転送することができる。
【０３４１】
ここで、この一例を、図２０Ｂを参照して説明する。この例では、仕様は、最初に３つのコンポーネント１５００、１５１０、１５２０で構築され、各々がそれぞれの入力エージェント及び出力エージェント１５０１、１５０２；１５１１、１５１２；１５２１，１５２２を有する。この例では、エージェントは指向性を示すことができるように三角形として表されている。
【０３４２】
いずれの場合も、この例では、コンポーネント１５００はエージェント１５０２、１５１１及び１５１２、１５２１を介してコンポーネント１５２０に結合される。ビルドインが進行中となり各コンポーネント１５００、１５１０、１５２０に対応するコンポーネントサーバが構築されると、コンポーネント１５００は、コンポーネント１５２０に対する直接接続が必要であると確定することができる。
【０３４３】
この場合、コンポーネント１５００は、対応するアドレスを有する新たなエージェント１５０２を生成する。コンポーネント１５００は、エージェントメッセージを生成し、これはコンポーネント１５１０に転送され、コンポーネント１５１０はこれをコンポーネント１５２０に転送する。コンポーネント１５２０は、要求を受け取り、エージェント１５２１をエージェント１５０３に接続すべきであると確定する。したがって、コンポーネント１５２０は、エージェントを、多点接続が実行され得るように変更し、エージェント１５０３のアドレスの詳細を提供する。これにより、点線によって示すようにエージェントが相互接続することができる。
【０３４４】
順序付け
一例では、エージェントは、異なるエージェントと順に通信することによって動作することができる。したがって、エージェントが他の多くのエージェントと接続する場合、通信は適当な順序で実行されることが確実である必要がある。
【０３４５】
たとえば、複数のエージェントが各々、後に単一エージェントに送信されて適当なコンポーネントによって結合され得るようになるコードフラグメントを生成する場合、それらコードフラグメントは特定の順序で受け取られることが必要である可能性がある。
【０３４６】
順序付けは、仕様の構築内で暗黙的であってもよい。この一例を図２０Ｃに示す。この例では、図示するように、それぞれの入力エージェント及び出力エージェント１５５１、１５５２；１５６１、１５６２；１５７１、１５７２；１５８１、１５８２を有する４つのコンポーネント１５５０、１５６０、１５７０、１５８０が接続される。
【０３４７】
いずれの場合も、この例では、コンポーネント１５５０は出力をコンポーネント１５６０及び１５７０の各々に提供する。この結果、１５５０がそのタスクを完了し、コンポーネント１５６０、１５７０のいずれかが実装される前に出力をコンポーネント１５８０に提供しているという点で、コンポーネント間の通信に暗黙的な順序付けがある。したがって、この場合、エージェント１５８１は、エージェント１５６２及び１５７２より前にエージェント１５５２からメッセージを受け取るようになっている。このため、コンポーネント１５６０、１５７０に関するコンポーネント１５５０のこの連続構成は、暗黙的な順序付けを提供する。
【０３４８】
対照的に、コンポーネント１５６０、１５７０の各々は、それぞれのデータ処理サービスを並列に実装し、それによりエージェント１５８１に出力を同時に提供する可能性がある。これが起こるのを防止するためには、何らかの形式の順序付けを、たとえばビルド中のネゴシエーションプロセスの一部として実装してもよい。
【０３４９】
多点ネゴシエーション
多点エージェントが複数の異なるエージェントとネゴシエートしている場合、これを、複数の方法のうちの任意の１つで行うことができる。
【０３５０】
たとえば、これを、エージェントの各々と順にネゴシエートすることによって行うことができる。そのため、図２０Ｂにおいて上述した例では、エージェントＡはまずエージェントＳ１とネゴシエートしてネゴシエーションポジションを確立することができる。この場合、エージェントＳ２、Ｓ３に対し、強制的にこのネゴシエーションポジションを採用させてもよい。別の方法として、エージェントＡは、エージェントＳ１との複数の残りのネゴシエーションポジションを確定することができ、それによりエージェントＳ２とのネゴシエーションを残りのネゴシエーションポジションに基づかせることができる。
【０３５１】
いずれの場合も、先のネゴシエーションの結果により、後続するネゴシエーションポジションが合意されないようにすることができる。これが起こるのを回避するためには、場合によっては、複数のエージェントとのネゴシエーションを同時に行うことが望ましく、それによりエージェントのすべてに対して共通である共通ネゴシエーションポジションに達することができる。それを、上述したアルゴリズムの変形形式を使用して実現することができるということが理解されよう。
【０３５２】
ネゴシエーションプロセスを使用して、ネゴシエーションポジションとして好ましい通信順序指示を含めることにより順序付けを制御してもよい、ということが理解されよう。
【０３５３】
さらに、ネゴシエーションプロセスが順序付けによって影響を受けてもよい。図２０Ｃの例では、たとえば、何らかのコンテキスト依存性が提供されるのを可能にするために、コンポーネント１５５０、１５６０間のポジションを確立する前に、コンポーネント１５５０、１５７０間のネゴシエーションポジションを確立することに対して理由のある場合がある。
【０３５４】
たとえば、コンポーネント１５５０、１５７０間の方がコンテキスト依存性の度合いが高い場合、コンポーネント１５５０、１５６０間より前にこれらのコンポーネント間の通信を実行することが有利であり得る。
【０３５５】
これを実現するために、ネゴシエーションプロセスは、多点接続における互いのコンポーネントと実現することができるコンテキスト依存性の度合いを反映することができ、それによりこの結果に基づいてネゴシエーションを実行することが可能になる。たとえば或るエージェントが第１のグループのすべてのエージェントに同時にメッセージを転送し、次いで第２のグループのすべてのエージェントに同時に第２のメッセージを転送することができるように、調和されたグループを定義することも可能である。これを、取得命令におけるエージェントアドレスをグループ化することにより、又は適当なネゴシエーションを実行することにより実装することができる、ということが理解されよう。
【０３５６】
本実施形態における順序は上位コンポーネントによって確定される。これは、上位コンポーネントが、下位コンポーネントのエージェント間のリンクを確立するためである。各エージェントは、取得時に順序が確立されて上位コンポーネントからリストを受け取る。リンク情報及び故に順序を提供するのは上位コンポーネントの責任である。
【０３５７】
＜コンポーネントサーバの構築＞
概して、各コンポーネントは、上述したように、適当な処理システムによってホストされる実行可能ソフトウェアから形成されるコンポーネントサーバを利用して実装される。コンポーネントサーバの目的は、コンポーネントインスタンスが、通常コードフラグメントの生成を含むことができる所望のデータ処理サービスを実行するのを可能にすることである。
【０３５８】
各コンポーネントサーバ自体が実行可能コードから少なくとも部分的に形成されるため、それを、適当な仕様を利用して生成することができ、それは、構築される時、コンポーネントに対し必要なデータ処理動作のうちのいくつか又はすべてを実装するために必要なコードを作成する。コンポーネントサーバの構築により、コンポーネントが、自動で、又はオペレータに対して適当なＧＵＩを提示することによって手動で実装されるようにすることができ、この構築には、必要な機能のうちの少なくともいくつかを実行するために１つ又は複数の下位コンポーネントを使用することが含まれてもよい。
【０３５９】
概して、サーバの構築には、ここで説明するように２つの異なるタイプの実施態様が含まれてもよいが、実際には、説明から明らかとなるように、概して２つの技法が関連して提供される。
【０３６０】
第１の実装では、コンポーネントサーバは、コンポーネントインスタンスが実行される度に、適当な仕様を構築することによって動作することができる。したがって、この場合、コンポーネントサーバは、適当な仕様がロードされ構築されるようにする実行可能プログラムの形式となる。これにより、コンポーネントサーバは使用単位で下位コンポーネントを選択し実装することが可能になり、そのため上位コンポーネントが実装される度に上位コンポーネントのコンテキストに適した下位コンポーネントの適当な選択が実装される。
【０３６１】
これは、コンポーネントに対してかなりの程度の柔軟性を提供する。それは、これにより、コンテキスト及び他の要素に応じて異なる仕様及びコンポーネントを使用することが可能になるためである。この柔軟性を、上述したように適当なセレクタエージェント及び非コード生成処理コンポーネントを使用することによって仕様に組み込むことができる。このため、サーバは、単に仕様を解釈して各上位コンポーネントを実装する。しかしながら、この技術の欠点は、多くの処理が下請けに出され、それによりコンポーネントを実装するコストが増大するだけでなく、同様に時間もかかることになる。
【０３６２】
これに対する代替形態として、コンポーネントサーバを、所望の処理をネイティブに提供することができる実行可能プログラムから形成することができ、それにより必要な柔軟性が実現される。したがって、こうしたコンポーネントサーバは、必要な機能を具体化する実行可能コードを作成することができる仕様を構築することによって作成される。これにより、仕様を１回構築し、その後コンポーネントがビルドプロセスで使用される度に結果としてのコードを実行することにより、コンポーネントサーバを作成することができる。これにより、非コード生成下位コンポーネントを複数回繰り返して取得する必要が低減する。
【０３６３】
しかしながら、所望の範囲の機能を提供するために、通常、サーバは、種々の実装選択肢を実行可能コード内に組み込む必要がある。これを、たとえば、上述したようにコンポーネントがコンテキスト依存コードフラグメント等を送ることができるようにするために使用することができる。
【０３６４】
後により詳細に説明するように、実際には、２つの手法の組み合わせが使用され、サーバの大部分は実行可能コードとして実装され、下位コンポーネントは必要に応じて実装される。しかしながら、明確にするために、図２１Ａ〜図２１Ｃに関して示す以下の例では、サーバが、仕様を実装される度に構築することにより、又は後に必要に応じて多数回実行することができるコードを、１回の構築プロセスで構築することにより形成される、限られた場合に焦点を合わせる。
【０３６５】
この例では、目的は、実装される時に２つの数字を加算する命令を生成するコンポーネントを提供するコンポーネントサーバを構築することである。したがって、サーバによって実装される最終的なコンポーネントの表現を図２１Ａに示す。図示するように、仕様は、ネゴシエーション入力１３０１及びコードエージェント１３０２を有する加算コンポーネント１３００を含む。
【０３６６】
加算コンポーネントは、ビルドで使用される時、１つ又は複数の他のエージェントによって実行されたネゴシエーションの結果に応じてコードエージェント１３０２を介して異なる加算命令を提供するようになっている。
【０３６７】
これが、コンポーネントが実装される度に実装される下位コンポーネントによって実装される場合、コンポーネントサーバを図２１Ｂに示す仕様によって表すことができる。
【０３６８】
加算コンポーネント１３００は、ネゴシエーションエージェント１３０１に結合されるネゴシエーションエージェント１３１１と、結果エージェント１３１３とを有するネゴシエーション下位コンポーネント１３１０を含む複数の下位コンポーネントを含む。結果エージェント１３１３は、セレクタエージェント１３０３に結合され、セレクタエージェント１３０３は、必要に応じて構築される３つの加算命令下位コンポーネント１３３０、１３４０、１３５０のうちの１つに選択的に結合される。
【０３６９】
使用の際、加算コンポーネントが取得される時、図２１Ｂに示す仕様が実装され、ｎｅｇｏｔｉａｔｉｏｎコンポーネント１３１０が、ネゴシエーションを実行し、そのネゴシエーションの結果に基づいて加算命令コンポーネント１３３０、１３４０、１３５０のうちの対応する１つを選択することが可能になる。この例では、セレクタエージェントは加算命令コンポーネント１３３０を選択し、加算命令コンポーネント１３３０は、エージェント１３３１を介して受け取られるネゴシエーションの結果に基づいて加算命令を生成し、エージェント１３３２を介してコードエージェント１３０２にコードフラグメントを転送する。
【０３７０】
このことから、コードが生成されることになる度に、ｎｅｇｏｔｉａｔｉｏｎコンポーネント１３１０を使用して適当なネゴシエーションポジションが選択され出力が提供されることが明らかとなろう。したがって、これは、結果を生成する処理コンポーネントであり、結果は、その後、適当な加算命令を生成する３つの加算命令コンポーネント１３３０、１３４０、１３５０のうちの選択された１つを取得するために使用される。このため、この例では、下位コンポーネント１３３０、１３４０、１３５０は、コード生成コンポーネントである。
【０３７１】
これとは対照的に、加算コンポーネントサーバが完全に実行可能コードとして実装される場合、使用される仕様の一例は図２１Ｃに示すものと同様であり得る。
【０３７２】
この例では、加算コンポーネントを表す仕様１４００は、内部リストエージェント１４０１に結合するリスト入力１４１１を有するアルゴリズムコンポーネント１４１０を含む。アルゴリズムコンポーネントは、入力エージェント１４５１を介してコンポーネント１４５０に結合されるコード出力１４１２を含む。３つの加算命令コンポーネント１４２０、１４３０、１４４０は、入力エージェント１４５１に結合される出力エージェント１４２２、１４３２、１４４２を有する。コンポーネント１４５０は、ビルドコンポーネント１４６０の入力エージェント１４６１に結合される出力エージェント１４５２を含み、ビルドコンポーネント１４６０は、内部出力エージェント１４０２に結合される出力１４６２を含む。２つのエージェントコンポーネント１４７０、１４８０及びサーバコードコンポーネント１４９０は、図示するようにビルドコンポーネント１４６０の入力エージェント１４６３に結合されるそれぞれの出力エージェント１４７２、１４８２、１４９２を有する。
【０３７３】
使用の際、仕様が構築されると、一連の取得命令又はメッセージが生成され、それぞれのコンポーネント１４００、１４１０、１４２０、１４３０、１４４０、１４５０、１４６０、１４７０、１４８０及び１４９０を実装するエンティティステーションに転送される。取得命令は、各コンポーネントが接続すべきエージェントのアドレスを含む。したがって、エンティティステーション５の各々は、適当なコードを実行し、必要な機能を提供するように動作するコンポーネントサーバを生成する。
【０３７４】
コンポーネントサーバは、他のコンポーネントサーバによって生成された対応するエージェントとの通信を確立するためにメッセージを生成する、適当なエージェントを含む。上述したものと同様であり、明確にするために説明しないネゴシエーションのプロセスが、コンポーネント１４１０、…１４９０の間で実行され、それによりコンポーネント１４１０、…１４９０はコンテキストを確定することができる。
【０３７５】
アルゴリズムコンポーネント１４１０は、内部リストエージェント１４０１からリストエージェント１４１１を介してネゴシエーションポジションを表すリストを受け取るように動作する。ネゴシエーションリストは、加算終了コンポーネント１４００によって提供されるネゴシエーションポジションを表す。そして、ｎｅｇｏｔｉａｔｅコンポーネント１４１０は、コードエージェント１４１２を介してコンポーネント１４５０に提供されるコードフラグメントを生成する。コードフラグメントは、実行される時、上述したネゴシエートアルゴリズムを実装し、それによりネゴシエーションはリスト単位で実行されることが可能になる。
【０３７６】
加算命令コンポーネント１４２０、１４３０、１４４０は、加算命令を生成し、これらをコンポーネント１４５０に転送するように動作する。コンポーネント１４５０は、コードフラグメントを生成し、これは、他のコンポーネントの各々によって出力されるバイナリコードと結合され実行される時、加算コンポーネント１３００がネゴシエーションの結果に基づいて加算命令のうちの適当な１つを選択することができるようにする。したがって、これを、ｉｆタイプステートメントを実装するバイナリ命令と類似するものとみなしてもよいが、命令として実装してもよい。
【０３７７】
さらに、エージェントコンポーネント１４７０、１４８０は、実行される時、エージェント機能を実装するコードを生成するように動作する。この場合、各エージェントコンポーネント１４７０は、エージェントが有するべき特性に応じて各エージェントに対して一意のコードを生成する。これは、ネゴシエーションプロセス中にエージェントコンポーネントに対しそれらのコンテキストを確定させることによって実現されることが理解されよう。このため、たとえば、エージェントコンポーネント１４７０は、ビルドコンポーネントとネゴシエートすることによりネゴシエーションエージェントに対するエージェント機能を提供することを確定し、その単位でカスタムコードフラグメントを生成してもよい。
【０３７８】
同様に、サーバコードコンポーネント１４９０は、コンポーネントサーバを構築するために必要なコードを完了するために必要な他の任意のコードフラグメントを生成する。
【０３７９】
エージェント及びサーバコードフラグメントがビルドコンポーネント１４６０に提供され、ビルドコンポーネント１４６０は、コードフラグメントを結合するように動作し、結果としてのコードを内部エージェント１４０２に提供する。完全な実行可能サーバを形成する、結果としてのコードが購入者に入手可能となり、それにより、それらは、実行されたネゴシエーションの結果に基づいて加算命令を生成するように動作する加算コンポーネントサーバを実行することができる。
【０３８０】
上記例は、通常さらに多くのコンポーネントが使用されるという点でサーバ構築のプロセスを非常に簡略化したものを表す。このため、たとえば、サーバコードコンポーネント１４９０は、例示の目的としては有用であるが、実際は通常、加算コンポーネント１３００に対してコンポーネントサーバを実装するために使用されるコードを構築する目的で特に選択されたコンポーネントのうちの多くから構成される。このため、コンポーネント１４９０は、理論的には基本サーバコードフラグメントを生成する単一コンポーネントであり得るが、選択されたコンポーネントの適当な組み合わせを使用することによってカスタムコードフラグメントが生成される場合、通常は生成されるコードのはるかに優れた効率及び最適化がもたらされる。
【０３８１】
同様に、コンポーネント１４１０、…１４９０の各々はまた、通常、適当な配置の複数のコンポーネントとなり、したがって、仕様は、通常、何百ものコンポーネントを含む可能性がある。それは図２１Ｂの上記例にも当てはまる可能性があり、それは、例に示すコンポーネントの各々は複数のコンポーネントを表してもよく、又は下位コンポーネントを実装することによって形成されてもよいためである、ということが留意されよう。
【０３８２】
いずれの場合も、図２１Ｃに示す第２の例では、コンポーネントの各々は１回取得され、結果は、ネゴシエーションポジションのリストを受け取り、ネゴシエーションを完了するための応答を提供し、その後適当な加算命令を出力することができる、実行可能コードである。したがって、これは、図２１Ａにおいて実行可能コードとして完全に示す加算コンポーネント１３００によって必要とされる機能を実装する。
【０３８３】
上記例において留意すべき点は、第２の例はコード生成コンポーネントしか使用しないが、これは、単に明確にするため、且つコンポーネントを提供するために使用することができる手法の相違を強調するためのものである、ということである。実際には、仕様は、或る範囲の処理コンポーネントとコード生成コンポーネントとを両方含むことができる。このため、たとえば、図２１Ｃの第２の例におけるネゴシエーションを、仕様にｎｅｇｏｔｉａｔｅコンポーネントを設けることによって実装することができ、それによりコードを生成するために使用されるコンポーネント間のネゴシエーションが可能になる。これらｎｅｇｏｔｉａｔｉｏｎコンポーネントは、処理コンポーネントであってもよいが、サーバビルド中に１度実装されるだけであり、サーバが実行される度に実装されるものではない。
【０３８４】
いずれの場合も、上記例は極度に単純化したものであり、通常は、エンドコンポーネントサーバによって提供される必要のある、異なる加算命令の範囲は、はるかに広い必要のある可能性があり、したがって、コンポーネントサーバを作成するために必要な仕様に対し著しく高い複雑性が必要となる。
【０３８５】
上記例では、結果としてのコンポーネントサーバは、決定プロセスを使用して或る範囲の加算命令を生成する。実際には、仕様内で実装される必要のある決定の数ははるかに多くなり、通常の場合のように決定が互いに依存する場合、これは、内部仕様内でディシジョンツリー構造を形成することができる。
【０３８６】
この場合、ディシジョンツリーの各ブランチは、仕様で具体化されるコンポーネントサーバによって生成される結果としてのコードフラグメントにおける変化を表す。各ブランチは、それぞれのコンポーネントのシーケンスから形成され、それらは、実装される時にコードフラグメントを生成し、コードフラグメントは、結果としてのサーバ実行可能コードの一部として実行される時に、サーバが一定の機能を提供することができるようにする。
【０３８７】
したがって、これにより、サーバが、或る範囲の異なるコードフラグメントを生成すること等、或る範囲の異なる機能を実装することを可能にするメカニズムが提供され、これにより、サーバは、コンテキスト依存性、選択肢（後により詳細に説明する）等を提供することができる。
【０３８８】
これのさらなる効果は、仕様内に追加のコンポーネントシーケンスの形態でさらなるブランチを追加することにより、サーバの複雑性を増大させることができる、ということである。これにより、コンポーネント供給者は、サーバを構築するために最初は比較的単純な仕様を使用することができるが、結果としてのコンポーネントは、限られた機能か又はほんのわずかなコンテキストを操作する能力しか具体化しない。
【０３８９】
しかしながら、エンティティは、サーバ仕様の複雑性を追加するに従い、たとえば、コンポーネントが提供している機能に関する追加の知識を取得するに従い、コンポーネントのさらなるシーケンスを追加し、ディシジョンツリーにブランチを有効に追加することにより、最初の仕様を変更することができる。これにより、コンポーネントサーバを増分的に展開することができ、それにより、実現することができる専門化の程度が促進され、そのためそれは、使用される時にコンポーネントによって生成されるコードフラグメントのさらなる最適化に役立つ。
【０３９０】
また上述したように、サーバ実装は、通常、サーバが実行される度にサーバ仕様の一部が構築されるようにすることにより、且つ図２１Ｃに関して説明したように生成された実行可能コードから他の部分が形成されるようにすることにより、図２１Ｂ、図２１Ｃに示す手法の組み合わせを使用する。これを使用して、サーバが実装される度に、又は必要な環境にある時にのみ、内部仕様を構築し、又はさらには下位コンポーネントを個々に実装することにより、サーバ機能の一部を実現され得るようにすることができる。
【０３９１】
これにより、エンドサーバが実装することができず、且つカスタム仕様が構築される必要のある選択肢、ネゴシエーションポジション又は他のコンテキストが定義される場合、カスタム機能を提供し得るようにすることができる。また、これを使用して、下位コンポーネントがいかに実装されるかを知る必要なく、下位コンポーネントの機能をサーバに組み込むことが可能になる。
【０３９２】
このため、上記加算コンポーネントの場合、加算コンポーネントサーバを生成する加算コンポーネント供給者は、加算フラグメントを生成することができる実行可能コードを限られたコンテキストでしか作成することができないことに気付く場合がある。この場合、第３者の専門家である１人又は複数の供給者に対し、適当な下位コンポーネントを使用することによって１つ又は複数の専門化した下位コンポーネントを送るように依頼してもよく、それら下位コンポーネントは、適当に結合されると、専門化したコンテキストでの加算命令ソリューションを提供するのに役立つ。
【０３９３】
これを実現するために、加算コンポーネント供給者は、結果としてのサーバコードが実行される時に、コードが、コンテキストが専門化したコンテキストであるか判断するように動作するように、サーバの仕様を設計する。この場合、サーバコードは、取得命令又は他の適当なメッセージを生成し、これを使用して専門化した下位コンポーネントのうちの１つ又は複数の実装を要求する。これは下位コンポーネントをシステムに結合することにより、それらもまたそれらのより低いコンテキストを発見することができるようにする。これにより、加算コンポーネントサーバは、下位コンポーネントを請け負うことによって直接、且つ１つの専門化した下位コンポーネントを別のコンポーネントに対して選択することにより間接的に、下位コンポーネントによって提供される柔軟性を利用することによってその柔軟性を向上させることができるようになる。
【０３９４】
したがって、コンポーネントサーバを具体化する実行可能コードは、下位コンポーネントが必要であるか判断する処理を実行し、必要である場合、取得命令取得命令を生成し、必要に応じて、生成された下位コンポーネントと対話するように動作する。
【０３９５】
この例では、専門化した加算コンポーネントが取得されるか否かは、コンポーネントサーバによってなされる決定であり、したがって、通常、ディシジョンツリーのそれぞれのブランチに対応する。したがって、異なるブランチは異なる下位コンポーネントを含むことができ、それにより、下位コンポーネントは、必要な場合にのみ、たとえばコンテキストに応じて取得されることが確実になる。
【０３９６】
下位コンポーネントを実装することに加えて、同様の技術により、下位コンポーネントの組み合わせが実装されるのを可能にするように内部仕様を使用することも可能になる。この場合、使用される内部仕様を、この場合もまたサーバコードによって実装されるディシジョンツリーに基づいて選択することができる。したがって、これは、サーバコード内の内部ネイティブ処理として上述したセレクタエージェント機能を組み込むことに対応する。
【０３９７】
これを特にコード生成に適用することにより、低レベルのコンポーネントが、コンテキストに応じて、特定のタスクを実行するために極めて効率的な命令を生成するように動作することができ、それにより命令の効率が最適化されることが理解されよう。より高レベルのコンポーネントがこれらの非常に柔軟な専門化した命令を使用し、それらを変更するか又は他の命令と結合することにより、依然として非常に最適化されたコードを送りながら、より広い範囲のコンテキストでより複雑なソリューションを形成する。
【０３９８】
サーバ階層の高い方では、このため、深く統合された効率的なソリューションを可能にするコンポーネントのサプライチェーンの柔軟性及び専門化能力を利用することにより、任意のサイズのサーバを配備することが可能である。
【０３９９】
＜選択肢＞
コンポーネントの柔軟性を向上させるために、コンポーネント供給者は、複数の選択肢がコンポーネントの一部として実装されるのを可能にすることができ、それにより、コンポーネントによって提供される機能の範囲が大幅に増大する。
【０４００】
選択肢は、複数の形態のうちの任意の１つであってもよく、コンポーネント供給者によって事前定義されてもよく又は未定義であってもよい。選択肢により、コンポーネントの購入者は、コンポーネントの動作に関するいくつかの詳細を指定することができるようになる。
【０４０１】
このため、たとえばコンポーネントが入力を含む場合、コンポーネント供給者は、入力が固定長文字列又は不確定長文字列を受け取ることができるようにする等、入力を介して受け取ることができる種々のタイプのデータに関する複数の選択肢を指定することができる。
【０４０２】
これを実現するためには、コンポーネント供給者は、エンドユーザにとって利用可能となる選択肢を提供するために適した方法でそれらのコンポーネントサーバを実装しなければならない。このため、コンポーネントサーバ構築のセクションで上述したように、コンポーネントサーバは、通常、適当なディシジョンツリー構造を使用して実現することができる或る範囲の種々の実装を具体化する必要のある場合がある、ということが理解されよう。
【０４０３】
いずれの場合も、利用可能な選択肢の詳細を、仕様の一部として定義することができる。その結果、ユーザが、選択されたコンポーネントを仕様にロードし、選択されたコンポーネントに関連する利用可能な選択肢を構成しようと試みる場合、これは、選択されたコンポーネントを供給するエンティティに対し、選択肢が定義されるということを通知する。これにより、エンティティは、利用可能な選択肢の詳細を提供し、これらを実装するために適当な構成を行うことができるようになる。
【０４０４】
これは、通常、選択されたコンポーネントに対応するコンポーネントサーバを実行することによって実現される。ユーザが、選択肢が定義されることを示すと、これは、コンポーネントサーバに通知され、それによりユーザに対し利用可能な選択肢を詳述するダイアログボックスが提示される。選択肢が選択されると、コンポーネントサーバは、これらの選択肢に基づいて有効に新たなコンポーネントを作成し、ユーザに対して新たなコンポーネントの仕様を返し、新たなコンポーネントが仕様に提供され得るようにする。コンポーネントに対する変更には、サイズ変更、又はカラーフォーマット、エージェントの増減、名前の変更等があり得る。
【０４０５】
当業者には、ユーザが選択した選択肢が、コンポーネントが実装される方法に影響を与え、したがってそれぞれのコンポーネントによって生成される結果としての実行可能コードフラグメントに影響を与える、ということが理解されよう。
【０４０６】
このことから、コンポーネント選択肢の提供が、追加のネゴシエーションポジションを定義することと或る程度類似することが分かる。しかしながら、この場合、ネゴシエーションをコンポーネント自体によって制御されるようにする代りに、ユーザによって選択肢が設定される。したがって、これにより、ユーザのシステムに対する要件を考慮することができる。
【０４０７】
コンポーネントの購入者によってコンポーネント選択肢が選択される際、階層構成において、コンポーネントは、任意の下位コンポーネントに関連する選択肢を設定することに関与する、ということが理解されよう。
【０４０８】
当業者によって理解されるさらなる特徴は、選択肢がコンポーネント供給者によって定義されないままであり得るということである。この例では、これにより、オペレータが、コンポーネントによって要求される機能を定義することができる。
【０４０９】
そして、この指示を、コンポーネント供給者に転送することができ、それによりコンポーネント供給者は適当な提案された実装に対して構成することができる。これは、通常、購入者に適当な構成を提案する前にコンテキストを確定する部分的発見を実行することにより、構築前の段階で実現される。これは通常、手動の介入を必要とするが、所定のコンテキストに基づいて用意された提案のテーブルにアクセスすることにより、プロセスの一部又はすべてを自動化することができる。
【０４１０】
＜プロトコル更新＞
コンポーネント提供者に対し追加のセキュリティを提供するために、プロトコル更新システムを提供することが可能である。この場合、これによって、コンポーネントによって使用される通信プロトコルが、更新されるべきエージェントメッセージのフォーマット及び取得命令、並びに任意の暗号化等を通信することができるようになる。これを使用して、コンポーネントサーバにおける攻撃、及び個人の提供されたコンポーネントの機能をリバースエンジニアリングしようとする不正な取得命令の利用を防止することにより、セキュリティを提供することができる。
【０４１１】
これを実現するために、コンポーネントサーバを作成するために使用されるコンポーネント仕様は、使用される通信プロトコルを定義するコードフラグメントを生成するプロトコルコンポーネントを含む。
【０４１２】
プロトコル更新を実装する場合、プロトコル及び故にプロトコルコンポーネントが更新される。プロトコルコンポーネントは、システムの許可されたユーザにのみ分配され、それにより許可されたユーザに対し通信が制限される。
【０４１３】
コンポーネント供給者は、更新されたプロトコルコンポーネントを受け取ると、新たなプロトコルコンポーネントを組み込み、且つコンポーネントサーバを再構築することにより、コンポーネントサーバを表す仕様を更新することができる。
【０４１４】
プロトコルが更新される度に仕様を変更することの代替形態として、仕様に使用されるプロトコルコンポーネントは、サーバが構築される度に最新のプロトコルの詳細を取得するためにセキュアサーバに自動的にアクセスすることができる。その結果、コンポーネントサーバが構築されると、セキュリティが、サーバのセキュリティを大幅に低減する実行可能ファイルの一部として埋め込まれ、攻撃及びフォーラムにわたる不正トランザクションへの試みの低減に役立つ。
【０４１５】
別の代替形態は、コンポーネント供給者が２段階仕様を構築するというものであり、その段階のうちの一方の段階はプロトコル解釈のためのコードを提供し、他方の段階は残りのサーバ機能を提供する。この場合、仕様のプロトコル部分のみ再構築される必要があり、結果としての実行可能コードは、単に、サーバプログラムの先のプロトコル解釈コードに上書きされることが理解されよう。このように、動的プロトコルを提供することができる。これにより、プロトコルを、毎日又は毎週等、定期的な間隔で更新することが可能になるとともに、プロトコルに対する更新及び改善が可能になる。
【０４１６】
更新が受け取られなかった場合にコンポーネントが正確に機能するのを可能にするために、２つのプロトコルが同時に実行しているオーバラップした期間を提供してもよく、これにより、プロトコル更新がビルドの途中で発生した場合にいかなる係属中のジョブも完了することが可能となる。
【０４１７】
＜コンテキスト＞
上述したように、コンポーネントのコンテキストは、コンポーネントを使用してその特定の機能を実行することができる方法を制御するために使用される。したがって、これは、コンテキストが異なる毎に異なる命令を表す異なるバイナリコードを生成することに対応することができる。別の方法として、それは、コンポーネントを実装している時に異なる内部仕様をロードすることを構成してもよい。
【０４１８】
いずれの場合も、コンポーネントは適当なエージェントを介してその対の片方と通信し、これにより、コンポーネントは、その実装をサポートするために必要な情報を発見することができるようになる。このコンテキストは、たとえば以下を含む或る範囲の異なる要素及び態様を含むことができる。
・仕様における供給者自身のコンポーネントの２つ以上の存在、それは、このタイプのいくつかの又はすべてのコンポーネントの結果としてのコードフラグメントに影響を与える可能性がある
・仕様における他のコンポーネントの存在又は不在
・特定のコンテキストに対する特定の要求
・他のコンポーネントとの合意
・コンポーネントに対して定義された選択肢
・資源の場所及び可用性
・実行ファイルが実行されることになるターゲット環境
【０４１９】
当業者は、多数の変形及び変更が明らかとなることを理解するであろう。当業者に明らかとなるこうした変形及び変更のすべてを説明していないが、それらは本発明の特許請求の範囲内にあるようにみなされるべきである。
【０４２０】
付録Ａ
ここで、上述した概念を利用する２つの特定の実施例についてより詳細に説明する。
【０４２１】
＜第１の特定の実施例＞
ここで、図１４Ａ、図１４Ｂ及び図１４Ｃを参照して、カウントダウンカウンタを実装することができるようにする多段階トランザクションの使用の一例について説明する。
【０４２２】
図１４Ａは、図示するように４つのエージェント１２０１、１２０２、１２０３、１２０４を有する多段階コンポーネント１２００を示す。この場合、エージェント１２０２は多段階セレクタエージェントである。
【０４２３】
実装される時、コンポーネント１２００は、５つの下位コンポーネント１２１０、１２２０、１２３０、１２４０、１２４５を有する内部仕様を含み、それらは各々、図示するように相互接続するそれぞれのエージェント１２１１、１２１２、１２１３、１２１４；１２２１、１２２２、１２２３、１２２４；１２３１、１２３２、１２３３、１２３４；１２４１、１２４２、１２４３、１２４４；１２４６を含む。最初、内部仕様は未確定であり、したがって、これを点線で示す。
【０４２４】
これに加えて、２つの外部コンポーネント１２５０及び１２６０が設けられる。コンポーネント１２５０、１２６０はメモリコンポーネントであり、それらの例については上述した。コンポーネント１２５０、１２６０は、それぞれのエージェント１２５１、１２５２、１２５３；１２６１、１２６２、１２６３を有する。他のコンポーネント又はルートサーバに設けられてもよい外部エージェント１２５４、１２６４に結合されたエージェント１２５３、１２６３は、単に、それぞれのメモリコンポーネントを或る値で初期化するための値を供給するために必要とされる。
【０４２５】
エージェント１２１２を介して値、この場合は「１」をコンポーネント１２１０に提供するために、コンポーネント１２００の内部エージェント１２０５も設けられる。
【０４２６】
エージェント１２３２を介して値、この場合は「１」をコンポーネント１２３０に提供するために、コンポーネント１２００の内部エージェント１２０６も設けられる。
【０４２７】
この例では、操作は文字列に対して実行され、コンポーネントの機能は以下の通りである。
・コンポーネント１２１０−文字列から値を減算する
・コンポーネント１２２０−受け取った文字列を複製する
・コンポーネント１２３０−文字列を値と比較する
・コンポーネント１２４０−論理ＡＮＤ
・コンポーネント１２４５−終了コンポーネント
・コンポーネント１２５０−メモリコンポーネント
・コンポーネント１２６０−メモリコンポーネント
【０４２８】
詳細には、図１４Ａに示すように、コンポーネント１２００は、メモリコンポーネント１２５０を介してエージェント１２５４から文字列＄を受け取る。同様に、エージェント１２０２は、メモリコンポーネント１２６０を介してエージェント１２６４からｔｒｕｅ値を受け取る。
【０４２９】
セレクタエージェント１２０２は、受け取ったｔｒｕｅ値に従って図１４Ｂに示す内部仕様の生成をトリガする。エージェント１２０１、１２０３、１２０４は、図示するように一時的な単一段階トランザクションエージェント１２０１Ｂ、１２０２Ｂ、１２０３Ｂ、１２０４Ｂを生成するように動作する。特に、これらのエージェントは、エージェント１２１１、１２２３、１２３４にそれぞれ結合され、１２０２Ｂはこの例では未接続のままである。
【０４３０】
値＄は、エージェント１２０５によって提供される値を減算するように作用するコンポーネント１２１０に提供され、それによりエージェント１２１４において値＄−１が提示される。送信が完了したことが確認されると（これは、コンポーネント１２２０から確認応答メッセージを受け取り、値＄−１の受け取りを確認することによって確定される）、コンポーネント１２１０は、論理ＡＮＤコンポーネント１２４０に転送される通知を生成する。コンポーネント１２２０は、コンポーネント１２１０から出力を受け取り、これを複製して、エージェント１２２３及び１２２４において文字列＄−１を提供するように動作する。これらの値が、それぞれの肯定応答メッセージで示されるようにエージェント１２０３Ｂ（を介して１２５２）、（１２２０）、１２３１によって正しく受け取られると、複製コンポーネント１２２０はＡＮＤコンポーネント１２４０に対して通知メッセージを転送する。
【０４３１】
コンポーネント１２３０は、受け取った入力＄−１の値を所定の閾値と比較するように動作する。所定の閾値は、この場合、内部エージェント１２０６からエージェント１２３２を介して受け取られた値「１」である。
【０４３２】
したがって、この場合、コンポーネント１２３０は、「以上（greater than equal to）」コンポーネントであり、そのため値＄−１が、この場合は値「１」であるエージェント１２３２から受け取られた値以上である場合、コンポーネント１２３０はエージェント１２３４において「ＴＲＵＥ」出力を生成する。そうでない場合、「ＦＡＬＳＥ」値が生成される。
【０４３３】
この場合、比較がうまくいったとすると、図示するようにエージェント１２３４を介してＴＲＵＥ値が出力される。そして、このＴＲＵＥ値はエージェント１２０４Ｂ、１２０４を介してエージェント１２６２に提供され、ＴＲＵＥ値がエージェント１２６２によって受け取られたことが確認されると、比較コンポーネント１２３０はＡＮＤコンポーネント１２４０に通知を転送する。
【０４３４】
ＡＮＤコンポーネント１２４０は、コンポーネント１２１０、１２２０、１２３０の各々から通知を受け取ると、終了コンポーネント１２４５に転送されるメッセージを生成する。これは、通知メッセージ又は他の任意のメッセージの形態であってもよい。いずれの場合も、メッセージにより終了コンポーネント１２４５は内部仕様を終了し、それによりコンポーネント１２１０、１２２０、１２３０、１２４０、１２４５及びエージェント１２０１Ｂ、１２０２Ｂ、１２０３Ｂ、１２０４Ｂを終了させる。これは、それぞれのコンポーネントインスタンスを実装するコンポーネントサーバに対して終了注文を転送することによって実現される。
【０４３５】
メモリコンポーネント１２５０、１２６０は、値＄−１及びＴＲＵＥを格納し、内部仕様が完全に終了しエージェント１２０１、１２０２がブロック解除されると、これらをエージェント１２０１、１２０２に転送する。このプロセスは、コンポーネント１２３０に提供される入力が閾値より低くなるまで繰り返される。この時点で、コンポーネント１２３０は、エージェント１２３４を介してＦＡＬＳＥ出力を生成するようになされる。ＦＡＬＳＥ出力は、メモリコンポーネント１２６０を介して、エージェント１２０４を介して入力セレクタエージェント１２０２に返される。
【０４３６】
一例では、セレクタエージェント１２０２は、構築する代替内部仕様を選択するためにＦＡＬＳＥ値に応答するようになっている。したがって、これは、通常、ループが正しく終了したという出力指示を提供するために使用される。したがって、これを使用して、当業者には理解されるように、コンポーネント１２００又は他のコンポーネントによる後続する動作をトリガすることができる。
【０４３７】
いずれの場合も、上述したことから、コンポーネント１２００が基本的なカウントダウン機能を提供することが理解されよう。
【０４３８】
＜第２の特定の実施例＞
ここで、上述した機能を組み込んだ仕様の特定の一例についてより詳細に説明する。
【０４３９】
特に、図１５Ａは、ｔａｌｋエージェント、ｌｉｓｔエージェント、ｔｙｐｅエージェント、ｖａｌｕｅエージェント及びＩＤエージェントを有するｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネントを示す。使用の際、ｎｕｍｂｅｒ ｓｏｕｒｃｅは、同様にそれぞれのｔａｌｋエージェント、ｌｉｓｔエージェント、ｔｙｐｅエージェント、ｖａｌｕｅエージェント及びＩＤエージェントを含む、図１５Ｃに示すｎｕｍｂｅｒ ｓｉｎｋと通信するようになっている。
【０４４０】
使用の際、ｎｕｍｂｅｒ ｓｉｎｋコンポーネント及びｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネントは、２つのコンポーネント間の唯一の通信手段を表すｔａｌｋエージェントを介して通信するようになっている。ｔａｌｋエージェントは、複数のバンドルされたエージェントを表すトークバンドルを転送し、それによりｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントは共通の数字移送フォーマットを確定するように動作し、それによってｓｏｕｒｃｅコンポーネント及びｓｉｎｋコンポーネントは、それらの間で情報が転送される時に互換性を確実にするコードをそれぞれ設計することができる。たとえば、両者がレジスタの数字を移送するように同意する場合、ｎｕｍｂｅｒ ｓｏｕｒｃｅは、確実にそれが合意されたレジスタに配置されるようにし、ｎｕｍｂｅｒ ｓｉｎｋは、合意されたレジスタから値を取り出すことを承知する。
【０４４１】
この場合、ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントは、確定されたコンテキストに従ってネゴシエーションを実行するようになっており、このコンテキストは、この場合、ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントにそれぞれのＩＤエージェントを介して供給されるそれぞれのＩＤ値に基づく。ビルドプロセスの開始中に割り当てられるＩＤ値によって場所が示されるため、これを使用して、階層において互いに隣接するｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントがコードを送るか否かを判断することができる。
【０４４２】
ここで、これが実現される方法を、それぞれ図１５Ｂ及び図１５Ｄにより詳細に示すｓｏｕｒｃｅコンポーネント及びｓｉｎｋコンポーネントの内部仕様を参照して説明する。
【０４４３】
特に、コンポーネントの内部仕様は以下の下位コンポーネントを利用する。
・Ｎｅｇｏｔｉａｔｅコンポーネント−上述したように、これはネゴシエーションサービスを提供する
・ＬＵＴ−これは、入力エージェントＩ、テーブルエージェントＴ及び出力エージェントＯ並びに任意にエラーを示すエラーエージェントＥを含む４つのエージェントを利用する。使用の際、エージェントＩを介して受け取られた入力は、テーブルエージェントＴを介してルックアップテーブルにアクセスするために使用され、出力の指示は出力エージェントＯを介して提供される
・Ｗａｔｃｈ−上述したｗａｔｃｈコンポーネントは、診断の目的で監視機能を提供するためにトラフィックをスヌープすることができる
・Ｂｕｎ３−Ｂｕｎ３は、ＰＣＴ／ＡＵ０３／０１４７４号で示す同時係属出願に記載されているｂｕｎｄｌｅコンポーネントであり、エージェントＢを介してエージェントメッセージのバンドルを受け取り、エージェント１、２、及び３を介してバンドルの一部から形成される別個のメッセージを提供するように動作する
・ＡＤＤ−数学的加算
・ＲＮＤ−数学的四捨五入
・ＥＱ−数学的等号
・ＤＵＰ−複製
【０４４４】
ここで、ｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネント及びｎｕｍｂｅｒ ｓｉｎｋコンポーネントの動作について説明する。
【０４４５】
使用の際、ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントは、ｔａｌｋエージェントを介してトークバンドルを交換することにより通信を確立する。ｂｕｎｄｌｅコンポーネントＢｕｎ３は、以下のようにして受け渡しを実行することができることを確定する。
・ｓｉｎｋコンポーネントのＩＤエージェントがｓｏｕｒｃｅコンポーネントのＥＱコンポーネントのエージェント１に接続されるようにエージェント１受け渡し
・ｓｏｕｒｃｅコンポーネントのＤＵＰコンポーネントの出力がｓｉｎｋコンポーネントのｗａｔｃｈコンポーネントのエージェントＩに接続されるようにエージェント２受け渡し
・各ｎｅｇｏｔｉａｔｉｏｎコンポーネントのＩｎエージェントが相互接続されるようにエージェント３受け渡し
【０４４６】
その結果、それぞれのＩＤエージェントを介してＩＤ値が受け取られると、ｓｏｕｒｃｅ ＩＤ値は、ＡＤＤコンポーネントを使用して１だけ値が増大され、ＲＮＤコンポーネントによって丸められ、その後ＥＱコンポーネントにおいてｓｉｎｋ ＩＤ値と比較される。この場合、割り当てられたＩＤ値が１だけしか違わない場合、これは、ｓｉｎｋエージェント及びｓｏｕｒｃｅエージェントが階層構造において互いに隣接していることを示す。
【０４４７】
この比較の結果は、ＤＵＰコンポーネントによって複製され、図示するようにｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントの各々の第１のＬＵＴに転送され、それにより、各ＬＵＴコンポーネントは、仕様における相対位置を示す値を提供するＬＵＴにテーブルエージェントを介してアクセスする。そして、これは、第２のＬＵＴに転送され、第２のＬＵＴは、この値に従って外部リストエージェントからネゴシエーションリストを取得する。したがって、選択されたリストは、ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントが隣接しているか否かによって決まる。
【０４４８】
そして、ｎｅｇｏｔｉａｔｅコンポーネントはリストを交換し、共通ネゴシエーション選択肢を確定するために上述したようにネゴシエートする。ネゴシエーションの結果はｔｙｐｅエージェントを介して提供され、後に受け渡しが実行されることにより、ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントのｖａｌｕｅエージェントを相互接続することができる。そして、ｓｏｕｒｃｅコンポーネントのｖａｌｕｅエージェントによって受け取られる値を、ｓｉｎｋコンポーネントのｖａｌｕｅｅエージェントを介して別のコンポーネントに供給することができる。
【０４４９】
ここで、図１６Ａ〜図１６Ｅを参照して、ｎｕｍｂｅｒ ｓｉｎｋコンポーネント及びｎｕｍｂｅｒ ｓｏｕｒｃｅコンポーネントの使用例について説明する。この例は、以下の追加のコンポーネントを使用する。
・Ｂｕｉｌｄ ＡＳＭ−これは、Ｃｏｄｅエージェントを介してコードを送りＳｔａｔｅ Ｉｎエージェント及びＳｔａｔｅ Ｏｕｔエージェントを介してプロセッサ及び状態情報を送るための容易なアクセスを可能にすることにより、ビルドシステムとの通信を支援するコンポーネントである。ｂｕｉｌｄ ＡＳＭはまた、ＩＤエージェントを介してビルドシステム内の位置の指示も提供する。
・Ｈｅａｄｅｒ−このコンポーネントは、ｂｕｉｌｄエージェントを介して受け取られるコードにヘッダを添付し、それにより機能コードがＣｏｄｅ Ｏｕｔエージェントを介して出力され得るようにする。
・Ｂｃａｔ−このコンポーネントは、多くのコード生成コンポーネントからの出力をビルドシステム内で連結することができるように、複雑なｂｕｉｌｄエージェントを分割する。
【０４５０】
図１６Ａは、それぞれのｉｎｉｔｉａｌｉｓａｔｉｏｎエージェント、ｔａｌｋエージェント及びｂｕｉｌｄエージェントを有するｅｌｅｍｅｎｔコンポーネントを示す。使用の際、ｅｌｅｍｅｎｔコンポーネントは、幾分かのメモリを確保し、ｉｎｉｔｉａｌｉｓａｔｉｏｎエージェントを介してその確保したロケーションのために初期化値を受け取るようになっている。これを実現するために、ｅｌｅｍｅｎｔコンポーネントは、ｔａｌｋエージェントを介してポジションをネゴシエートすることにより、メモリ値が後続するコンポーネントによって使用され得るようにし、ネゴシエーションの結果に基づいてコード部分を生成する。ｅｌｅｍｅｎｔコンポーネントの内部仕様を図１６Ｂに示す。
【０４５１】
図１６Ｃは、それぞれのｅｘｉｔｃｏｄｅエージェント及びｂｕｉｌｄエージェントを有するｓｙｓｅｘｉｔコンポーネントを示す。使用の際、ｓｙｓｅｘｉｔコンポーネントは、ｅｘｉｔｃｏｄｅエージェントを介してネゴシエートし、オペレーティングシステムに、指定された出口コードでアプリケーションを終了させるコードを生成するようになっている。ｓｙｓｅｘｉｔコンポーネントの内部仕様を図１６Ｄに示す。
【０４５２】
ｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントが、図１６Ｅの仕様に示すように結合されることにより、仕様が、図示するｅｒｒｏｒ ｃｏｄｅエージェントによるエラーコード値の指示に応じて実行可能コードを生成することができるようになる。この実行可能コードにより、オペレーティングシステムは、ｉｎｉｔｉａｌｉｓａｔｉｏｎエージェントを介して受け取られたエラーコード値に基づいてエラーによりプログラムを終了する。
【０４５３】
使用の際、仕様は、コンポーネントインスタンスがコンポーネントｅｌｅｍｅｎｔ、ｓｙｓｅｘｉｔ、Ｂｃａｔ及びｈｅａｄｅｒに対応するように、且つ関連する下位コンポーネントがそれぞれのサーバによって実装されるように構築される。そして、コンポーネントのエージェントは、通信を確立し、その手続きは以下の通りである。
１）ｈｅａｄｅｒコンポーネントによってビルドバンドルが作成され、そこから、内部エージェントコードを介して送られるコードが抽出される
２）ビルドバンドルは、Ｂｃａｔバンドルを介してｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントのｂｕｉｌｄエージェントに伝播される
３）ビルドバンドルは、それぞれのｂｕｉｌｄ ＡＳＭコンポーネントによって使用され、ｂｕｌｄ ＡＳＭコンポーネントは、ＩＤ値を抽出し、これをｓｏｕｒｃｅコンポーネント及びｓｉｎｋコンポーネントの各々に転送する
４）ｓｉｎｋコンポーネント及びｓｏｕｒｃｅコンポーネントは、上述したように動作することにより、それらが仕様において隣接するか否かを判断する
５）ｅｌｅｍｅｎｔコンポーネントにおいて
（ａ）確定されたネゴシエーション選択肢がＤＵＰコンポーネントによって２回複製され３つのＬＵＴコンポーネントに転送される
（ｂ）ＬＵＴコンポーネントは、それぞれのｔａｉｌコードテーブル、ｖａｌｕｅコードテーブル及びｈｅａｄコードテーブルにアクセスし、ｈｅａｄコード及びｔａｉｌコードをＣＡＴコンポーネントに出力し、ｖａｌｕｅコードをｎｕｍｂｅｒ ｓｏｕｒｃｅに出力する
（ｃ）ｎｕｍｂｅｒ ｓｏｕｒｃｅは、任意に、ｖａｌｕｅコードをｓｙｓｅｘｉｔコンポーネントのｎｕｍｂｅｒ ｓｉｎｋに提供する。
（ｄ）ＣＡＴコンポーネントは、ｈｅａｄコードを先頭に追加しｔａｉｌコードを添付することによって、幾分かのメモリを確保し、それを初期化し、ネゴシエーション中の合意としてコピーを送るコードソリューションを形成し、このソリューションをｂｕｉｌｄ ＡＳＭコンポーネントのｃｏｄｅエージェントに提供する
（ｅ）ｂｕｉｌｄ ＡＳＭコンポーネントは、結果としてのコードを、Ｂｃａｔコンポーネントに転送されるビルドバンドルに組み込む
６）ｓｙｓｅｘｉｔコンポーネントにおいて
（ａ）確定されたネゴシエーション選択肢は、ＤＵＰコンポーネントによって複製され２つのＬＵＴコンポーネントに転送される
（ｂ）ＬＵＴコンポーネントは、それぞれのｔａｉｌコードテーブル及びｈｅａｄコードテーブルにアクセスし、ＣＡＴコンポーネントに転送される対応する出力を生成する
（ｃ）ＣＡＴコンポーネントは、ｅｌｅｍｅｎｔコンポーネントのｎｕｍｂｅｒ ｓｏｕｒｃｅから受け取られた合意にｈｅａｄコードを先頭に追加しｔａｉｌコードを添付することによってコードソリューションを構築し、そのソリューションをｂｕｉｌｄ ＡＳＭコンポーネントのｃｏｄｅエージェントに提供する
（ｄ）ｂｕｉｌｄ ＡＳＭコンポーネントは、結果としてのコードを、Ｂｃａｔコンポーネントに転送されるビルドバンドルに組み込む
７）Ｂｃａｔコンポーネントは、ｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントからのコードを連結し、結果をｈｅａｄｅｒコンポーネントに転送する
８）ｈｅａｄｅｒコンポーネントはヘッダを生成し、出力コードを提供する。
【０４５４】
このように、一例では、図１６Ｅに示す仕様は、主にオペレーティングシステムに対しプログラムを終了させるためにトラップコールを行う実行可能コードを作成する。こうしたプログラムは、実際にはほとんど使用されないが、この例の目的で、コード設計におけるネゴシエーションの役割を強調する役割を果たす。
【０４５５】
Ｓｙｓｅｘｉｔコンポーネントは、実行時に２つのパラメータをプロセッサレジスタｅａｘ及びｅｂｘそれぞれに置くコードを設計し、さらにオペレーティングシステムにトラップするコードを設計しなけれならない。このコードを設計することは概ね簡単であるが、ｅｂｘに向けられる第２のパラメータは、別の当事者、この場合はコンポーネントＥｌｅｍｅｎｔとのネゴシエーションの対象となる。
【０４５６】
Ｅｌｅｍｅｎｔコンポーネントは、エージェントｔａｌｋを介し、ＳｙｓｔｅｘｉｔコンポーネントはエージェントｅｘｉｔＣｏｄｅを介して、Ｅｌｅｍｅｎｔコンポーネント及びＳｙｓｅｘｉｔコンポーネントが適当なコードを設計することができるようにこの第２のパラメータをいかに移送すべきかをネゴシエートしなければならない。Ｅｌｅｍｅｎｔコンポーネントは、メモリを確保し、このメモリを初期化し、パラメータを送るようにコードを設計しなければならない。一方、Ｓｙｓｅｘｉｔコンポーネントは、パラメータを受け取り、オペレーティングシステムに対するトラップコールがうまくいくようにそれを適当なレジスタに配置するようにコードを設計しなければならない。
【０４５７】
Ｅｌｅｍｅｎｔコンポーネント及びＳｙｓｅｘｉｔコンポーネントが仕様において互いに隣接して配置されている場合、プロセッサレジスタが移送手段として使用されることが許可される、ということが理解されよう。Ｓｙｓｅｘｉｔの観点からの最良な選択肢は、移送の目的でｅｂｘを利用することであり、それは、これにより、オペレーティングシステムへのトラップコールの要件であるｅｂｘにパラメータを移動させるコードを設計する必要がなくなるためである。このため、Ｓｙｓｅｘｉｔは、Ｅｌｅｍｅｎｔコンポーネントとの任意のネゴシエーションの結果としてｅｂｘでのレジスタ移送を安全にするよう試みることを優先する。
【０４５８】
このため、ｓｙｓｅｘｉｔ仕様は、通常、好ましいネゴシエーション選択肢が第２のメモリロケーションに対するものであるということを反映する。
【０４５９】
しかしながら、コンポーネントが互いに隣接していない場合、中間コンポーネントが第２のメモリレジスタを使用する必要がある場合がある。この場合、したがって、これは、他のコンポーネントによって生成されたコードによって変更される可能性があるため、値を単に第２のレジスタに置くことはネゴシエーションの適当な結果を表さない。
【０４６０】
ここで、生成されたコードの一例について説明する。
【０４６１】
説明を容易にするために、これをアセンブラコードの生成に関して説明するが、マシンコードを含む任意のコードを使用することができるということが理解されよう。さらに、この例では、コードは、Ｌｉｎｕｘ（登録商標）ベースシステムで使用されるようになっており、したがって、システム終了をもたらすためにメモリレジスタｅａｘの値「１」及び割込み値０ｘ８０を配置する必要がある。この例では、コードは、プロセスをエラーコード「４２」で終了させるように設計される。したがって、この場合、ビルドプロセスの開始時にｅｒｒｏｒ ｃｏｄｅエージェントを介して値「４２」が提供される。ｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントが隣接しており、ネゴシエーションが移送レジスタとしてｅｃｘを確定した場合、ｅｌｅｍｅｎｔコンポーネントはｅｃｘに値「４２」を書き込む。この場合、ｅｌｅｍｅｎｔコンポーネントは、以下のコード部分を生成する。
【０４６２】
SECTION .data
Datum dd 42
SECTION .text
Mov ecx,[datum]
【０４６３】
ｓｙｓｅｘｉｔコンポーネントは、ネゴシエーションプロセス中に値ｅｃｘを確定し、したがって以下のコード部分を生成し、これは、必要なｅｘｉｔコマンドを生成する前にレジスタｅｃｘの値をｅｂｘに転送する。
【０４６４】
mov ebx,ecx
mov eax,1
Int 0x80
; end of sys_exit
【０４６５】
これらのコード部分がヘッダとともに連結されることにより以下のコードが提供される。
【０４６６】
BITS 32
GLOBAL _start
SECTION .text
_start:
SECTION .data
datum dd 42
SECTION .text
mov ecx,[datum]
mov ebx,ecx
mov eax,1
int 0x80
; end of sys_exit
【０４６７】
ｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントが隣接している場合、よりよいソリューションは、値ｄａｔｕｍがｅｌｅｍｅｎｔコンポーネントによって生成されたコードによってメモリロケーションｅｂｘに直接書き込まれるように、ｓｙｓｅｘｉｔがｅｂｘを優先することである。このため、ｅｌｅｍｅｎｔコンポーネントによって生成されるコード化部分は以下の通りである。
【０４６８】
SECTION .data
Datum dd 42
SECTION .text
mov ebx,[datum]
【０４６９】
そして、ｓｙｓｅｘｉｔコンポーネントは、以下のように簡略化するコード部分を生成する。
【０４７０】
mov eax,1
int 0x80
; end of sys_exit
【０４７１】
これらのコード部分がヘッダとともに連結されることにより以下のコードが提供される。
【０４７２】
BITS 32
GLOBAL _start
SECTION .text
_start:
SECTION .data
Datum dd 42
SECTION .text
mov ebx,[datum]
mov eax,1
int 0x80
; end of sys_exit
【０４７３】
これを実現するために、ｓｙｓｅｘｉｔコンポーネントによって使用されるネゴシエーションリストの一例を以下に示す。この例では、ネゴシエーションリストはＸＭＬファイルの形式で提供されるが、これは、実装に対して必須ではなく、したがって詳細には説明しない。さらに、これらの例では、符号なし３２ビット値としてのエラーコードの転送に対応し、レジスタの値の提供に限定される、限られた数のネゴシエーション選択肢のみを示す。
【０４７４】
詳細には、ｓｙｓｅｘｉｔコンポーネントが、それがｅｌｅｍｅｎｔコンポーネントに隣接していると判断した場合、選択されるネゴシエーションリストは以下のようになる。
【０４７５】
<option> <value>unsigned_32_actual_eax</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_ebx</value> <weight>9</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_ecx</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_edx</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_edi</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_esi</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_ebp</value> <weight>4</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_mem</value> <weight>3</w eight> <type>compound</type> </option>
<option> <value>unsigned_32_actual_stack</value> <weight> 3</weight> <type>compound</type> </option>
【０４７６】
したがって、これは、レジスタｅｂｘに最高重み付け「９」を割り当てることによりレジスタｅｂｘに値「４２」を提供することを優先する。しかしながら、重み付け「９」は重み付け「４」に置き換えられ、その後、使用されるレジスタに対して選好はなく、したがって、レジスタは、ｅｌｅｍｅｎｔコンポーネントの好ましいネゴシエーションポジションに基づいて選択されるか、または上述したように任意の規則を使用して確定される。
【０４７７】
当業者には理解されるように、コンポーネントが隣接していない場合に、事前に合意されたメモリロケーションに値を書き込むこと等、レジスタの使用に依存しない代替移送メカニズムを提供することが一般的であることが理解されよう。
【０４７８】
いずれの場合も、上記リストの例において、レジスタｅｂｘは他のレジスタより選択される可能性が高く、これは、必要な機能を実装するために必要なコードが少なくなるため、ｓｙｓｅｘｉｔコンポーネントに対して好ましい選択肢である、ということが理解されよう。上記例は、生成される結果としてのコードがいかにネゴシエーションプロセスの結果によって決まるか、またさらに、ネゴシエーションプロセスが仕様によって提供されるコンテキストに依存するということを強調する。したがって、結果としてのコードはコンテキスト依存である。
【０４７９】
上記例では、ｅｂｘに値「４２」を提供するプロセスにより、実際に、他の選択肢よりコードが短くなり、したがってコンテキスト最適化コードが表される。
【０４８０】
さらなる選択肢として、ｅｌｅｍｅｎｔコンポーネント及びｓｙｓｅｘｉｔコンポーネントが隣接していない場合、すべてが等しく使用可能である複数のネゴシエーション選択肢が利用可能である。この場合、プロセスが実行される度に選択される選択肢を変更することにより（これは、たとえば擬似乱数、エージェントＩＤのハッシング等に従って実現することができる）、生成されるコードを、ビルドが実行される度に変更することも可能である。同時係属出願に記載されているようにコンポーネントの機能のリバースエンジニアリングがより困難となるため、これは、それぞれのコンポーネントを提供するエンティティに対してさらなる保護を提供する。
【図１】
2014044748.tif 000005
【図２】
2014044748.tif 000006
【図３】
2014044748.tif 000007
【図４】
2014044748.tif 000008
【図５】
2014044748.tif 000009
【図６Ａ】
2014044748.tif 000010
【図６Ｂ】
2014044748.tif 000011
【図７Ａ】
2014044748.tif 000012
【図７Ｂ】
2014044748.tif 000013
【図７Ｃ】
2014044748.tif 000014
【図７Ｄ】
2014044748.tif 000015
【図８】
2014044748.tif 000016
【図９】
2014044748.tif 000017
【図１０】
2014044748.tif 000018
【図１１Ａ】
2014044748.tif 000019
【図１１Ｂ】
2014044748.tif 000020
【図１２Ａ】
2014044748.tif 000021
【図１２Ｂ】
2014044748.tif 000022
【図１２Ｃ】
2014044748.tif 000023
【図１２Ｄ】
2014044748.tif 000024
【図１３】
2014044748.tif 000025
【図１４Ａ】
2014044748.tif 000026
【図１４Ｂ】
2014044748.tif 000027
【図１４Ｃ】
2014044748.tif 000028
【図１５Ａ】
2014044748.tif 000029
【図１５Ｂ】
2014044748.tif 000030
【図１５Ｃ】
2014044748.tif 000031
【図１５Ｄ】
2014044748.tif 000032
【図１６Ａ】
2014044748.tif 000033
【図１６Ｂ】
2014044748.tif 000034
【図１６Ｃ】
2014044748.tif 000035
【図１６Ｄ】
2014044748.tif 000036
【図１６Ｅ】
2014044748.tif 000037
【図１７Ａ】
2014044748.tif 000038
【図１７Ｂ】
2014044748.tif 000039
【図１７Ｃ】
2014044748.tif 000040
【図１７Ｄ】
2014044748.tif 000041
【図１７Ｅ】
2014044748.tif 000042
【図１８Ａ】
2014044748.tif 000043
【図１８Ｂ】
2014044748.tif 000044
【図１８Ｃ】
2014044748.tif 000045
【図１９Ａ】
2014044748.tif 000046
【図１９Ｂ】
2014044748.tif 000047
【図１９Ｃ】
2014044748.tif 000048
【図１９Ｄ】
2014044748.tif 000049
【図１９Ｅ】
2014044748.tif 000050
【図１９Ｆ】
2014044748.tif 000051
【図２０Ａ】
2014044748.tif 000052
【図２０Ｂ】
2014044748.tif 000053
【図２０Ｃ】
2014044748.tif 000054
【図２１Ａ】
2014044748.tif 000055
【図２１Ｂ】
2014044748.tif 000056
【図２１Ｃ】
2014044748.tif 000057