(57)【特許請求の範囲】
【請求項１】
構成要素サーバを使用してコンピュータによる実行可能なコードを生成する方法であって、該コンピュータによる実行可能なコードはコンピュータで実行可能であり該実行により当該コンピュータがユーザが決定した要件を実行可能であり、各構成要素サーバは各データ処理サービスを自動的に実行して処理されたデータを提供するものであり、当該構成要素サーバのそれぞれは少なくとも一つの入力部と少なくとも一つの出力部とを含み、該方法は複数の処理システムによって実行され、該複数の処理システムは第１の処理システムと、該第１の処理システムに通信ネットワークを介して接続された一つ又は複数のエンティティ処理システムとを有し、該第１の処理システムはプロセッサとメモリと当該メモリに記憶され、当該プロセッサで実行可能なソフトウェアとを有し、各エンティティ処理システムはプロセッサとメモリと当該メモリに格納され、当該プロセッサで実行可能なソフトウェアとを有し、
前記方法は、
ａ）前記第１の処理システムが構成要素の組み合わせを決定することであって、当該構成要素の組み合わせは定義された一連のデータ処理を実行するための相互接続された複数の構成要素サーバを表現するものであり、前記構成要素の組み合わせは、前記ユーザが決定した要件に合致するようにユーザにより定義され、かつ、
前記構成要素の組み合わせは、
ｉ）前記第１の処理システムの前記ソフトウェアが入力装置を介してユーザから受け取った入力コマンドに応答していくつかの前記構成要素の仕様を選択することであって、当該構成要素の仕様は
（１）前記構成要素サーバによって実行される前記データ処理サービスの説明、
（２）前記第１の処理システムの表示装置上に表示するのに適した前記構成要素のグラフィック表現、及び  
（３）前記構成要素の前記入力部と出力部の動作を定義する入出力仕様
の少なくとも一つを含む構成要素の仕様である、該選択すること、
及び、
ii）前記構成要素の仕様を使って、前記第１の処理システムの前記ソフトウェアが前記ユーザから前記入力装置を介して受け取った入力コマンドに応答して選択された構成要素サーバの選択された入力部と他の選択された構成要素サーバの選択された出力部との間の必要な接続を定義して前記構成要素の組み合わせを定義すること、により決定される、構成要素の組み合わせを決定すること、及び、
ｂ）前記第１の処理システムが前記構成要素の組み合わせを実装して前記コンピュータによる実行可能なコードを生成するために、
ｉ）前記第１の処理システムの前記ソフトウェアが前記構成要素の組み合わせに含まれる各構成要素サーバに対する構築要求を生成し、各構築要求が前記構成要素の組み合わせでそれぞれの構成要素サーバについて決定された必要な接続の詳細を含むこと、
ii）前記第１の処理システムが前記通信ネットワークを介して各構築要求をそれぞれのエンティティ処理システムに転送することであって、各エンティティ処理システムは対応する構成要素サーバを実装することで前記構築要求に応答できるようにされており、各構成要素サーバは前記各エンティティ処理システムの前記プロセッサにより実行されるソフトウェアアプリケーションである、転送すること、
iii)各構成要素サーバが、前記それぞれの構築要求に従って前記それぞれのデータ処理サービスを自動的に行うことであって、
(１）前記構成要素サーバの少なくともいくつかは前記それぞれのデータ処理サービスを実行するため、
（イ）前記構成要素サーバが、前記入力部において、前記構築要求に含まれる前記必要な接続の詳細に従って他の構成要素サーバの前記出力部から処理されたデータを受け取ること、
（ロ）前記構成要素サーバが当該エンティティ処理システムの前記メモリに当該処理されたデータを記憶すること、及び
（ハ）前記構成要素サーバが前記処理されたデータを処理することであり、
(i）コードの断片を前記処理されたデータへ追加すること、
(ii）コードの断片を前記処理されたデータ内の第１の位置から第２の位置へ移動すること、
(iii）前記処理されたデータからコードの断片を除去すること、及び、
(iv）前記処理されたデータにおいてコードの断片を変更すること、の少なくとも１つをおこなう、処理すること、
（２）前記構成要素サーバの少なくともいくつかは、
(イ) 当該構成要素サーバが下位構成要素サーバのための一つ又は複数のさらなる構築要求を生成させ、当該一つ又は複数のさらなる構築要求がさらなるエンティティ処理システムに転送され、当該さらなるエンティティ処理システムによって下位構成要素サーバを実装すること、及び
（ロ）前記構成要素サーバが、前記入力部において、前記下位構成要素サーバが前記データ処理サービスを実行した結果として与えられる処理されたデータを受け取ること、
によって前記各データ処理サービスを行うこと、及び
（３）各構成要素サーバが、前記構築要求に含まれる前記必要な接続の詳細に従って、前記処理されたデータを前記第１の処理システムか他の構成要素サーバに提供すること、および
iv)前記第１の処理システムは、前記構成要素サーバが前記一連のデータ処理を実行した結果として提供した前記処理されたデータを受け取り、前記構成要素サーバによって当該処理されたデータに提供された当該コードの断片は前記構成要素の組み合わせに従って結合されると、前記コンピュータによる実行可能なコードである結果バイナリファイルを形成すること、を含むコード生成方法。
【請求項２】
前記コードの断片は命令を含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記第１の処理システムにおいて、
ａ）前記構成要素の組み合わせに含まれる各構成要素サーバに対する前記それぞれの構成要素の仕様を決定することであって、各構成要素の仕様は構成要素サーバを実装するために使用される少なくとも前記エンティティ処理システムの指示を含むこと、
ｂ）前記構成要素の仕様のそれぞれに基づいて、前記構成要素の組み合わせに含まれる各構成要素サーバのための前記それぞれのエンティティ処理システムを決定すること、及び
ｃ）前記構成要素の仕様のそれぞれに従って、前記構成要素の組み合わせに含まれる各構成要素サーバのための構築要求を前記エンティティ処理システムのそれぞれに転送すること、を含む請求項１あるいは請求項２に記載の方法。
【請求項４】
前記複数の処理システムがさらに前記第1の処理システムとは異なる第２の処理システムを含み、当該第２の処理システムは前記通信ネットワークを介して少なくとも前記第１の処理システムに結合されるとともに、プロセッサとメモリと当該メモリに記憶され、当該プロセッサで実行可能なソフトウェアとを有し、
前記方法は、前記第２の処理システムにおいて、
ａ）複数の構成要素サーバの詳細を前記第２の処理システムの前記メモリから取り出すこと、
及び、
ｂ）前記第１の処理システムを介して、前記構成要素の仕様をユーザに提供すること、を含む請求項１乃至請求項３のいずれか一項に記載の方法。
【請求項５】
前記第２の処理システムにおいて、
ａ）前記第１の処理システムの前記入力装置と前記通信ネットワークとを介して前記ユーザから受け取った入力コマンドに応答して、前記構成要素サーバの中から各構成要素サーバを選択し、及び、
ｂ）前記第１の処理システムを介して、前記選択された構成要素の前記仕様を前記ユーザに提供すること、を含む請求項４に記載の方法。
【請求項６】
前記第２の処理システムにおいて、
ａ）前記第１の処理システムを介してユーザに複数の構成要素サーバの分類の指示を提供することであって、該分類は異なる形態のデータ処理サービスを定義すること、
ｂ）前記第１の処理システムの入力装置を介してユーザから受け取った入力コマンドに応答して構成要素サーバの分類を選択することであって、該入力コマンドは通信ネットワークを介して前記第２の処理システムによって受け取られること、及び
ｃ）前記選択された分類内の前記構成要素サーバについての構成要素の仕様を前記第１の処理装置を介して前記ユーザに提供することであって、該提供によって、前記ユーザが前記構成要素サーバの前記データ処理サービスに基づいて構成要素サーバの選択を行なえるようにすること、を含む請求項４又は請求項５に記載の方法。
【請求項７】
前記第１の処理システムにおいて、
ａ）前記一つ又は複数の選択された構成要素の前記構成要素の仕様に含まれる各グラフィック表現を使用して該一つ又は複数の選択された構成要素サーバのグラフィック表現を当該第１の処理システムの表示装置上に表示し、及び、
ｂ）前記入力装置を介してユーザから受け取った入力コマンドに応答して、前記表示装置上の前記グラフィック表現を処理して前記一つ又は複数の選択された構成要素サーバ間の相互接続を少なくとも定義し、それによって前記構成要素の組み合わせを定義すること、を含む請求項４乃至請求項６のいずれか一項に記載の方法。
【請求項８】
前記第２の処理システムにおいて、
ａ）前記メモリから前記構成要素サーバのパフォーマンス情報を取り出し、及び、
ｂ）前記パフォーマンス情報を前記第１の処理システムを介して前記ユーザに提供し、前記ユーザが前記パフォーマンス情報に従って前記構成要素サーバを選択できるようにすること、を含み、
前記パフォーマンス情報は、
i）前記構成要素サーバを実装する前記エンティティ処理システムの指示、
ii）前記エンティティ処理システムの地理的場所の指示、
iii）前記構成要素サーバの実装期間の指示、
iv）前記各構成要素サーバの実装に関連する費用の指示、及び、
v）前記構成要素サーバによる前記各データ処理サービスの実行における出来のよさを示す格付け、
のうちの少なくとも一つを含むことを特徴とする請求項４に記載の方法。
【請求項９】
実質的に同等のデータ処理サービスを行う複数の異なる構成要素サーバを提供し、前記異なる構成要素は異なるパフォーマンス情報を有するように前記異なる構成要素サーバは異なるエンティティ処理システムによって実装されること、
を含む請求項８に記載の方法。
【請求項１０】
前記構成要素の組み合わせにおける前記構成要素サーバの一つがルートサーバであり、
ａ）前記ルートサーバは前記構成要素の組み合わせ内の他の構成要素サーバに対する構築要求を発行し、
ｂ）前記ルートサーバは前記他の構成要素サーバのそれぞれのためのそれぞれのエンティティ処理システムへそれぞれの構築要求を転送し、
ｃ）各構成要素サーバはそれぞれの構築要求に従ってそれぞれのデータ処理サービスを自動的に実行し、
ｄ）前記ルートサーバは前記それぞれの構築要求で要求される接続の詳細に従い、前記構成要素サーバから処理されたデータを受け取り、
ｅ）前記ルートサーバは前記構成要素サーバによって前記処理されたデータ内に提供された前記コードの断片を前記構成要素の組み合わせに従って結合して前記コンピュータによる実行可能なコードを提供する、
ことを特徴とする請求項１に記載の方法。
【請求項１１】
前記ルートサーバは前記第１の処理システムの前記プロセッサにより実行されるソフトウェアアプリケーションであることを特徴とする請求項１０に記載の方法。
【請求項１２】
各コードの断片は前記第１の処理システムの前記メモリのそれぞれ所定のメモリロケーションに提供され、前記所定のメモリロケーションは前記構成要素の組み合わせに従って決定されており、よって前記コードの断片は前記第１の処理システムの前記メモリ内で結合されて前記コンピュータによる実行可能なコードを提供することを特徴とする請求項１１に記載の方法。
【請求項１３】
構成要素サーバを使用してコンピュータによる実行可能なコードを生成する装置であって、該コンピュータによる実行可能なコードはコンピュータで実行可能であり該実行により当該コンピュータがユーザが決定した要件を実行可能であり、各構成要素サーバは各データ処理サービスを自動的に実行して処理されたデータを提供するものであり、当該構成要素サーバのそれぞれは少なくとも一つの入力部と少なくとも一つの出力部とを含み、
複数の処理システムを含む前記装置は、
a)プロセッサとメモリと当該メモリに記憶され、当該プロセッサで実行可能なソフトウェアとを有する第１の処理システムであって、
ｉ）構成要素の組み合わせを決定することであって、定義された一連のデータ処理を実行するための相互接続された複数の構成要素サーバを表現し、前記構成要素の組み合わせは、前記ユーザが決定した要件に合致するようにユーザにより定義され、かつ、前記構成要素の組み合わせは、
（１）前記第１の処理システムの前記ソフトウェアが入力装置を介してユーザから受け取った入力コマンドに応答していくつかの前記構成要素の仕様を選択することであって、当該構成要素の仕様は
（ａ）前記構成要素サーバによって実行される前記データ処理サービスの説明、
（ｂ）前記第１の処理システムの表示装置上に表示するのに適した前記構成要素のグラフィック表現、及び  
（ｃ）前記構成要素の前記入力部と出力部の動作を定義する入出力仕様
の少なくとも一つを含む構成要素の仕様である、該選択すること、
及び、
（２）前記選択された構成要素の仕様を使って、前記第１の処理システムの前記ソフトウェアが前記ユーザから受け取った入力コマンドに応答して選択された構成要素サーバの選択された入力部と選択された構成要素サーバの選択された出力部との間の必要な接続を定義して前記構成要素の組み合わせを定義すること、により定義、決定すること、
ii）前記構成要素の組み合わせを実装して前記コンピュータによる実行可能なコードを生成するために、
（１）前記第１の処理システムの前記ソフトウェアが前記構成要素の組み合わせに含まれる各構成要素サーバに対する構築要求を生成し、各構築要求が前記構成要素の組み合わせでそれぞれの構成要素サーバについて決定された必要な接続の詳細を含むこと、
（２）当該第１の処理システムが前記構築要求を各エンティティ処理システムに転送して各エンティティ処理システムが前記各構成要素に対応する構成要素の組み合わせを実装できるようにすること、
iii)  前記構成要素の組み合わせの前記実装の結果として提供された処理されたデータを受け取り、前記構成要素サーバによって当該処理されたデータに提供された当該コードの断片は前記構成要素の組み合わせに従って結合されると、前記コンピュータによる実行可能なコードである結果バイナリファイルを形成すること、
を行う第１の処理システム、
及び
ｂ）該第１の処理システムに通信ネットワークを介して接続された一つ又は複数のエンティティ処理システムであって、各エンティティ処理システムはプロセッサとメモリと当該メモリに格納され、当該プロセッサで実行可能なソフトウェアとを有し、各エンティティ処理システムは、
ｉ）前記第１の処理システムから前記構築要求を受け取り、
ii）該構築要求に応答して対応する構成要素サーバを実装し、当該構成要素サーバは各エンティティ処理システムの前記プロセッサによって実行されるソフトウェアアプリケーションであり、かつ、前記各構築要求に従って前記各データ処理サービスを自動的に実行するようにされており、
（１）前記構成要素サーバの少なくともいくつかは前記各データ処理サービスを実行するため、
（ａ）前記構成要素サーバが、前記入力部において、前記構築要求に含まれる前記必要な接続の詳細に従って他の構成要素サーバの前記出力部から処理されたデータを受け取ること、
（ｂ）前記構成要素サーバが当該エンティティ処理システムの前記メモリに当該処理されたデータを記憶すること、及び
（ｃ）前記構成要素サーバが前記データを処理することであって、
(i）コードの断片を前記処理されたデータへ追加すること、
(ii）コードの断片を前記処理されたデータ内の第１の位置から第２の位置へ移動すること、
(iii）前記処理されたデータからコードの断片を除去すること、及び、
(iv）前記処理されたデータにおいてコードの断片を変更すること、の少なくとも１つをおこなう、処理すること、によって前記それのデータ処理を実行し、
（２）前記構成要素サーバの少なくともいくつかは、
(ａ)当該構成要素サーバが下位構成要素サーバのための一つ又は複数のさらなる構築要求を生成させ、当該一つ又は複数のさらなる構築要求がさらなるエンティティ処理システムに転送され、当該さらなるエンティティ処理システムによってさらなる下位構成要素サーバを実装すること、によって前記各データ処理サービスを行うこと、及び
（ｂ）前記構成要素サーバが、前記入力部において、前記下位構成要素サーバが前記データ処理サービスを実行した結果として与えられる処理されたデータを受け取ること、
によってそれぞれのデータ処理サービスを実行し、
及び
iii）前記構築要求に含まれる前記必要な接続の詳細に従って、前記処理されたデータを前記第１の処理システムか他の構成要素サーバに提供すること、を行うエンティティ処理システム、とを備える装置。
【請求項１４】
前記第1の処理システムとは異なる第２の処理システムをさらに備え、当該第２の処理システムは前記通信ネットワークを介して少なくとも前記第１の処理システムに結合されるとともに、プロセッサとメモリと当該メモリに記憶され、当該プロセッサで実行可能なソフトウェアとを有し、前記第２の処理システムの前記メモリは使用可能な構成要素サーバの仕様を記憶する、ことを特徴とする請求項１３に記載の装置。
【請求項１５】
前記第２の処理システムは、エンティティ処理システムから構成要素の仕様を得るように成される請求項１４に記載の装置。
【請求項１６】
前記第１の処理システムは、前記第２の処理システムと協働し、
それによってユーザが、
ａ）前記利用可能な構成要素のうちの一つ又は複数を選択し得る、及び、
ｂ）前記構成要素の組み合わせを定義し得る、請求項１４又は請求項１５に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
（発明の背景）
本発明は、コンピュータによって実行可能なコードを生成する方法及び装置に関し、特に、データを処理する各サービスに対応する構成要素を使用して、コンピュータによって実行可能なコードの生成に関する。
【背景技術】
【０００２】
（背景技術の説明）
本明細書におけるいずれの従来技術への参照も、従来技術が通常の一般知識の一環を成すことを認めるものではなく、又は示唆を形成するものでもない。また、そのように解釈されるべきではない。
【０００３】
ソフトウェアが競争の激しい環境で開発されることは明らかであるが、歴史的には、過去３０年にわたって生産性曲線が横ばいであることを克明に示している。どのような向上も、同期間にわたって他産業において達成された向上と比較して微々たるものである。この格差はソフトウェア業界に固有のものであり、ソフトウェアがどのように構築されるかの直接的な結果である。
【０００４】
ほとんどのコンピュータソフトウェアは労力を要する手動プロセスを通して構築され、プログラマによって、各アプリケーションソフトウェアプロジェクトのコードを生成する。各ソフトウェアアプリケーションは一般に、１人又は複数のプログラマによって１件ずつ作成される。そして、コードは、ほとんど又は全く再使用されることはない。
【０００５】
この裏にある理由の一つは、通常、いずれのソフトウェアアプリケーションでも、開発に投資する者（エンティティ）の数は限られている（通常は１企業）ことである。その結果、一般に、投資者はソフトウェアコードの開発に必要以上の投資を望まない。これは、正常に機能するアプリケーションが一旦開発されれば、そのアプリケーションを形成するコードを最適化することに対して金銭及び努力がほとんど投資されないことを意味する。
【０００６】
他の理由としては以下のものが挙げられる。
・最初は、より困難な分散モデルよりも社内開発モデルのほうが好都合であること。このため、限られた資源の一般化が求められる。
・所定の機能を実行する標準ルーチンを確立したライブラリ／リンカの導入。このため、競争及び最適化が低下する。
・ソフトウェア生産の本質そのものについての一般的な見解。それは、プログラマによって課される限界を顧客が許容するように求める。
【０００７】
この結果、プログラマは、広範囲の機能を実行するソフトウェアをプログラム可能なゼネラリストになる必要がある。そして、現状では、市場で競い合うことができる。従って、現在のソフトウェアプログラミング環境には、プログラム全体を適宜コーディングすることができるジェネラリストが存在すれば、たった一つの非常にマイナーなプログラミングタスクだけに精通したプログラマに対する必要性がほとんどないことが理解できる。
【０００８】
この専門化の欠如はソフトウェア作成の分野に複数の問題を引き起こす。例えば、
・バグやミス  −  高レベルのソフトウェア欠陥。
・ソフトウェアの肥大化  −  実行可能コードのサイズの大幅な増大。
・複雑性の限界  −  増し続けるソフトウェアの複雑性が、システムの能力を有効に安定状態に保つことを脅かす。
・低い参入障壁。
・予測不能性  −  開発コスト、スケジュール、パフォーマンス、又は資源使用が予測不能である。
・生産性  −  過去１０年において開発者の生産性の向上はほとんど見られなかった。
【０００９】
バグ及びミスは、大体において、各プログラマが大量のコードを書かなければならないことによって発生する。これには、プログラマがコードを書くことに物理的に費やすことのできる時間量が限られること、及びプログラマが考慮しなければならない変数の数が多くなること等、複数の問題がある。バグは、現在のソフトウェアプログラミング技術における大きな問題である。この結果として、ウィルスに起因する破損等の他の後障害等を修正することのみならず、発生したバグ及びミスを、ソフトウェアパッチの使用又はアップグレードによって修正することにもさらなる時間が費やされてきた。
【００１０】
ソフトウェアの肥大化は、プログラミング分野内の専門化の欠如に関連する別の結果である。いずれのゼネラリストでも同様に、製品の改良は生産性を犠牲にしてなされる。具体的には、プログラマは、正常に機能するプログラムを比較的素早く構築することができるであろう。しかし、動作を改良しながら、コード量を最小限に抑えるようにコードを最適化することには、些細な改良であっても長い時間を必要とすることがある。プログラマの最適化スキルも一般に、個人の知識が多くの分野にまたがっている場合に不完全であり、同様に、コードの書き手は、製品を市場に出すことによって収入を得ている。結果として、現代のソフトウェアの不必要なサイズ及び複雑性を取り扱うためにより強力なマシンが必要になる。
【００１１】
複雑性の限界は、複雑性のレベルが上がるにつれて、１人の人間が特定のソフトウェア開発作業のすべての局面を理解することが不可能になることによって発生する。高度に専門化された大半の業界は大規模で複雑なプロジェクトに対処することができるが、ソフトウェア開発は、いずれの程度の専門化にも達しておらず、実現してもいない。
【００１２】
一般に、いずれの業界も、業界の成熟度に比例した参入障壁を有する。半導体の様な十分に発達した業界は、国でさえ取り組むことをためらう相当な障壁を有する。工業化の特徴は、事業の設立に大量の資本が必要なことである。しかし、手工業等のより原始的な産業の場合、献身的度力と少ない支出で誰でも業界に入ることができ、最適な業務を達成できる。これは、参入障壁が小さいことから、ソフトウェア業界が未発達であることを示す。
【００１３】
ＩＴ業界の複数の小さな特異事項もこの危機の一原因となっている。
・ソフトウェア開発者に対するＩＰ保護が機能不全であること。
・優れた諸技術がある中でｘ８６アーキテクチャの使用を継続していること。
・ソフトウェアエラー又は瑕疵を顧客が許容すること。
・ソフトウェア危機へ対応を試みる実装複雑性が増大すること（コードライブラリからのコードの再使用、古いオペレーティングシステムの不足分との互換を図ることを含む）。
【００１４】
こういった問題の影響はソフトウェア分野内に特有のものである。研究は、「６台の大規模ソフトウェアシステムが新たに稼働する毎に、他の二つのシステムが停止することを示している。実際に、このソフトウェア危機は、稼働している大規模システムの４分の３が動作不良であるほど深刻である。」、これらのシステムは、意図するように機能しないか、又はまったく使用されないことを示す。
【００１５】
５０を越えるトッププログラマ、コンピュータ科学者及び業界指導者からなる委員会がまず、1968 NATO Science Meetingにおいてこの問題に取り組んだ。この委員会には、「ソフトウェア危機」から脱する方法を発見するという課題が与えられた。
【００１６】
諸問題を解決するために複数の以下の試みがなされた。
・プログラマをマシンコードから切り離すことを目指した、第３、第４及び第５世代言語の開発が、初期のいくらかの生産性における成功に貢献した。言語が今日まで、生産性向上を追求するにあたっての核心であり続けているほどに、初期の生産性増大は成功した。
・データを、そのデータの処理に使用されるコードと一緒にカプセル化する新しいタイプの抽象化であるオブジェクト指向プログラミングが、主に制御複雑性を通してある程度の成功を実現した。
・大きなソフトウェアの開発の複雑性の管理を支援することを目指したコンピュータ支援ソフトウェア工学（ＣＡＳＥ）。
・以前の知的努力を再使用しようとする取り組みであるコード再使用。
・数学的証明を利用して正確性を検証するとともに、ソフトウェア開発に伴う多数の欠陥及びバグに鋭く取り組む、形式的方法。
・履歴コードから知的内容を抽出するデコンパイラ。
【００１７】
しかし、これらの構想にもかかわらず、ソフトウェア生産の向上においては、ほとんど進歩がない。
【００１８】
具体的には、業界内ではほとんど専門化がされていないままであり、ソフトウェアアプリケーションの大半は、限られた数のプログラマによって１件ずつ生成されている。従って、第３、第４、第５世代言語、ＯＯＰ、ＣＡＳＥ、形式的方法、デコンパイラのような方法及び数え切れないほどの他の方法は、問題ではなく症状に対処しているにすぎない。
【００１９】
従って、ＮＡＴＯ会議後の３０年間の進歩は、もしあったとしても小さいものに過ぎず、「コンピュータコードの大部分はなお、見積もることもできず、また安定して繰り返すこともできない技術を用いる職人によって生のプログラミング言語から手作業で作成されている。」
【００２０】
コードが再使用される状況では、一般に、コードを任意の動作環境において、また任意の状況において採用できるように、コードをコンテキストから独立させることによって、コードの再使用は実現される。これは相当数の問題に繋がり、具体的には、大半のケースでは冗長的な多数のコマンド及び演算がコードに必要になる。これに加えて、コンテキスト独立コードの形成は、コード生成器が適したＩＰ保護を利用してそれぞれのコードを保護する能力を妨げるか、又は少なくとも実質的に邪魔する。
【００２１】
前述した問題を解決する既存のシステムの一例が、状態ベースのコンピュータプログラムを自動的に生成する方法、装置、及びコンピュータプログラムプロダクトを提供する米国特許第６，４０５，３６１号に記載されている。このシステムは、互いに通信して、シーケンス記述間の対話に基づいてプログラムを生成する複数の構成要素を利用することによって動作する。この例では、すべてのシーケンス記述が決定され、正規化され、構成要素の状態ベースの仕様を決定するために使用される。構成要素の状態ベースのプログラムは、生成されるプログラムに認められる仕様から決定される。
【００２２】
しかし、このシステムは、コンピュータプログラム生成の特定の一つのシナリオにしか対処せず、具体的には、状態ベースのシステムにしか関連しない。さらに、システムは、通信システムを記述する個々の状態図として把握される。そして、これら状態図をコードに変換して動作する。従って、この結果として、システムは図をコードに変換するように動作する。このシステムでは、汎用アプリケーションソフトウェアを開発することができず、コンテキスト独立コードを使用することから、先に概説した問題の多くに繋がる。
【００２３】
欧州特許第１，２１１，５９８号明細書には、高級コードを複数のターゲットプロセッサの一つに対する命令に変換することによって実行可能コードを生成する方法が記載されている。システムは、所望のプログラムの特徴に従って、一つ又は複数の予め定められたプログラムコードモジュールを複数の利用可能なモジュールから選択することによって動作する。次いで、高水準コードを命令に変換するプログラムコードが使用されて、プログラムコードが作られる。
【００２４】
従って、このシステムでは、多種多様なハードウェアプラットフォームに仮想Ｊａｖａ（登録商標。以下同じ。）を生成することが可能である。システムの中核は、利用可能なモジュールを単純に選択するモジュール選択器を使用することにあり、選択されたモジュールは次いで、通常のようにコンパイルされアセンブルされる前に組み合わせられる。
【００２５】
従って、この文献は、コードの部分を選択し、次いでこれらを組み合わせて結果コードを形成する方法に関する。従って、これには、通常のようにまずプログラマがコードを書く必要があり、次いで書かれたコードを共に切り貼りして最終コードを形成するだけである。従って、これは、特定の状況にしか関連性がなく、動作に先立って、適したソースコード部分を形成する必要がある。従って、これはコンテキスト独立コードに頼り、上で概説した欠点の多くを有している。
【００２６】
１９９９年に、クイーンズランド工科大学、ブリスベーン、オーストラリアの情報科学部のClemens Szyperski助教授が、コンピュータソフトウェアの工業化を実現するにあたって有用ないくつかの望ましい特徴を記した書籍「Component Software」を発行した。しかし、ここでは、上で概説した問題を克服する実施可能な解決策はいずれも提案されなかった。
【発明の概要】
【課題を解決するための手段】
【００２７】
（本発明の概要）
第１の広い形態において、本発明は、構成要素を使用してコードを生成する方法を提供し、各構成要素は各データ処理サービスに対応する。本方法は、
ａ）コードを定義する構成要素の組み合わせの決定し、及び、
ｂ）定められたデータ処理シーケンスが実行される構成要素の組み合わせの実装。また、それによってコンピュータによって実行可能なコードの生成すること、を含む。
【００２８】
通常、構成要素の少なくともいくつかは、処理されるデータを受け取り及び／又は出力する一つ又は複数のポートを含む。
【００２９】
各ポートには、構成要素への、及び、構成要素からのデータの転送の制御が可能なエージェントが関連付けられていることが好ましい。
【００３０】
本方法は、
ａ）複数のデータ部分を含むデータを受け取り、
ｂ）データを、
ｉ）データ部分をシーケンスの所定の位置に追加し、
ii）データ部分をシーケンス中の第1の位置から第２の位置に移動し、
iii)シーケンスからデータ部分を除去し、及び、
iv）シーケンスにおいてデータ部分を変更すること、によって処理する、
構成要素を有することを含む。
【００３１】
通常、本方法の少なくとも一部は、記憶装置を備えた処理システムを使用して実行される。本方法は、データ部の一つ又は複数を記憶装置に記憶することを含む。
【００３２】
構成要素のいくつかは、複数の組み合わせられた下位構成要素から形成される。この下位構成要素もまた構成要素であってもよい。
【００３３】
サービスのうちの一つ又は複数は、
ａ）個人によるデータの手動処理、
ｂ）処理システムにより実行され、それによってデータを自動的に処理するようになされたコンピュータにより実行可能なコード、及び、
ｃ）下位構成要素の組み合わせ、のうちの少なくとも一つを使用して行われてもよい。
【００３４】
本方法は、一つ又は複数の処理システムを使用して行われることができる。
【００３５】
この場合、本方法は、第１の処理システムに、
ａ）ユーザから受け取った入力コマンドに応答して、複数の構成要素を選択し、
ｂ）選択された構成要素を使用して構成要素の組み合わせを定義し、及び、
ｃ）定義されたデータ処理シーケンスが行われるように、構成要素の組み合わせを実装させ、ることを含むことが好ましい。
【００３６】
構成要素の少なくともいくつかが一つ又は複数のポートを備える場合、本方法は、処理システムに、
ａ）選択された各構成要素のポートの指示をユーザに提供させ、及び、
ｂ）ユーザからの入力コマンドに応答して、上記ポートの中から選択されたポートを相互接続し、それによって構成要素の組み合わせを定義すること、を含むことが好ましい。
【００３７】
通常、本方法は、第２の処理システムに、
ａ）複数の構成要素の詳細を決定させ、
ｂ）第１の処理システムを介して、少なくとも詳細の指示をユーザに提供させること、を含む。
【００３８】
この場合、本方法は、処理システムに、
ａ）ユーザからの入力コマンドに応答して、上記構成要素の中から各構成要素を選択させ、及び、
ｂ）第１の処理システムを介して、選択された構成要素の詳細をユーザに提供させること、を含むことができる。
【００３９】
詳細は通常、構成要素の仕様の形式であり、処理システムは、
ａ）構成要素の仕様を記憶する記憶装置であって、
構成要素仕様は、
ｉ）処理サービスの指示、
ii）構成要素のグラフィック表現、及び、
iii)各ポートに関連するエージェントの動作を定義するポート仕様
のうちの少なくとも一つを含む記憶装置と、
ｂ）プロセッサであって、本方法は通常、このプロセッサに、
ｉ）記憶装置から一つ又は複数の構成要素仕様を取得させ、及び、
ii）第１の処理システムを介して、構成要素仕様をユーザに提供させることを含むプロセッサと、を含む。
【００４０】
本方法は、第１の処理システムに、
ａ）一つ又は複数の選択された構成要素のグラフィック表現を生成させ、及び、
ｂ）ユーザから受け取った入力コマンドに応答して、グラフィック表現を処理させ、それによって構成要素の組み合わせを定義すること、を含んでもよい。
【００４１】
第１の処理システムは、通信ネットワークを介して一つ又は複数の構成要素処理システムに結合されることができ、
各構成要素処理システムは、一つ又は複数の各構成要素を実装するように成され、
この場合、本方法は、
ａ）構成要素の組み合わせ内の各構成要素に対するサービス要求を生成し、及び、
ｂ）通信ネットワークを介して各エンティティにサービス要求を転送し、各エンティティは、サービス要求に応答して、各構成要素によって具現されるデータ処理を実装するように成されること、を含むことが好ましい。
【００４２】
通常、本方法は、
ａ）構成要素が必要とするあらゆるデータを決定し、及び、
ｂ）このデータをサービス要求の際に提供すること、を含む。
【００４３】
各サービス要求は、各構成要素のポートのそれぞれの相互接続の指示を含んでもよい。
【００４４】
本方法は、各構成要素処理システムに、
ａ）受け取ったサービス要求に従って、一つ又は複数の各構成要素インスタンスを実装させ、及び、
ｂ）各構成要素インスタンスに、
ｉ）サービス要求中に定義された相互接続に従って他の構成要素と対話させ、及び、
ii）必要なあらゆるデータ処理を行わせること、を含むことができる。
【００４５】
本方法は、各構成要素処理システムに、
ａ）各ポートに関連する各エージェントを実装させ、及び、
ｂ）定義された相互接続に従って各エージェントに別の構成要素のエージェントと協働させ、それによってポート間でデータを転送できるようにすること、を含んでもよい。
【００４６】
本方法は、第２の処理システムに、
ａ）パフォーマンス情報を決定させ、当該パフォーマンス情報は、構成要素の実装に関連する一つ又は複数の基準を表すこと、
ｂ）パフォーマンス情報をユーザ対して提供させ、ユーザはこのパフォーマンス情報に従って構成要素を選択すること、を含むことが好ましい。
【００４７】
パフォーマンス情報は通常、
ａ）構成要素を実装するエンティティの指示、
ｂ）エンティティの地理的場所の指示、
ｃ）構成要素の実装期間の指示、
ｄ）各構成要素を実装に関連する費用の指示、及び、
ｅ）構成要素の出来のよさを示す格付け、のうちの少なくとも一つを含む。
【００４８】
本方法は、
ａ）同等のサービスを行う複数の異なる構成要素を提供し、これらの異なる構成要素は異なるエンティティによって提供されること、
ｂ）エンティティを競争させ、それによって構成要素の改良を促すこと、を含むことが好ましい。
【００４９】
本方法は通常、各構成要素の使用に対して費用を課すことにより利益を生じることを含む。
【００５０】
通常、本方法は、
ａ）利益の少なくともいくらかを、構成要素を実装する各エンティティに提供し、及び、
ｂ）第２の処理システムの運営者に、利益の少なくともいくらかを保持させること、を含む。
【００５１】
本方法は通常、生成されたコードをコンテキストに依存させることを含む。
【００５２】
この場合、通常、本方法は、構成要素の少なくともいくつかに、
ａ）実行可能コード及び処理システムのコンテキストを決定させ、及び、
ｂ）当該決定されたコンテキストに従って、実行されるデータ処理がコンテキストに依存するようにデータ処理サービスを実行させること、を含む。
【００５３】
処理システムは通常、メモリ、スタック及びレジスタを少なくとも備える。コンテキストは、
ａ）レジスタ、スタック及びメモリのうちの少なくとも一つの状態、
ｂ）定義された構成要素の組み合わせ内の他の構成要素、及び、
ｃ）偶発的要因、のうちの少なくとも一つを含む。
【００５４】
通常、本方法は、
ａ）ディザリング、
ｂ）メッシング、及び、
ｃ）遮蔽、のうちの少なくとも一つを実行することによって、データ処理作をコンテキストに依存させることを含む。
【００５５】
第２の幅広い形態において、本発明は、構成要素を使用してコンピュータにより実行可能なコードを生成する装置を提供し、各構成要素は所定の様式でデータを処理する各サービスに対応する。本装置は、
ａ）データ処理シーケンスに対応する構成要素の組み合わせを定義し、及び、
ｂ）コンピュータにより実行可能なコードが生成されるように、構成要素の組み合わせを実装し、それによって上記定義されたデータ処理シーケンスが行われる、ように成された一つ又は複数の処理システムを含む。
【００５６】
本装置は、
ａ）各構成要素を実装するようにそれぞれ成された一つ又は複数の構成要素処理システム、及び、
ｂ）第１の処理システムであって、
ｉ）ユーザから受け取った入力コマンドに従って、構成要素の組み合わせを定義し、
ii）各構成要素を実装する構成要素処理システムを決定し、及び、
iii)当該決定された構成要素処理システムのそれぞれにサービス要求を転送する、ように成された第１の処理システム、を備えることが好ましい。
【００５７】
構成要素処理システムは、
ａ）サービス要求を受け取り、
ｂ）各構成要素インスタンスを生成し、及び、
ｃ）各構成要素インスタンスを使用してサービスを実行する、ように成ることができる。
【００５８】
通常、本装置は、利用可能な構成要素の詳細を記憶するように成された第２の処理システムを備える。
【００５９】
この場合、第２の処理システムは、各構成要素処理システムから構成要素の詳細を得るように成されることができる。
【００６０】
第１の処理システムは、第２の処理システムと協働し、それによってユーザに、
ａ）利用可能な構成要素のうちの一つ又は複数を選択させ、及び、
ｂ）構成要素の組み合わせを定義させ、るように成されてもよい。
【００６１】
本装置は、本発明の第１の幅広い形態のいずれか一つの方法を実行するように成されることが好ましい。
【００６２】
第３の幅広い形態において、本発明は、構成要素を使用してコンピュータにより実行可能なコードを生成するコンピュータプログラムプロダクトを提供する。各構成要素は、所定の様式でデータを処理する各サービスに対応する。本コンピュータプログラムプロダクトは、適切な処理システムで実行されると、当該処理システムに本発明の第１の幅広い形態の方法を実行させるコンピュータにより実行可能なコードを含む。
【００６３】
第４の幅広い形態において、本発明は、ユーザにデータを処理させる方法を提供する。本方法は、一つ又は複数の処理システムを使用して、
ａ）各エンティティによって実装される各データ処理サービスをそれぞれ表す複数の構成要素の詳細を記憶し、
ｂ）選択された構成要素の詳細をユーザに提供し、それによってユーザに、データを処理するデータ処理サービスシーケンスを定義する構成要素の組み合わせを定義させること、を含む。
【００６４】
第５の幅広い形態において、本発明は、処理システムを使用してデータ処理サービスを実現する構成要素を提供する方法を提供する。本方法は、
ａ）実行されるデータ処理サービスを決定し、
ｂ）当該データ処理サービスを行う方法を決定し、及び、
ｃ）データ処理サービスを定義する構成要素仕様を生成し、当該構成要素仕様は、データの受け取り又は出力に使用されるポートを表すポート仕様を含むこと、を含む。
【００６５】
第６の幅広い形態において、本発明は、処理システムを使用して構成要素において実現されるサービスを提供する方法を提供する。本方法は、処理システムに、
ａ）サービス要求を受け取らせ、
ｂ）当該受け取ったサービス要求に応答して、各構成要素インスタンスを生成させ、
ｃ）処理するデータを受け取らせ、
ｄ）各構成要素インスタンスを使用してデータを処理させ、及び、
ｅ）当該処理されたデータを出力に供給させること、を含む。
【００６６】
第７の幅広い形態において、本発明は、定義された構成要素の組み合わせを実装することによってデータを処理する方法を提供し、各構成要素はデータを処理する各サービスに対応する。本方法は、
ａ）構成要素の組み合わせから、
ｉ）実装する構成要素と、
ii）各構成要素のポート間の接続と、を決定し、
ｂ）構成要素が必要とするあらゆるデータ、を決定し、
ｃ）各構成要素ごとに、
ｄ）各サービスの提供を要求するサービス要求を生成し、
ｅ）サービス要求を、各構成要素を実装するエンティティに転送し、当該エンティティはサービス要求に応答して各サービスを行い、それによってデータ処理を行えるように転送すること、を含む。
【００６７】
第８の幅広い形態において、本発明は、処理システムを使用して構成要素の組み合わせを定義する方法を提供し、各構成要素はデータを処理する各サービスを表す。本方法は、
ａ）組み合わせる一つ又は複数の構成要素を選択し、
ｂ）処理システムに、
ｉ）選択された各構成要素のグラフィック表現をディスプレイ上に生成させ、及び、
ii）グラフィック表現を処理して、構成要素のポート間の接続を定義させること、を含む。
【００６８】
第９の幅広い形態において、本発明は、コンテキスト依存データ処理を行う方法を提供する。本方法は、
ａ）所望のデータ処理を行う複数の技法を決定し、
ｂ）当該決定された技法のそれぞれを具現する構成要素を定義し、及び、
ｃ）使用に際して、結果得られる処理済みデータがコンテキストに依存するように、コンテキストに従って上記技法のうちの選択された一つの技術を行うこと、を含む。
【００６９】
第１０の幅広い形態において、本発明は、構成要素に基づいたデータ処理において使用するエージェントを実装する方法を提供する。本方法は、
ａ）エージェントの指示を受け取り、
ｂ）エージェントを生成し、及び、
ｃ）エージェントの指示に従って、エージェントに別のエージェントとの接続を確立させること、を含む。
【００７０】
第１１の幅広い形態において、本発明は、データ処理サービスを提供する方法を提供する。本方法は、
ａ）実行されるサービスを決定し、
ｂ）当該サービスを実行する少なくとも２つの方法を決定し、
ｃ）受け取ったデータに従って方法の中から一つを選択する方法を決定し、及び、
ｄ）データ処理サービスを実現する構成要素を定義する構成要素の仕様を生成すること、を含む。
【００７１】
第１２の幅広い形態において、本発明は、処理システムを使用して動的な構成要素において具現されるサービスを提供する方法を提供する。本方法は、処理システムに、
ａ）サービス要求を受け取らせ、
ｂ）当該受け取ったサービス要求に応答して、各構成要素インスタンスを生成させ、
ｃ）処理するデータを受け取らせ、
ｄ）当該受け取ったデータに従ってデータを処理する方法を選択させ、
ｅ）各構成要素インスタンスを使用してデータを処理させ、及び、
ｆ）当該処理されたデータを出力に供給させること、を含む。
【００７２】
第１３の幅広い形態において、本発明は、構成要素に基づいたデータ処理スキームにおいて２つの構成要素間それぞれに複数のエージェントの接続を提供する方法を提供する。本方法は、
ａ）バンドリング下位構成要素を各構成要素に提供し、
ｂ）接続を定義し、当該接続は、
ｉ）バンドリング下位構成要素の第１のエージェント及び各構成要素の各エージェントと、
ii）各バンドリング下位構成要素の第２のエージェントとの間のものであること、を含む。
【００７３】
第１４の幅広い形態において、本発明は、ルート処理システム及び複数の構成要素処理システムを使用してコードを構築する方法を提供する。各構成要素処理システムは、略図的に定義された各構成要素を実装するように成され、本方法は、
ａ）ルート処理システムに、ペイロードを含むエージェントを生成させ、
ｂ）エージェントをシーケンス内の複数の構成要素に、最後の構成要素から最初の構成要素へと転送し、
ｃ）最初の構成要素をエージェントと対話させ、それによってペイロードにデータを提供し、
ｄ）エージェントを最初の構成要素から次の構成要素へ転送し、
ｅ）次の構成要素をエージェントと対話させ、それによってペイロードにデータを提供し、
ｆ）最後の構成要素がペイロードと対話するまで、ステップ（ｄ）及び（ｅ）を繰り返し、及び、
ｇ）エージェントをルート処理システムに転送し、それによってコードを提供すること、を含む。
【００７４】
第１５の幅広い形態において、本発明は、ユーザがデータを処理できるようにする方法を提供する。本方法は、
ａ）各エンティティによって実装される各データ処理サービスをそれぞれ表す複数の構成要素の詳細を提供し、
ｂ）ユーザに、データ処理サービスシーケンスを定義する構成要素の組み合わせを定義させ、及び、
ｃ）当該定義された組み合わせに従ってデータ処理サービスを行わせること、を含む。
【００７５】
本発明は、本発明の前記幅広い形態を実行する装置及びコンピュータプログラムプロダクトも提供する。
【図面の簡単な説明】
【００７６】
【図１】本発明によるソフトウェア生産の一例を概説した流れ図である。
【図２】コンピュータによる実行可能なコードを生成する処理システムの一例の概略    図である。
【図３Ａ】図２の処理システムを使用してコンピュータによる実行可能なコードを作    成する方法の一例の流れ図である。
【図３Ｂ】図２の処理システムを使用してコンピュータによる実行可能なコードを作    成する方法の一例の流れ図である。
【図４】コンピュータによる実行可能なコードを生成するウェブベースのシステムの    一例の概略図である。
【図５】図４のエンドステーションの一例の概略図である。
【図６】図４のエンティティ処理システムの一例の概略図である。
【図７】エンティティに、構成要素を図４のベースステーションに提供させる方法の    一例の流れ図である。
【図８】構成要素の属性ダイアログボックスの一例の概略図である。
【図９】出力属性ダイアログボックスの一例の概略図である。
【図１０Ａ】図４のシステムを使用してコンピュータによる実行可能なコードを作成    する方法の一例の流れ図である。
【図１０Ｂ】図４のシステムを使用してコンピュータによる実行可能なコードを作成    する方法の一例の流れ図である。
【図１０Ｃ】図４のシステムを使用してコンピュータによる実行可能なコードを作成    する方法の一例の流れ図である。
【図１０Ｄ】図４のシステムを使用してコンピュータによる実行可能なコードを作成    する方法の一例の流れ図である。
【図１０Ｅ】図４のシステムを使用してコンピュータによる実行可能なコードを作成    する方法の一例の流れ図である。
【図１１】ユーザに表示される略図の一例である。
【図１２】ユーザに表示される構成要素の表示の一例である。
【図１３】相互接続を包含するように変更された図１１の略図の一例である。
【図１４】図１２の構成要素の内部構造の略図の一例である。
【図１５】二つの相互接続された構成要素の略図の一例の概略図である。
【図１６】図１５のエージェントの動作を示した概略図である。
【図１７Ａ】構成要素サーバの動作を示した概略図である。
【図１７Ｂ】構成要素を図５のベースステーションに示される、図１７Ａの構成要素    サーバの動作を示した概略図である。
【図１７Ｃ】エージェントを他の構成要素に示される、図１７Ａの構成要素サーバの    動作を示した概略図である。
【図１８Ａ】エージェントの受け渡し動作を示した第１の例の概略図である。
【図１８Ｂ】エージェントの受け渡し動作を示した第１の例の概略図である。
【図１８Ｃ】エージェントの受け渡し動作を示した第１の例の概略図である。
【図１８Ｄ】エージェントの受け渡し動作を示した第１の例の概略図である。
【図１８Ｅ】エージェントの受け渡し動作を示した第１の例の概略図である。
【図１９】エージェントの受け渡し動作を示した第２の例の概略図である。
【図２０Ａ】エージェントのバンドリング動作を示した概略図である。
【図２０Ｂ】エージェントのバンドリング動作を示した概略図である。
【図２１】一連のエージェントのバンドリング動作を示した概略図である。
【図２２】構成要素のバンドリング解除動作を示した概略図である。
【図２３】バンドリング処理の動作を実現した概略図である。
【図２４Ａ】階層バンドリングの略図の一例である。
【図２４Ｂ】図２４Ａに示すエージェントＡ１のペイロードを変更するように成され    た構成要素の一例の構成要素略図である。
【図２４Ｃ】図２４Ａに示すエージェントＡ１、Ａ２のペイロードを変更するように    成された構成要素の一例の構成要素略図である。
【図２５Ａ】エージェントバンドリングの受け渡しプロセスの略図の一例である。
【図２５Ｂ】エージェントバンドリングの受け渡しプロセスの略図の一例である。
【図２５Ｃ】エージェントバンドリングの受け渡しプロセスの略図の一例である。
【図２５Ｄ】エージェントバンドリングの受け渡しプロセスの略図の一例である。
【図２５Ｅ】エージェントバンドリングの受け渡しプロセスの略図の一例である。
【図２６Ａ】チェーニングの使用例である。
【図２６Ｂ】チェーニングの使用例である。
【図２６Ｃ】チェーニングの使用例である。
【図２６Ｄ】チェーニングの使用例である。
【図２６Ｅ】チェーニングの使用例である。
【図２６Ｆ】チェーニングの使用例である。
【図２６Ｇ】チェーニングの使用例である。
【図２７】他の構成要素への１対多相互接続を提供するように成された構成要素の一    例の略図である。
【図２８Ａ】多段階構築プロセスの略図の一例である。
【図２８Ｂ】多段階構築プロセスの略図の一例である。
【図２８Ｃ】多段階構築プロセスの略図の一例である。
【図２９Ａ】ディザリング動作を強調した構成要素の略図の一例である。
【図２９Ｂ】ディザリング動作を強調した構成要素の略図の一例である。
【図３０Ａ】メッシング動作を強調した構成要素の略図の一例である。
【図３０Ｂ】メッシング動作を強調した構成要素の略図の一例である。
【図３１Ａ】基本構成要素の略図の一例である。
【図３１Ｂ】基本構成要素の略図の一例である。
【図３１Ｃ】基本構成要素の略図の一例である。
【図３１Ｄ】基本構成要素の略図の一例である。
【図３１Ｅ】基本構成要素の略図の一例である。
【図３１Ｆ】基本構成要素の略図の一例である。
【図３１Ｇ】基本構成要素の略図の一例である。
【図３１Ｈ】基本構成要素の略図の一例である。
【図３１Ｉ】基本構成要素の略図の一例である。
【図３１Ｊ】基本構成要素の略図の一例である。
【図３１Ｋ】基本構成要素の略図の一例である。
【図３１Ｌ】基本構成要素の略図の一例である。
【図３１Ｍ】基本構成要素の略図の一例である。
【図３１Ｎ】基本構成要素の略図の一例である。
【図３１Ｏ】基本構成要素の略図の一例である。
【図３１Ｐ】基本構成要素の略図の一例である。
【図３１Ｑ】基本構成要素の略図の一例である。
【図３１Ｒ】基本構成要素の略図の一例である。
【図３１Ｓ】基本構成要素の略図の一例である。
【図３１Ｔ】基本構成要素の略図の一例である。
【図３１Ｕ】基本構成要素の略図の一例である。
【図３１Ｖ】基本構成要素の略図の一例である。
【図３２Ａ】「Ａｄｄ１」構成要素の構成要素の表示の一例である。
【図３２Ｂ】図３２Ａの「Ａｄｄ１」構成要素の内部略図の一例である。
【図３２Ｃ】図３２Ａの「Ａｄｄ１」構成要素を使用したテスト略図の一例である。
【図３３】「Ａｄｄ２」構成要素の構成要素の表示の一例である。
【図３４Ａ】「Ａｄｄ３」構成要素の構成要素の表示の一例である。
【図３４Ｂ】図３４Ａの「Ａｄｄ３」構成要素の内部略図の一例である。
【図３５Ａ】「Ａｄｄ５」構成要素の構成要素の表示の一例である。
【図３５Ｂ】図３５Ａの「Ａｄｄ５」構成要素の内部略図の一例である。
【図３６Ａ】「Ｐｕｔ  Ｐｉｘｅｌ」構成要素の構成要素の表示の一例である。
【図３６Ｂ】図３６Ａの「Ｐｕｔ  Ｐｉｘｅｌ」構成要素の内部略図の一例である。
【図３６Ｃ】図３６Ａの「Ｐｕｔ  Ｐｉｘｅｌ」構成要素を使用したテスト略図の一    例である。
【図３７Ａ】構成要素割り当ての内部略図の一例である。
【図３７Ｂ】構成要素割り当ての内部略図の一例である。
【図３７Ｃ】構成要素割り当ての内部略図の一例である。
【図３７Ｄ】構成要素割り当ての内部略図の一例である。
【図３７Ｅ】構成要素割り当ての内部略図の一例である。
【図３８Ａ】「Ｈｅｌｌｏ  Ｗｏｒｌｄ」例を実装するルート略図の一例である。
【図３８Ｂ】「Ｈｅｌｌｏ  Ｗｏｒｌｄ」の二重プリント例を実装するルート略図の    一例である。
【発明を実施するための形態】
【００７７】
以下、添付図面を参照して本発明の例について説明する。
【００７８】
（好適な実施形態の詳細な説明）
バイトレベルでコードを構築することができ、形式化されたデータ処理サービスを接続するシステムの複数の例について説明する。
【００７９】
具体的には、システムは、特定の、かつ、究極的に高度に専門化されたデータ処理サービスであって、構成要素として具体化されるものを利用する。一般に、各構成要素は、一つ又は複数のポートのそれぞれを介してデータを受け取り、出力するようになされる。
【００８０】
これらの構成要素を適宜組み合わせると、その完了後に処理システムに使用されるコードを表すファイルにバイトを挿入することが可能になる。一般に、ファイルは、完成すると、実行可能コードを表すようなバイナリファイルになる。従って、結果として得られる実行可能コードはアプリケーションソフトウェア等を表すことができる。しかし、ソースコード、オブジェクトコード又はリンクされたコード等、他の形態のコードを生成することも可能である。これにより、Ｊａｖａアプリケーション等のミドルウェアアプリケーションを生成することが可能になる。これにより、ソースコード、コンパイラ等を必要とすることなく、コンピュータによる実行可能なコードを形成することが可能になる。
【００８１】
これを実現する様式について、これよりさらに詳細に説明する。
【００８２】
コンピュータによる実行可能なコードを生産するプロセスの例について、これより図１を参照して概説する。
【００８３】
図に示すように、最初のステップは、ステップ１００において、コンピュータによる実行可能なコードの作成要求があるかを決定する。これは、以下により詳細に説明するように、結果として得られるコンピュータによる実行可能なコードによって実装が必要な機能を考慮することによって実現する。
【００８４】
所望の機能が決定されると、適宜組み合わせられたときに、この機能を有する実行可能なコードを作成することができる複数の構成要素が選択される。この点において、各構成要素は各データ処理サービスを具体化するため、構成要素を適した順序で組み合わせることにより、コンピュータによる実行可能なコードを生成することができる。従って、例えば、サービスとしてはデータの変更、除去、移動、又は作成等のプロセスを挙げることができる。これにより、各構成要素はコンピュータによる実行可能なコードの形成に、なんらかの貢献をすることができる。サービスは、コンピュータによる実行可能なコード等の使用を通して自動的に行うことができる。また、サービスは、手動で行うこともでき、さらに、手動と自動の実装の組み合わせで行うこともできる。
【００８５】
構成要素サービスの複雑性レベルは、以下により詳細に説明するように様々である。従って、例えば、単純な構成要素がバイナリファイル中の一つ又は複数のバイトを組み立てるように動作する。そして、バイナリファイル中のバイトは、ＣＰＵ命令の形成に使用される場合もあれば、より複雑な構成要素がいくつかのＣＰＵ命令を同時に組み立てるように動作する場合もある。
【００８６】
これを実現するために、各構成要素は、各入力として働く一つ又は複数のポートを介してデータを受け取り、次いで必要に応じてデータの処理を実行するようになされる。同様に、大半の構成要素は、処理済みのデータ又は他の情報を出力するように動作するようになされた一つ又は複数のポートも備える。説明を容易にするために、一般にポートを入力及び出力と呼ぶが、ポートは一般に双方向のものであり、別の構成要素の各ポートに対してデータを転送する、又は各ポートからデータを受け取るようになされることが理解できる。
【００８７】
使用の際に、構成要素は、データを転送することによって互いに対話する。従って、例えば、一つの構成要素の出力を別の構成要素の入力に接続して、二つのサービスを逐次実行することができる。より基礎的なレベルの適切な構成要素を階層構造に組み合わせることによって、より複雑なサービスをより基礎的なサービスの集まりとして実装することも可能である。
【００８８】
構成要素のいくつかの例について以下及び付録Ａにおいて説明する。
【００８９】
その後、ステップ１２０において、選択された構成要素の、コンピュータによる実行可能なコードの作成が可能な組み合わせが定義される。具体的には、これは、構成要素によって提供されるサービスがステップ１３０において実装されたときに、対話によって所望のコンピュータによる実行可能なコードが生成されるように、ポートを介して構成要素をどのように相互接続すべきかを指定する。
【００９０】
この技術の実施は複数の方法で実現可能なことが理解されよう。しかし、最も広い形態では、このプロセスは、図２に例示する一つの処理システムを使用して実行することができる。
【００９１】
具体的には、一般に、処理システム１０は、少なくとも、バス２４を介して図に示すように共に接続されたプロセッサ２０、メモリ２１、キーボード等の入力装置２２、ディスプレイ等の出力装置２３を備える。処理システムをデータベース１１等の記憶装置に接続するために、２５に示す外部インタフェースも設けることができる。
【００９２】
使用の際に、処理システムは、利用可能な構成要素の詳細をデータベース１１に記憶することができるようになされる。次いで、ユーザが、入力装置２２及び出力装置２３を使用して選択された構成要素の組み合わせを定義することができ、処理システム１０がコンピュータによる実行可能なコードを生成できるようにする。これから、処理システム１０がコンピュータ、ラップトップ、サーバ、専用ハードウェア等、いずれの形態の処理システムであってもよいことが理解されよう。
【００９３】
これより、処理システム１０を使用してコンピュータによる実行可能なコードを生成する方法について図３Ａ及び図３Ｂを参照して説明する。
【００９４】
具体的には、この例では、複数の自動化された構成要素がデータベース１１に提供される状況について説明する。従って、構成要素は、必要なサービスを実行するために、手動によって介入することなく自動的に実装することができ、それによって、ユーザは、処理システム１０だけを使用してコンピュータによる実行可能なコードを生成することができる。
【００９５】
これを実現するために、ステップ２００において、ユーザは、作成するコンピュータによる実行可能なコードの要件を決定することができる。ステップ２１０において、ユーザは、構成要素要求を処理システム１０に提供する。要求はいずれの形態であってもよく、通常、結果として、データベース１１に記憶されている利用可能な構成要素の詳細がユーザに提供されることになる。
【００９６】
一例では、構成要素の詳細は、少なくとも、各構成要素によって具体化されるサービスを示す構成要素の仕様の形式で記憶される。構成要素の仕様は、ポートが受け取れる／提供できるようになされたデータのタイプ及び／又は形式の詳細を提供する入力仕様及び出力仕様も含むことができる。構成要素の仕様は、システムの実施態様に応じて複数の形態のいずれであってもよいため、画像による表現、テキストデータ、演算パラメータ等として提供することができ、又は少なくともこれらを含むことができる。
【００９７】
ステップ２２０において、処理システム１０は、データベース１１に記憶されている構成要素の仕様にアクセスし、ステップ２３０において、要求の性質に応じて、構成要素のうちの一つ又は複数の指示をユーザに提供する。従って、例えば、もし各タイプのサービスが提供されるならば、要求では構成要素の詳細のみの提供を指定することができる。従って、ユーザは、要求において、実行すべき一つ又は複数のサービスを指定することができる。処理システム１０は、これに応答して、指定されたサービスのすべて又は一部を完了することができる構成要素の詳細を提供するのみである。指示は、実装に応じて複数の形式のいずれであってもよく、画像による表現又はテキスト表現等を含み得る。従って、指示は仕様自体のすべて又は一部であり得ることが理解できる。
【００９８】
ユーザは、ステップ２４０において、提供された命令を使用して、適切な構成要素を選択し、対応する構成要素の選択を処理システム１０に提供し、それによって選択された一つ又は複数の構成要素を通知する。
【００９９】
ステップ２５０において、処理システム１０は、この情報を使用して、構成要素指示を生成する。これはグラフィック形態であってもよく、又は選択された構成要素を指定するリストの形態であってもよく、オプションとして、ディスプレイ２３等でユーザに提示することができる。
【０１００】
ステップ２６０において、ユーザは、選択された構成要素の中から接続する少なくとも二つの構成要素を決定する。接続するためには、接続すべき各構成要素によって取り扱われるデータの形式及び／又はタイプに互換性があることが重要なことが理解できる。
【０１０１】
従って、例えば、第１の構成要素の出力が第２の構成要素の入力に接続される場合、第２の構成要素のサービスは、第１の構成要素によって出力されるデータを処理可能なことが重要である。この処理は、入力仕様及び出力仕様を見ることによって手動で行ってもよい。一方、より詳細に以下説明するように、エージェントの支援を受けて行ってもよい。
【０１０２】
次いで、ステップ２７０において、ユーザは、所望の接続を表す接続指示を処理システム１０に提供する。これは、接続する二つの異なる構成要素の入力及び出力のそれぞれの詳細を提供することによって実現することができる。また、画像による表現の処理等の仕組みを使用することもできる。
【０１０３】
いずれの場合でも、ステップ２８０において、処理システム１０は、接続指示に従って構成要素を相互接続するように動作する。
【０１０４】
ステップ２９０において、ユーザは接続がさらに必要か否かを判定し、必要な場合はステップ２７０に戻り、さらなる接続を定義する。必要ない場合、プロセスはステップ３００に進み、このポイントで、ユーザは、構成要素をさらに選択するか否かを決定する。選択する場合、プロセスはステップ２１０に戻り、ステップ２１０〜２９０を繰り返す。
【０１０５】
その他の場合、ステップ３１０において、ユーザはオプションとして定義された構成要素の対話を検討して、実行可能なコードを構築すべきであるか否かを決定する。具体的には、これは一般に、コードの予想パフォーマンス、構築時間を評価して、指定された構成要素の組み合わせによって、コードを構築できるか否かを決定する等のために行われる。評価され得る他の要因としては、予想コストが挙げられる。これは、ユーザが各構成要素の実装に料金を支払う必要がある場合に関連する。
【０１０６】
ステップ３２０において、指定された構成要素の対話が何らかの理由により許容可能なものではなく、コードを構築すべきではないと決定された場合、処理はステップ３３０において終了する。代替の選択肢として、ユーザは当該処理の中の以前の任意のステップに戻り、例えば、構成要素又は構成要素対話の除去、変更又は追加を通して、指定された構成要素の対話を変更することができることが理解できる。
【０１０７】
その他の場合、ユーザは、ステップ３４０において、相互接続された構成要素によって定義されるサービスを実行させる。
【０１０８】
構成要素によって具体化されるサービスの実装方法は、各構成要素の形態に応じて様々である。前述したように、この例では、各構成要素は記憶装置に記憶されているコンピュータによる実行可能なコードから形成される。従って、構成要素を実行すべきときに、処理システム１０にコードのインスタンスをダウンロードし、通常通りに実行することができる。
【０１０９】
従って、構成要素によって具体化される各サービスは、指定された相互接続に従って、メモリ２１又はデータベース１１に記憶されている、又は、別の構成要素から受け取ったデータを処理するように実装される。
【０１１０】
従って、例えば、初期データを第１の構成要素の入力に供給し、次いで第１の構成要素が動作して、具体化されるサービスに従ってデータを処理することができる。これが完了すると、処理済みのデータが第１の構成要素の出力として提供される。次いで、データは第２の構成要素の入力に転送され、第２の構成要素によって定義されるサービスを行うことができる。
【０１１１】
同様のプロセスが、複数の入力及び／又は出力を有する構成要素においても行われる。
【０１１２】
前述した例では、各サービスは実行可能なコードを使用して実装される。これは、各「構成要素」がソースコード又はオブジェクトコードの断片である、いわゆる「構成要素」を利用する先の従来技術によるシステムと区別されるべきである。このようなシステムでは、ソースコードの断片が、コンパイル又はリンクされる前に組み合わせられる。これは、一例では実行可能なコードによって実装することができるデータ処理サービスが構成要素によって具体化される本システムと対照をなすと考えられる。
【０１１３】
異なる実装によって実施態様を変形し得ることが理解できる。従って、例えば、構成要素のすべてが処理システム１０自体に実装されるわけではなく、代わりに、さらなる例において以下説明するように、他の処理システム上で遠隔から実装することもできる。
【０１１４】
同様に、構成要素はすべて自動的に実効されるわけではなく、ユーザが入力し、データを転送し、あるデータ処理を行う必要がある。これは、構成要素に関連するサービスが実装される形式の結果として計画的に発生し得る。一方、例えば、手動介入は、構成要素間で互換性のないデータ形式を転送する要件等、問題の解決にユーザの入力が必要な故障が、実装において発生した場合であり、予定外のものである。
【０１１５】
本例では、各構成要素によって具体化されるサービスがすべて完了すると、コンピュータによる実行可能なコードはメモリ２１に生成されている。コードは、生成されると、ユーザに出力することができ、コードを他の処理システム上で通常通りに実装できる。
【０１１６】
これは、構成要素が階層的に縦横に対話することから実現可能なことが理解できる。従って、単純な構成要素を適宜組み合わせることによって複雑なサービスを容易に行うことができる。
【０１１７】
従って、基本的な構成要素を作成し、次いで適宜組み合わせることを通して、複雑なデータ処理を行うことができる。同様に、複雑な機能を有するコンピュータによる実行可能なコードを開発することができることが理解できる。
【０１１８】
処理システム１０に関連して、前述した処理は、複数の異なるアーキテクチャを使用して実装し得ることが理解できる。従って、例えば、システムを、分散ウェブベースシステム等を使用して実装し、ユーザによるシステムへのアクセスを、インターネット又は別の通信ネットワークを介して、中央処理システム１０によって提供することが可能である。
【０１１９】
これより、この例について図４に関連してより詳細に説明する。
【０１２０】
具体的には、この例では、一つ又は複数の中央処理システム１０（この例では、明確化のみを目的として二つを示す）がベースステーション１に設けられ、ベースステーション１は、インターネット２及び／又は複数のローカルエリアネットワーク（ＬＡＮ）４等の通信ネットワークを介して複数のエンドステーション３に接続される。
【０１２１】
使用の際に、前述したように、構成要素は、処理システム１０に設けられ、処理システム１０によって実装することができる。一方、図に示すように、構成要素は、これもまたインターネット２及び／又はＬＡＮ４に接続された一つ又は複数の各エンティティステーション５をそれぞれ運用する一つ又は複数の各エンティティによって設けることもできる。この例では、各エンティティステーション５は、図に示すように、データベース１６等の記憶装置に接続されたエンティティ処理システム１５から形成される。
【０１２２】
使用の際に、システムのユーザは、エンドステーション３を使用してベースステーション１と通信し、それによって適した構成要素によって具体化されるサービスの提供を得ることができる。
【０１２３】
これは複数の様式で実現することができるが、この例では、例示のみを目的として、サービスへのアクセスはウェブページの使用を通して提供される。従って、これを実現するために、各エンドステーション３は必要に応じてウェブページにアクセスする。そして、データをエンドステーション３に転送するようになされた処理システムから構成される。
【０１２４】
好適なエンドステーション３の例を図５に示す。図に示すように、エンドステーション３は、バス３４を介して共に接続されたプロセッサ３０、メモリ３１、キーボード等の入力装置３２、ディスプレイ等の出力装置３３を備える。処理システムには、必要に応じてエンドステーション３をインターネット２又はＬＡＮ４に接続する外部インタフェース３５も設けられる。
【０１２５】
使用の際に、プロセッサ３０は、ベースステーション１に設けられた処理システム１０と通信ネットワーク２、４を介して通信して、処理システムのサービスにアクセスできるようにするようになされる。従って、エンドステーション３を、適宜プログラムされたＰＣ、インターネット端末、ラップトップＰＣ、ハンドヘルドＰＣ等、任意の適した処理システムによって構成することができ、通常はデータ転送を処理するアプリケーションソフトウェアであることが理解できる。なお、場合によってはウェブ閲覧を可能にするアプリケーションソフトウェアでもよい。
【０１２６】
構成要素は、構成要素及び構成要素において提供されるサービスの性質に応じて処理システム１０自体に実装することもでき、又はエンティティ処理システム１５の一つに実装することもできる。
【０１２７】
従って、エンティティ処理システム１５は、通信ネットワーク２、４を介して処理システム１０と通信可能でなければならない。これを実現するために、エンティティ処理システム１５は概して、図６に示す処理システムと同様である。
【０１２８】
図に示すように、エンティティ処理システム１５は、バス４４を介して共に接続されたプロセッサ４０、メモリ４１、キーボード等の入力装置４２、モニタ等の出力装置４３を備える。処理システムには、必要に応じてエンティティステーション５をインターネット２又はＬＡＮ４、同様にデータベース１６に接続する外部インタフェース４５も設けられる。
【０１２９】
使用の際に、プロセッサ４０は、エンティティが各構成要素にカプセル化されたサービスを行えるようになされる。従って、エンティティステーション５を、適宜プログラムされたＰＣ、インターネット端末、ラップトップＰＣ、ハンドヘルドＰＣ等の任意の適した処理システムから形成できることが理解できる。サービスはデータ集約的であるため、エンティティ処理システム１５は多くの場合、サーバ等から形成される。
【０１３０】
いずれの場合でも、エンドステーション３及びエンティティステーションは、共通の処理システムを使用して実装することができ、エンドステーション３とエンティティステーション５との区別は主に説明のみを目的としたものであることが理解できる。
【０１３１】
エンドステーション３のユーザにベースステーション１を介して構成要素において提供されるサービスへのアクセスを依然として可能にしながら、構成要素をエンティティステーション５によって実装できるようにするためには、典型的には、構成要素の少なくともいくらかの詳細が構成要素の仕様の形態でデータベース１１に記憶される。構成要素の仕様はいずれの形式であってもよく、画像による表現等を含むことができる。しかし、一般に、構成要素の仕様は、ユーザが各構成要素によって具体化されるサービスを決定するに十分な情報を含む。構成要素の仕様は、構成要素を選択し使用できるのに十分な情報を提供することに留意が必要である。従って、構成要素の仕様は、実行できるデータ処理の指示を含むが、これがどのように実現されるか。この重要性についてより詳細に以下強調する。
【０１３２】
コンピュータによる実行可能なコードを作成することができる様式について、これより図７を参照して説明する。
【０１３３】
具体的には、ステップ４００において、エンティティが各サービスを提供する形式を決定する。これは複数の方法で実現することができ、各サービス及びエンティティがサービスを提供したい形式に依存する。
【０１３４】
従って、例えば、エンティティは、すべてにおいてエンティティの制御下で、データをエンティティステーション５において受け取り、エンティティ処理システム１５によってデータを変更し、次いで変更されたデータを処理システム１０又はエンドステーション３に返信するように、手動でサービスを提供することができる。
【０１３５】
一方、エンティティ処理システム１５によって実行されるコンピュータによる実行可能なコードによっても、この方法を実行することもでき、この場合、エンティティはまず、必要な実行可能なコードを決定しなければならない。
【０１３６】
手動プロセスと自動プロセスの組み合わせを使用することもできる。さらに、データを処理システム１０又はエンドステーション３に返さず、代わりに、異なる構成要素によって具体化される別のサービスによって処理するために別のエンティティステーション５に転送することもできる。
【０１３７】
さらなる選択肢として、エンティティは、サービスを複合的な構成要素の形式で提供することもできる。この場合、エンティティは、組み合わせられると必要なサービスを実行する構成要素を定義する、すでに存在する構成要素の組み合わせを効率的に定義する。この場合、エンティティステーション５は、必要に応じて、他のエンティティステーション５及び／又はベースステーション１等を通して、複合的構成要素内に含まれる構成要素の実装を他のエンティティに「受け渡す」ようになされている。
【０１３８】
いずれの場合でも、ステップ４１０において、エンティティは、エンティティステーション５を使用して、サービスの提供をカプセル化した構成要素を定義する。これを実現するために、一般に、エンティティ処理システム１５は、この処理において、エンティティを支援するアプリケーションソフトウェアを実行する。ソフトウェアは、各構成要素サービスによって提供される機能をエンドユーザが理解できるようにするために処理システム１０が必要とする情報を、エンティティに提供するように促す。従って、例えば、エンティティには、ユーザが構成要素の動作を決定するために必要な情報のタイプを定義するフィールドを含むダイアログボックスを提示することができる。
【０１３９】
一般に、必要な情報としては、少なくとも、構成要素の仕様、入力仕様及び出力仕様が含まれる。具体的には、構成要素の仕様は、構成要素の作成者、実装エンティティ等に関連する情報と共に、構成要素によって提供されるサービスに関する情報を提供するために使用される。構成要素の仕様は、処理システム１０又はエンドステーション３が構成要素によって具体化されるサービスにアクセスできるように十分な情報を含む。
【０１４０】
従って、構成要素の仕様は通常、少なくとも以下のものを含む。
・製造業者ＩＤ  −  サービスを提供するエンティティの識別に使用される
・構成要素ＩＤ  −  各構成要素の識別に使用される
・ロケーション情報  −  構成要素が実装される場所の識別に使用される
・説明  −  構成要素によって提供されるサービスの指示
例えば、この情報は、図８に示す属性ダイアログボックスの使用を通して提供することができる。属性ダイアログボックスは、構成要素の名前、構成要素の説明、作成者、アドレス、報告番号等の情報を提供するように、エンティティを促す。この例では、図は、より詳細に以下に説明する設計者向けプログラム用のグラフィカルユーザインタフェース（ＧＵＩ）を示す。この場合、設計者向けプログラムには「add_other」構成要素が編集のためにロードされている。ＧＵＩには３つの主なフィールドがある。
１．ツールバー  −  構成要素の表示を編集できるようにする
２．構成要素の表示  −  公開されるとフォーラムにおいて利用可能になるもの
３．構成要素の詳細  −  エンドユーザが必要とする、構成要素の表示と組み合わせられる追加情報
エンティティ処理システム１５にインストールされているアプリケーションソフトウェアも、必要とされる任意の識別子の生成に使用することができる。具体的には、一般には、エンティティ及び構成要素の両方を一意に識別することができる識別子を生成することが必要である。
【０１４１】
さらに、構成要素を実装して、具体化されるサービスを提供する際に、エンティティステーション５は、複数の異なるコード生成プロジェクトで同じ構成要素を同時に実装する場合がある。この場合、いくつかの異なる構成要素インスタンスが存在することになり、一つ又は複数の構成要素インスタンスが、実装に応じて各コード生成プロジェクトのそれぞれに適用される。従って、この場合、各識別子を生成して各構成要素インスタンスを一意に識別できるようにする必要がある。
【０１４２】
構成要素の仕様はいずれの形式で提供されてもよいが、通常、これは所定のＸＭＬスキーマに従って生成されるＸＭＬファイルの形式で提供される。これは通常、エンドステーション３によって実装されるソフトウェアに、ダイアログボックスを使用して提供された情報をＸＭＬファイルに変換することによって実現される。
【０１４３】
これに加えて、入力仕様及び出力仕様が、データを構成要素間で転送できるようにするために必要な任意の情報を示すために使用され、従って、通常、これは各構成要素の性質に依存する。
【０１４４】
例えば、構成要素は、各入力において、多種多様なデータを取り扱うようにすることができる。これには、例えば、異なるデータ形式及び／又は異なるデータタイプが含まれる。この場合、入力仕様及び出力仕様は、構成要素の入力が受け取ることのできるデータ又は構成要素の出力が供給することのできるデータのタイプ及び／又は形式の詳細を含む。しかし、構成要素が１形式又は１タイプのデータのみを受け取るようにのみされている場合、これは必要ない。入力及び出力を接続するためのアドレス情報も提供することができる。これにより、構成要素は、データをある構成要素の出力から次の構成要素の入力に転送することによって互いに通信可能になる。
【０１４５】
一例では、この通信の制御は、各構成要素が実装される場所において実行されるソフトウェアアプリケーションであるエージェントを使用して実現される。エージェントの動作は、システムの実施態様、特に関わる構成要素の性質に依存する。
【０１４６】
従って、異なるタイプのデータを取り扱うことのできる構成要素の場合、エージェントは、ネゴシエーションを行って利用可能なデータタイプ及び入力仕様及び出力仕様において指定される形式の中から選択するようになすことができる。また、各構成要素が直接通信できるようにする。一方、構成要素は、一つの形式のデータを受け取る又は出力のみをするようになすこともできる。その場合には、このようなネゴシエーションは必要ない。
【０１４７】
エージェントは一般に、エンティティステーションによって実行されるソフトウェア構成物であり、構成要素インスタンスが他のコンテンツインスタンスと通信できるようにする。従って、入力仕様及び出力仕様は、各エージェントの動作様式についての詳細も含む。
【０１４８】
いずれの場合でも、入力仕様及び出力仕様の詳細は、エンティティに、各入力及び／又は出力並びに関連するエージェントに関する詳細を促すダイアログボックスの使用を通して提供することができる。出力のダイアログボックスの例を図９に示す。
【０１４９】
次いで、通常、入力仕様及び出力仕様は、構成要素の仕様に統合され、そして、各ＸＭＬファイルに組み込まれる。しかし、これは本質的なことではなく、各ＸＭＬファイルによって代替を定義することが可能である。
【０１５０】
以下、エージェントの動作についてより詳細に説明する。しかし、エンティティは構成要素としてサービスをカプセル化する際にもエージェントを構築するように動作することが理解できる。
【０１５１】
本発明の実施態様に応じて、エージェント以外の技術を用いてネゴシエーションを行うことも可能である。
【０１５２】
いずれの場合でも、ステップ４２０において、エンティティ処理システム１５は、生成された構成要素、入力仕様及び出力仕様並びにエージェントの詳細を、通常はデータベース１６に記憶するように動作する。次いで、ステップ４３０において、エンティティステーション５を使用してベースステーション１にアクセスし、ステップ４４０において、構成要素、入力仕様及び出力仕様の詳細をベースステーション１に転送できるようにし、ステップ４５０においてデータベース１１に記憶する。
【０１５３】
構成要素が自己完結型である場合、構成要素全体をデータベース１１にダウンロードして記憶することができ、この場合、いずれの情報もエンティティステーション５に記憶する必要がないことが理解できる。これは、例えば、図３Ａ及び図３Ｂに関連して前述したように、処理システム１０が構成要素サービスを自動的に実装できるようにする。一方、構成要素をエンドステーション３に転送して実装することもできる。一般に、このような技術はサービスの実装方法の公開に繋がる。
【０１５４】
エンティティは普通、構成要素の動作に対して、少なくとも、ある形態の制御を保持したいと思うため、通常、構成要素サービスはエンティティステーション５に実装される。
【０１５５】
これは、一般に、サービスの実装にエンティティからの手動入力が必要な場合に必要なことであるが、他の理由によっても望ましい場合がある。
【０１５６】
従って、例えば、これによって、エンティティが、効率を向上させるように構成要素の動作を調整し、及び／又は、変更することを容易にする。これらのみならず、構成要素の使用及び動作を監視することが可能になる。さらに、これによって、サービスを供給するエンティティが、処理済みのデータ又は別の出力のみを提供することが可能になり、サービスの実装に使用される方法は公開されない。これによって、以下により詳細に説明するように、サービスを実装する技術を業務上の秘密又は専門知識等として保持することが可能になる。
【０１５７】
さらに、システムが多数の構成要素を取り扱うようになされる場合、データベース１１及び処理システム１０が、すぐに過度に使用されることになり得ることから、一般に、これらをすべてベースステーション１に配置することは望ましくない。
【０１５８】
従って、通常は、構成要素は、エンティティステーション５において実装され、仕様及びエージェントの詳細がベースステーション１に転送されて、エンドステーション３のユーザが使用する構成要素を選択できるようにする。具体的には、システムのユーザがこのように構成要素を選択する場合、構成要素自体が実際にベースステーション１に提供されるのか、それともエンティティステーション５に提供されるのかは、ユーザが意識しなくてもよい事項（トランスペアレント）である。これは、各サービスを提供するエンティティステーション５にアクセスする必要のあるすべての仕様及びエージェントの詳細がベースステーション１に記憶されるためである。
【０１５９】
構成要素によって具体的なサービスがエンティティステーション５に実装される場合、典型的には、各サービスの実装形式の詳細を記した非公開構成要素の仕様をさらに生成する。これは、サービスを行う際にエンティティが使用する実行可能なコード及び／又は命令を含むことができる。一方、エンティティがデータ処理を他の構成要素を使用することによってのみ実装する場合、非公開仕様は、本明細書に記載の技術により構築され実装される構成要素概要（スケマティック）の形態となり得る。これから、エンティティがデータ処理サービスを特定の組み合わせで他のエンティティに外注することによって、サービスの実装を定義することができることが理解できる。
【０１６０】
いずれの場合でも、非公開仕様が作成される場合、これは、ステップ４６０においてエンティティステーション５に記憶される。
【０１６１】
非公開仕様は、前述した構成要素の仕様と対照的に、提供されるサービスのみを記述し、実装形式を記述しない。非公開仕様は、エンティティ外部の個人に決して提供されず、それにより、各サービスが実装される方法を秘密としてエンティティが保持できるようにする。従って、これは、エンティティが各自の方法に対する保護を維持するのに役立つことが当業者には理解できる。いずれの場合でも、実装されるサービスの定義のみを構成要素の仕様に提供することにより、構成要素の仕様をベースステーション１に記憶させることによって、構成要素の仕様を公開する際に危険がないことが理解できる。
【０１６２】
ユーザがベースステーション１を使用してアプリケーションソフトウェアを生産する様式の詳細な例について、これより図１０Ａ〜図１０Ｅに記したフローチャートに関連してより詳細に説明する。
【０１６３】
図に示すように、図１０Ａのステップ５００において、最初の段階は、ユーザが作成するコンピュータによる実行可能なコードの要件が決定される。次いでステップ５１０において、ユーザがエンドステーション３を使用してベースステーション１にアクセスする。
【０１６４】
ステップ５２０において、ユーザはエンドステーション３を使用して構成要素探索を選択する。そして、ステップ５３０において、データベース１１に記憶されている構成要素の仕様に基づいて利用可能な構成要素の詳細を、処理システム１０に提供させる。具体的には、通常、処理システムはユーザが、異なる形態の機能を定義した構成要素の分類を通して探索できるようにする。これによって、ユーザは、必要なサービスを具体化する構成要素を速やかに見つけることができる。
【０１６５】
ステップ５４０において、ユーザは構成要素の属性を検討し、一つ又は複数の構成要素を選択する。これは複数の方法で実現し得るが、通常、ユーザに、少なくとも構成要素のタイトル及び適した構成要素の手短な追加説明を提供する案内可能なリストが提示される。次いでユーザは、構成要素のそれぞれ一つを選択して、さらなる詳細を提供させることができ、最終的に選択することができる。
【０１６６】
例えば、さらなる詳細は、例えば、図８に示すような属性ダイアログボックスの使用することによって提供することができる。この場合、詳細は、構成要素の名前、構成要素の説明、作成者、アドレス、報告番号等の情報を含み、データベース１１に記憶されている構成要素の仕様から直接決定される。
【０１６７】
ステップ５５０において、選択された構成要素の指示が記憶される。これは、実装に応じて複数の様式で実現し得る。例えば、エンドステーション３はユーザが選択した各構成要素を表す構成要素データを生成することができる。次いで、構成要素データはメモリ３１に記憶される。一方、処理システム１０は構成要素データを生成し、データベース１１に記憶することができる。
【０１６８】
ステップ５６０において、エンドステーション３（又は、代替えの処理システム１０）は、選択された構成要素の表示を含む略図を生成する。略図は、より詳細に以下説明するように、ユーザに構成要素間の接続を定義させるために使用される。具体的には、これは、エンドステーション３のユーザが、構成要素及びコンピュータによる実行可能なコードを生産するために、これらを互いにどのように接続する必要があるかを視覚化できるようにする。
【０１６９】
略図は選択された各構成要素の表示を含み、これは一般に、エンティティによって定義され、構成要素の仕様の一部としてベースステーション１に転送される。ユーザが各構成要素を選択すると、対応する構成要素の表示がベースステーション１からエンドステーション３に転送され、必要に応じて略図に追加される。
【０１７０】
従って、エンドステーション３が記憶する構成要素の指示は構成要素の表示の形式であることが理解できる。さらに、構成要素の表示を単にドラッグして略図中にドロップすることだけで、構成要素を選択することができる。
【０１７１】
略図の例を図１１に示す。図に示すように、略図は略図ウィンドウ５０に表示され、この例では、４つの構成要素の表示５１、５２、５３、５４を含む。各構成要素は、構成要素の表示中に５１Ａ、５１Ｂ、５１Ｃ等と一般的に示すように、複数の入力及び出力を有する。
【０１７２】
ユーザが略図に示される各構成要素の一つを選択した場合、ユーザには一つの構成要素の表示が提示される。その例を図１２に示す。具体的には、図１２は、複数の入力表現及び出力表現５２Ａ、５２Ｂ、・・・、５２Ｇが提示された構成要素の表示５２を含む構成要素表示画面６０を示す。
【０１７３】
構成要素表示画面は、示されている構成要素ウィンドウ６０と、上に述べた略図ウィンドウ５０と、自動選択ウィンドウとの間を、ユーザが行き来できるようにする複数のウィンドウ選択タブ６１も含む。
【０１７４】
エージェントウィンドウ６２も提供される。エージェントウィンドウ６２は、各入力仕様及び／又は出力仕様から得られる選択された入力エージェント又は出力エージェント（この例では、エージェント５２Ｇ）の詳細を表示する。
【０１７５】
使用の際に、ユーザは、構成要素の表示と略図との間を行き来して、構成要素に関する様々な情報を提供させることができる。従って、例えば、構成要素の表示５２を選択することにより、例えば、図８に示すように、対応する構成要素の属性を表示させることができる。同様に、入力表現及び／又は出力表現のそれぞれ一つを選択することにより、各入力又は出力の詳細がエージェントウィンドウ６２に表示される。通常、このような詳細は、図９に示すような入力又は出力ダイアログボックスを適宜表示することによって提供される。
【０１７６】
いずれの場合でも、ユーザは提示された略図を検討し、ステップ５７０において、構成要素がさらに必要か否かを決定する。ステップ５８０において、構成要素がさらに必要であると決定された場合、処理はステップ５２０に戻り、ユーザが構成要素探索ツールに戻り、エンドステーション３を使用して構成要素をさらに選択できるようにする。次いで、これら構成要素の表示を、例えば、ドラッグ・アンド・ドロップ技術を利用して、必要に応じて略図に追加することができる。
【０１７７】
対応する構成要素の表示を略図上に配置することによって、必要な構成要素（又は必要な構成要素の少なくともいくつか）が選択されると、ユーザは、ステップ５９０において、接続する構成要素の入力及び出力を決定する。
【０１７８】
構成要素がうまく確実な対話をするために、ユーザは通常、ステップ６００において、接続する入力及び出力に互換性があるかをここでチェックする。具体的には、ユーザは、入力及び出力がいずれかの共通データタイプ及び／又は形式を取り扱うことができるかをチェックする。この情報は、入力仕様及び出力仕様に含まれる入力及び出力の詳細を調べることによって決めることができる。通常、構成要素の最初に選択する際にもこの考慮事項に配慮することが理解できる。
【０１７９】
ステップ６１０において、ユーザが、入力及び出力を接続することができないと決定した場合、処理はステップ５２０に戻り、一つ又は複数の代わりの構成要素を選択することができる。
【０１８０】
その他の場合、ステップ６２０において、ユーザは接続ツールを選択して動作させ、略図上で各構成要素の表示の入力及び出力の間を接続する表示を生成する。この例を図１３及び図１４に示す。エンドステーション３は、接続の表示を入力及び出力の間の接続として解釈し、接続を表す接続データを生成する。
【０１８１】
具体的には、図１３は、図１１に示す構成要素の表示の構成要素の表示５１、５２、５３、５４の略図を示し、一般に６５に示す接続の表示を使用して、構成要素は互いに接続されている。具体的には、この例では、構成要素の表示５２は、図に示すように複製された構成要素の表示５１、ＢＮＥアドレス指定構成要素の表示５３、及びビルド構成要素の表示５４に接続される。
【０１８２】
図１４は、構成要素の表示５２が複数の下位構成要素から形成された複合的な構成要素に対応することを示す。同様に、これら下位構成要素も、図に示すように、接続の表示６５によって相互接続されたＬＤＡＡ構成要素の表示７０、ＤＥＣＡ構成要素の表示７１、ＳＴＡＡ構成要素の表示７２、及び二つのビルド構成要素の表示７３、７４として表される。
【０１８３】
図１３の略図に表される構成要素の組み合わせによって、減分カウンタを形成するコンピュータによる実行可能なコードを生成することができる。しかし、この例は、略図の動作を説明するために提供されたものであり、実装される実際の機能は重要ではないことが理解できる。以下に、さらなる例についてより詳細に説明する。
【０１８４】
いずれの場合でも、ユーザは、略図上で入力及び出力のそれぞれを選択し、次いで、ステップ６２０において、入力と出力の間に接続する表示を描き、それによって入力と出力のそれぞれの間に接続を定義することができる。
【０１８５】
この例では、エンドステーション３も処理システム１０も接続の妥当性を調べるように動作せず、具体的には、データが第１の構成要素の出力から第２の構成要素の入力にうまく転送することができるかは決定されない。しかし、いくつかの実施態様では処理システムのいずかによるチェックが行われ得ることが理解できる。
【０１８６】
いずれの場合でも、この例では、ステップ６３０において、エンドステーションは、作成された接続の指示を接続データの形態で記憶する。
【０１８７】
次いでユーザは、ステップ６４０において、略図を検討し、接続がさらに必要であるか否かを決定する。ステップ６５０において接続がさらに必要であると決定された場合、プロセスはステップ５９０に戻り、接続を前述した様式でさらに定義することができる。
【０１８８】
このようにして、ユーザは描画ツールを使用して、効率的に必要な接続をすべて略図において定義する。これには通常、各構成要素の入力及び出力のそれぞれを別の出力又は入力に接続する必要があるが、場合によっては適切な終端を提供することもできる。
【０１８９】
ステップ６５０において、略図において構成要素にそれ以上の接続が必要ないと決定された場合、ユーザは、ステップ６６０において略図を検討し、さらに構成要素が必要かを決定する。これによって、ステップ６７０において、さらに構成要素が必要であると決定された場合、方法はステップ５２０に戻り、構成要素をさらに含めることができる。
【０１９０】
このようにして、ユーザは、二つ以上の構成要素を効率的に選択することができる。また、構成要素をさらに選択しに戻る前に、これらを相互接続を処理することができる。
【０１９１】
ステップ６７０において、それ以上の構成要素が必要ないと決定された場合、ステップ６８０において、ユーザはコンピュータによる実行可能なコードの構築を指示する。
【０１９２】
前述したグラフィックベースのシステムの使用は一例であり、他の技術を利用して構成要素の組み合わせを定義することも可能であることが理解できる。例えば、構成要素は、適当なテキストベースの言語で表すこともできる。この場合、関数によって構成要素を表し、命令文（ステートメント）によって構成要素の組み合わせを表し、変数によってエージェントを表すことができる。
【０１９３】
この点で、ユーザはオプションとして、例えば図３Ｂのステップ３１０〜３４０に関連して前述したように、略図を検討し、コンピュータによる実行可能なコードを生成すべきであるかを決定することができる。具体的には、一般に、全体のコスト、構築時間、資源使用量、結果として得られるパフォーマンス等の指示等、コード生成プロセス全体に関連する情報が、ユーザに提示される。
【０１９４】
主として、これはエンドステーション３及びベースステーション処理システム１０の協働によって関連情報を決めることによって生成される。従って、例えば、エンドステーション１３は略図による指示を処理システムに転送して、関連する値を求ることができ、又は情報を構成要素の仕様の一部に含めることができる。処理システム１０が略図構築プロセスのホストとなる場合、情報を定めることができる。また、単にエンドステーションでユーザに表示することができる。
【０１９５】
いずれの場合でも、各略図によって定義される構築プロセスが条件を満たしていようとも、すなわち、コンピュータによる実行可能なコードの構築に進みたくても、ユーザがアクセスできるようにする。
【０１９６】
略図で定義されたサービスの実装によるコンピュータによる実行可能なコードの構築は、ビルドプロセスとして知られている。一例では、これは、構成要素を対話させるように動作するエージェントを使用することによって、実装される。
【０１９７】
この実現方法は実施態様に依存する。一例では、エージェントは、別の構成要素からデータを受け取らないようになされる。この場合、各構成要素上のエージェント間では一つのデータ転送が行われるため、この形態の通信は一つのイベントトランザクションと考えることができる。しかし、構成要素が異なるデータ形式を取り扱うようになされている場合は、共通のデータ形式を決定するためにネゴシーションが必要である。これは、多重イベントトランザクションとして知られている複数のメッセージをエージェント間の転送を行う必要がある。この例では、多段階トランザクションについて説明するが、一般技術が一つの段階のトランザクションにも同様に適用されることが理解できる。
【０１９８】
ビルドプロセスは、それに代えて又はそれに加えて、各実装に応じて、処理システム１０、一つ又は複数のエンティティステーション５、他の処理システム、又は上記の組み合わせによって行い得ることも理解できる。しかし、この例の残りの部分は、エンドステーション３によって行われるビルドプロセスを参照して説明する。
【０１９９】
この例では、ステップ６８０においてビルドプロセスに進む命令を受け取ると、ステップ６９０において、エンドステーション３は構成要素データ及び接続データにアクセスする。ステップ７００において、エンドステーションは構成要素データを使用して、コンピュータによる実行可能なコードを生成する際に使用すべき構成要素を決定する。
【０２００】
ステップ７１０において、エンドステーション３は、エンドステーション３によって実行されるソフトウェアエンティティである構成要素サーバを実装して、エンドステーションが構成要素インスタンスを実装できるようにする。この場合、構成要素サーバは階層の最上位レベルにあり、従って、略図において他のすべての構成要素を含む最上位の構成要素を実装するために使用される。その結果、構成要素サーバはルートサーバとして知られている。
【０２０１】
ステップ７２０において、エンドステーション３は略図及び構成要素の仕様を使用して、各構成要素を供給しているエンティティステーション５を決定する。ステップ７３０において、この情報が略図からの接続データと共に使用されて、各構成要素のエージェント間に必要な接続の詳細が求められる。
【０２０２】
ステップ７４０において、エンドステーション３は、使用する各構成要素に対応する購入注文を生成する。具体的には、購入注文は、各エンティティステーション５を介して各サービスを提供するエンティティに送信され、各構成要素に関連するサービスの提供を要求するようになされる。一般に、各購入注文は、少なくとも以下の情報を含む。
・製造業者ＩＤ
・構成要素ＩＤ
・ビルドＩＤ  −  各ビルドインスタンスの識別に使用される
・制約  −  ユーザによる実装に対して課されるあらゆる制約の指示
・必要なエージェント接続の詳細
以上では購入注文を用いる場合について説明したが、これらは本質的なものではなく、各構成要素に関連するサービスの実装を注文する他の技術を代わりに使用し得ることが理解できる。
【０２０３】
ステップ７５０において、各購入注文が各エンティティに送信される。一例では、これによって、各エンティティは各サービスを行うことが可能であるか否かを決定することができる。従って、例えば、エンティティは、コンピュータによる実行可能なコードの故障、サービスを手動で行う個人の不在等の実装問題によって利用不可能になる場合がある。
【０２０４】
構成要素が複数の下位構成要素から形成される場合、他のエンティティの責任となる下位構成要素のうちの一つ又は複数の故障から、エンティティが構成要素を実装することができない場合がある。これは、下位構成要素を実装するエンティティステーション５からの応答に基づいてエンティティステーション５によって決定され、エンドステーション３に通知される。
【０２０５】
エンティティがサービスを行うことができない場合、これが各構成要素自体に伴う問題によるものか、それとも関連する下位構成要素に伴う問題によるものかに関わらず、このことの指示がエンドステーション３に転送される。エンドステーション３により、いずれの構成要素も実行できないと決定される場合、プロセスは終了するか、又は、一つ又は複数の代替の構成要素を選択することによって略図をユーザに更新させることができる。従って、例えば、処理はステップ５２０に戻り、異なる構成要素を選択することができる。
【０２０６】
サービスを行うことができると想定すると、すなわち、このような評価が行われなければ、ステップ７６０において、エンティティステーション５は構成要素サーバを生成して、各構成要素インスタンスを実行できるようにする。
【０２０７】
この点において、エンティティステーション５によって実装される構成要素サーバは、構成要素の実装に使用される下位構成要素を提供するいずれのエンティティステーションにも送信される各購入注文を生成する必要があり得る。従って、構成要素を実装するエンティティステーション５は、下位構成要素を実装しているエンティティステーション５に各購入注文を送信することによって、エンドステーション３と同様の様式で機能することができることが理解できる。従って、エンティティステーション５は構成要素の仕様を使用して、下位構成要素等を決定し、以下はエンドステーション３によって行われるステップ７００〜７４０と同様である。これは、プロセスの階層性質を強調する。
【０２０８】
一方、データ処理サービスは実行可能なコードによって実装することもでき、この場合、これは、当業者が理解するように、構成要素インスタンスとして構成要素サーバによって実装される。他の選択肢も、当業者が理解できるように利用可能である。
【０２０９】
ステップ７７０において、接続された各入力及び各出力に関連するエージェントがアクティブ化される。一般に、エージェントは、各構成要素インスタンスを実装する構成要素サーバによって実装されるソフトウェアである。従って、エージェントは、各エンティティステーション５が購入注文を受け取り、各構成要素インスタンスが生成されるとすぐにアクティブ化される。従って、必要な構成要素インスタンス及び関連するエージェントのアクティブ化は、必要な購入注文が、要求を受ける側のエンティティステーション５に伝えられると、略図全体を通して逐次行われる。
【０２１０】
具体的には、エージェントは、以下に、より詳細に説明するように、所定の順序でアクティブ化される。多重イベントトランザクション環境では、エージェントがアクティブ化されると、ステップ７８０において、各入力／出力仕様から各データ形式及び／又はタイプの詳細を決定する。次いでステップ７９０において、エージェントは、購入注文において各構成要素サーバに提供される接続情報に従って接続を確立することによって決定されたデータ形式／タイプを比較する。具体的には、接続される入力及び出力のそれぞれのエージェントは、購入注文におけるアドレス情報に基づいて、通信ネットワーク２、４を介して、必要に応じてメッセージを転送する。
【０２１１】
いずれの場合でも、ネゴシエーションを実現するために、メッセージは各データ形式／タイプの指示を含み、共通のデータ形式／タイプがあるか否かを決定する。この点において、入力及び出力は、両方が共通のデータ形式及び／又はタイプを取り扱うことができる場合にのみ通信することができることが理解できる。
【０２１２】
これは、実行可能なコードからエージェントを形成して共通の形式を決定することによって自動的に行うことができるが、一方、例えば、構成要素によって具体化されるサービスが手動で実装される場合に、ネゴシエーションは手動で行うこともできる。この場合、エージェントはダイアログボックスを起動して、異なるエンティティステーションのオペレータが通信して交渉できるようにする。これは通常、２人のオペレータ同士のチャットセッションと同様の形式で行われる。
【０２１３】
ステップ８００において、共通のデータ形式／タイプがないと決定された場合、プロセスはステップ８１０に進み、このポイントで、エージェントは、構成要素を相互接続することができないと決定する。これは、例えば、一つの構成要素が第１の形式のデータを出力しており、他の構成要素が第２の形式のデータを許容する必要がある場合に発生する。これが発生すると、ステップ８２０においてビルドプロセスは停止され、ユーザに通知がされる。これにより、ユーザは、ビルドプロセスを続行できるように是正措置をとることができる。これは、例えば、追加の構成要素又はエージェントを追加する、又は手動でデータを処理して、エラーを修正させることによって実現することができる。
【０２１４】
この点において、エージェントがエンティティ処理システムの一つによって実装される構成要素の下位構成要素に設けられる場合、下位構成要素が通信を確立することを保証するのは各構成要素を実装するエンティティの責任であり得る。
【０２１５】
一方、ビルドプロセスは、ソフトウェアを構築されないで終了することができる。
【０２１６】
いずれの場合でも、各入力及び出力が共通のデータ形式／タイプを有する場合、ステップ８３０において、エージェントは、各入力及び出力が通信可能な状態にあると決定し、この場合、ステップ８５０においてサービスの実装が開始される。
【０２１７】
これから、一つのトランザクションイベントの接続がエージェント間に確立される場合、一般に、別の任意のエージェントからデータを含むメッセージを受け取るために、単に入力エージェントをアクティブ化することが理解できる。同様に出力エージェントの場合も、エージェントはアクティブ化され、出力データが構成要素によって提供されるまで何もせず、出力データが提供されると、出力データを含むメッセージを生成し、別のエージェントに転送する。この場合、ステップ７８０〜８３０は必要ない。
【０２１８】
いずれの場合でも、エンティティは、エンティティステーション５に、エージェントが他のエージェントから入力において受けとったメッセージ中のデータと対話させることによって各構成要素で定義される各サービスを提供する。次いで、データは、定義された略図によって要求されるように、エンドステーション３又は別のエンティティステーション５に転送される前に、必要に応じて処理又は使用される。
【０２１９】
一般に、各構成要素は各エンティティステーション５に実装される。これを実現するために、処理されるデータはエンドステーション３、ベースステーション１、又は別のエンティティステーション５から各エンティティステーション５にダウンロードされる。これは、構成要素の仕様に示されるように、処理システム１５上の特定のポート等にデータを転送することによって実現される。データは、構成要素インスタンスＩＤと共に転送され、正しい構成要素インスタンスがデータ処理に使用されることを保証する。
【０２２０】
しかし、これは、各内容インスタンスを各ポートに提供し、データを各ポートに転送する等、他の技術を利用して実現することもできることが理解できる。
【０２２１】
いずれの場合でも、各構成要素インスタンスが処理されるデータを受け取ると、各エンティティステーション５がホストとなる場合、構成要素サーバはデータを交換し、必要に応じてデータを変更し、それから変更されたデータを出力ポートの一つ又は複数に提供する。従って、データは、各構成要素サーバによって実装される実行可能なコードによって、オペレータからの入力コマンドに従って手動で処理することができる。この後者の場合、典型的には、データを受け取ったエージェントが適当なインタフェースを介して、これをユーザに提示し、次いでオペレータが、出力エージェントに転送する前にデータを変更できるようにする。従って、これから、エージェントは、オペレータがデータ及び他の構成要素と対話できるようにするインタフェースを提供する以外の目的を果たさないことが理解できる。
【０２２２】
いずれの場合でも、サービスが行われると、データはベースステーション１又はエンドステーション３に転送され、メモリ２１又はデータベース１１に一時的に記憶され、それから次の構成要素インスタンスのためのホストとして動作するエンティティステーション５の入力ポートに転送される。しかし、一方、別の構成要素による後続する処理のために、エンティティステーション５の一つの構成要素の出力ポートに提供されたデータを別のエンティティステーション５に直接転送することもできる。
【０２２３】
このプロセス中、構成要素の仕様の形式に応じて、いくつかの異なる構成要素によって同時に、データを処理することも可能なことが理解できる。
【０２２４】
これに加えて、実際には、すべての構成要素が、実行可能なコードを最終的に形成するデータと交換されるわけではないことが理解できる。代わりに、構成要素によっては、それ自体の間でデータを交換するように動作するだけのものもある。一般に、これは、エージェントがアクティブ化され、各構成要素インスタンス間に通信が確立されてすぐに行うことができる。
【０２２５】
従って、この説明及び以上の説明から、サービスの実装の一部は、ビルドプロセスの開始の概ね直後に開始することができることが理解できる。具体的には、任意の二つのエージェントが接続し、データの交換準備が整うとすぐにこれが行われる。
【０２２６】
これとは対照的に、データを他の構成要素から受け取る必要がある構成要素は、各関連サービスの実行を開始する前にデータを待つことになる。
【０２２７】
さらに、前述した例では、通常は、ベースステーション１、エンドステーション３及びエンティティステーション５が、共通の処理システム上で効率的に相互交換可能又は実装可能である。従って、処理システム１０、１５、及びエンドステーション３は一般に、ベースステーション１、エンドステーション３、及びエンティティステーション５のそれぞれの機能を実装するアプリケーションを実行する。例えば、これによって、エンティティはエンティティステーション５を使用して、エンドステーション３に関して前述したように実行可能なコードを作成することができ、またその逆も同様である。
【０２２８】
従って、例えば、エンティティは、そのときに求められる機能に応じてエンティティステーション５として動作するものもあり、エンドステーション３として動作するものもある複数の処理システムを備える。従って、例えば、エンティティは複数の構成要素インスタンスを提供することができ、その実装は処理システムにわたって分散する。この例では、処理システムによって提供される機能は、必要に応じて、エンドステーション３及びエンティティステーション５のいずれか一方又は両方と同等である。
【０２２９】
構成要素を実装するためには、通常、サポート構造が必要である。従って、エンティティが、サービスの実装のサポート及びソフトウェアの生成を可能にするために使用される複数のエンドステーション３を含む基盤を適所に有することが一般的であることが理解できる。
【０２３０】
サービスを提供するエンティティの場合、通常、エンティティは自動化された複数のエンティティステーション５を有する。しかし、構成要素がサービスを完了することができないような例外又は他のエラーが発生する場合、エンティティステーション５は、構成要素を、個人が稼働させている別のエンティティステーション５に受け渡す又は転送する。これによって、その個人が手動のフィードバックを提供して、例外又はエラーを、可能であれば解決できるようにすることができる。可能でなければ、問題を解決することができないという指示がシステム内の別の構成要素又はエンティティに返される。従って、下位構成要素に伴う問題が発生する場合、問題の指示がまず親構成要素に返される。これは、問題を解決することができるまで、例外が連鎖を下から上に向かって渡され続ける。
【０２３１】
エージェントの性質及び動作等、以下、前述した実施態様の特徴のいくつかについてより詳細に説明する。
【０２３２】
実施態様例
前述したように、ベースステーション１により、通常は各エンティティステーション５において複数の異なるエンティティによって提供されるサービスに、複数の異なるユーザが一元的にアクセスできることが理解できる。これにより、エンティティによって提供される構成要素を、多くの異なるソフトウェアアプリケーションの作成の際に、複数回再使用することが可能になる。
【０２３３】
一例では、これは、異なるサービスにアクセスする手段をユーザに提供するフォーラムの形式である。フォーラムは、前述した例のように、一つのベースステーションを使用して実装することができる。しかし、当業者は、複数のベースステーション、エンドステーション３、エンティティステーション５又は他の任意の適した処理システムを使用して実装することも可能であり、必要に応じて、フォーラムは、ベースステーション、エンドステーション３、エンティティステーション５及び／又は他の処理システムに分散することが理解できる。フォーラムは、ユーザが構成要素を選択できるように構成要素を販売するメカニズムを提供するように動作する。
【０２３４】
従って、以下の説明はフォーラムを使用したシステムの実装に焦点を当てるが、この技術は、一つのベースステーションの使用等、任意の実施態様に等しく適用することが可能である。
【０２３５】
典型的には、使用の際に、各エンティティが各構成要素に関連する料金を定める。この料金は、フォーラムのユーザが、各構成要素インスタンスサービスの利用に対して支払うべき料金に相当する。従って、ユーザは、エンティティによって提供される一つ又は複数のサービスの提供の対価として、各エンティティに一つ又は複数の料金を支払う。
【０２３６】
これにより、エンティティは各サービスの提供に料金を課すことができ、それによってエンティティは収入を得て、各構成要素の開発に対する投資を回収することができる。同様に、これにより、特に設けられたサービスを提供して、金銭的収入を得ることによってエンティティの専門化が可能になる。
【０２３７】
これは、エンティティが通常、ソフトウェアアプリケーション全体に必要な実行可能なコードをすべて構築することによってのみ金銭的利益を得る現行のソフトウェア構築技術とは対照的である。
【０２３８】
同様に、これによって、通常、エンティティは、詳細にはあまり注意が払われない、ソフトウェアアプリケーション全体を作成しようとするのではなく、特定のサービス提供の最適化に集中することができる。
【０２３９】
フォーラムにおいて、異なるエンティティによって提供され、同様のサービスを提供する複数の構成要素へのアクセスをユーザに提供することによって、エンティティが互いに競争して同様のサービスをユーザに提供することが促される。従って、その結果生じる市場の力により、エンティティ間の競争が促進され、それによって各エンティティによる各サービスの提供の向上が促進される。
【０２４０】
具体的には、ユーザはより出来がよい構成要素を選択する傾向を有する。その結果、エンティティは構成要素レベルで互いに競争して、ますます出来のよい構成要素を提供する。これによって、エンティティは、より出来のよい構成要素が多数回実装されることになることから投資を回収しながら、特定の構成要素の実装の向上により多くの時間及び金銭を投資することが可能になる。
【０２４１】
この点において、同じサービスを提供する他の構成要素と比較して、構成要素は安価で高速であるほどできがよいと考えることができ、コードの最適化等に繋がる。
【０２４２】
これから、市場の力及び専門化レベルでの直接競争は、フォーラムを通して提供される各サービスの向上につながることを見て取ることができる。従って、階層構造内のあらゆるレベルにおける各構成要素が最適化されることになり、バグ又は他のエラーのない最適なコードの生成に繋がる。これは、競争が専門化レベルで直接行われる、工業化されたソフトウェア作成手法を表す。
【０２４３】
フォーラム内の競争を促すために、ユーザには、各アプリケーションの構築への使用には、どの構成要素が最良であるかを評価できる情報が提供される。次いでユーザは、例えば、以下のものを含む広く多種多様な要因に従って構成要素を選択できる。
・各サービスを行うエンティティ
・コスト
・各サービスを行うエンティティの所在
・構成要素の人気
・構成要素から受けとることのできる、又は出力することのできるデータ形式／タイプ
・それまでのユーザ又はフォーラムが構成要素に与える格付け
この点において、一般に、フォーラムは、ユーザが構成要素の有効性を格付けできるようにする格付けシステムを提供する。例えば、格付けは、各構成要素それぞれに発生したビルド障害の数を、ユーザにフィードバックすることによって、又はフォーラム自体による構成要素のテストによって、統計的に定めることができる。
【０２４４】
検討等の使用を通しての市場競争が存在するが、これは通常ソフトウェアコード全体に対して提供されることが理解できる。これとは対照的に、この例での検討及び格付けは構成要素レベルで行われるため、ソフトウェアアプリケーション全体ではなく個々の構成要素の改良が促進される。
【０２４５】
構成要素の出来を判定するにあたって、他の要因も使用し得ることが理解できる。
【０２４６】
いずれの場合でも、競争力を保つために、各エンティティは、洗練された効率的なサービス実装を提供することに集中し、大幅に改良されたソフトウェアの作成が可能になる。構成要素が改良されると、ソフトウェアアプリケーション全体も改良されることになる。従って、新しいソフトウェアの生成技術の開発がソフトウェアアプリケーションの急速な改良に繋がることが理解できる。
【０２４７】
フォーラムのオペレータが利益を得られるようにするために、エンティティに課される任意の料金の少なくとも一部をフォーラムのオペレータに提供して、オペレータが各構成要素の使用レベルに基づいて利益を得られるようにすることもできる。しかし、一方、加入料等を、システムを使用したい個人又はフォーラムに構成要素を提示したいエンティティに課すこともできる。
【０２４８】
従って、前述したシステムは、ソフトウェア開発プロセスを、生成されたバイナリ出力のバイトまで下げて、あらゆるレベルのバイナリコード結果において国際競争に対応できるようにする。
【０２４９】
この国際競争は急速な専門化をもたらす。そして、これは、専門化が収集されルールに変えることができる狭い領域での理解に到達するのと同様に、自動化を引き起こす。このようにして変形されると、半自動手段は、生産性を向上させるマシンに助けられて採用することができる。時間及びさらなる専門化によって、これは完全に自動化された手段に進化し得る。
【０２５０】
従って、プロセスの専門化は、競争力及び自動化の両方を得る手段を提供する。前者は市場の力に基づいてオプションとして品質の改良になり、後者は生産性を大幅に向上させる。
【０２５１】
一般に、あらゆるソフトウェア開発の努力は、顧客の見込み、要求及び要望を抽出した要件文書から始まり、バイナリプログラムという結果で終わる。従って、プロセスがどのようにして結果に到達するかは重要ではない。
【０２５２】
従って、前述したシステムは、サービスをそれぞれ提供する複数の専門家を選択し調整することによって実行可能なバイナリファイルを構築できるようにする。小屋組業者、クレーンオペレータ及び輸送請負業者のようなサービスを調整することによって家を建てるのと同様である。単純な調整で、トラスを製造し、現場に輸送し、所定位置に組み付けることができる。
【０２５３】
通常、システムは二つの主要部分であるワークステーション及びフォーラムで具体化される。この場合、多数のワークステーション及び一つのフォーラムが共に、同種のＬＡＮやインターネットでネットワーク化され、各ワークステーションは、それぞれの専門に基づいたサービスを提供可能な専門家である。サービスが実装され、テストされると、専門家はネットワーク接続を使用して、フォーラムを介してサービスを販売することができる。これは、潜在的な顧客が、適切なワークステーション及び各専門家を見つけるためにはサービスを知っていなければならないためである。
【０２５４】
フォーラムは、各ワークステーションにおける専門家が要求する全てのサービスを登録し、これらの宣伝を編成する。従って、単にフォーラムを訪れて、必要なバイナリの構築に保持しなければならない複数のサービスを通知するだけでソフトウェアを構築することができる。これが完了すると、提供されるサービスの実装に使用される各ワークステーションに連絡がとられ、それによって各種専門家に必要な作業を行わせる。
【０２５５】
形式的にカプセル化されたサービスは、構成要素と呼ばれる実装の例である。カプセル化プロセスの一環として、構成要素の表示がフォーラムに登録される。
【０２５６】
このサービス小売りネットワークにアクセスできる専門家のワークステーションを含め、あらゆるワークステーションがソフトウェアを構築することができる。ワークステーションは、小売りに向けてサービスをカプセル化し、フォーラムに登録することのできるツール及びネットワークにわたる構成要素サービスを調整することによってソフトウェアを構築することのできるツールを備えることができる。従って、適したツールを小売り及び契約によるサービスの両方に用いることにより、ワークステーションを使用してソフトウェアを作成し、他の作成に貢献することができる。
【０２５７】
好ましい例では、フォーラムは、その他のツールがより効率的に動作することのできるポータルを提供する。例えば、フォーラムを訪れたり、契約したいサービスの詳細にコンタクトするのではなく、フォーラムは、サービスの説明、サービス販売業者の所在等を完備した、問題となっているサービスを表すグラフィックシンボルを、調整ツール内から直接送ることができる。これは、名刺のように、将来のある日に必要になった場合に、販売業者を見つけるために必要な関連情報をすべて含む。
【０２５８】
フォーラムは、購入の詳細に加えて他の有用な情報を登録できるようにする。コスト及びサービス完了までの予想時間長のような情報が明らかな候補であるが、予想資源使用及びパフォーマンスのようなサービスの結果についてより関心のある情報が、構築に続くと決定する際に非常に有用である。
【０２５９】
設計者向けプログラムは、構築に考慮され、提案されるバイナリの略図を作成するのに使用される。略図は、構築チームを構成する各サービスを表すグラフィックシンボルの集まりからなる。このシンボルの集まりは、すべてのサービスが、それぞれのタスクの完了に必要な情報のソース及びそれぞれの結果を送るために必要な宛先を有するように配置され接続される。
【０２６０】
設計者向けプログラムは、オペレータがフォーラムへのポータルを開き、オペレータがそこに宣伝されている製品から選択できるようにすることによって略図を構築できるようにする。このようにして、グラフィックシンボルがフォーラムから略図にドラッグ・アンド・ドロップされ、配置され、接続される。
【０２６１】
フォーラムへのポータルも、オペレータにとって大きな助けとなるサービスについての詳細を提供する。略図が完了すると、設計者向けプログラムは、提案されたバイナリの総コスト、提案されたバイナリの構築にかかる総時間、バイナリの予想サイズ、及びバイナリの予想されるパフォーマンスを計算することができる。
【０２６２】
次いでオペレータは、構築に進むか否かを決定することができ、関連するコスト、時間等が発生する。
【０２６３】
構成要素サーバは、構成要素において具体化される小売りサービスを提供することができる。構成要素がフォーラムに登録されると、ネットワーク上のいずれのエンティティもその構成要素を購入することが可能になる。常に、オペレータはサービスを直ちに実行することが要求され、さもなくば信頼性のないサービスによって顧客を失う危険性があることを覚悟するべきである。小売りインタフェースをネットワークに提供するのは構成要素サーバである。オペレータは、サービスを実行する立場として、ワークステーション上で構成要素サーバを開始し、サービスをカプセル化した構成要素をサーバプログラムにロードする。構成要素サーバプログラムがロードされると、ネットワークからの構築要求を待つ。構築要求は、構成要素の購入注文、サービスに必要な情報源の詳細、サービスに必要な宛先の詳細、購入者詳細等を含むデータパッケージである。
【０２６４】
これより、プロセスの具体例について概説する。
【０２６５】
ユーザが、バイナリプログラムが必要であると決定する。ユーザは、ネットワーク経由で構成要素サーバ及びフォーラムに接続されたワークステーション上で設計者向けプログラムを開始する。設計者向けプログラムを使用して、ユーザは複数の構成要素の表示をフォーラムから選択し、バイナリプログラムの新しい略図にドラッグ・アンド・ドロップする。すべての構成要素が略図に入ると、構成要素は、選択された構成要素の入力及び出力の要件を満たすように接続される。次いで、略図はハードディスクドライブに保存され、構築プロセスの調整に使用される構成要素サーバが略図にアクセスする。
【０２６６】
略図が終了すると、ユーザはコスト、資源使用、スケジュール等に基づいて、構築するか否かを決定する。
【０２６７】
次いでユーザは構成要素サーバを動作させ、略図をサーバにロードする。ロードすると、構成要素サーバを構成要素の小売りに利用することが可能になる。しかし、この構成要素は、小売りを意図しないことからフォーラムに登録されないことに留意されたい。
【０２６８】
これは、「ルート構成要素」と呼ばれる特別な構成要素である。次いでユーザは、構築要求をこの構成要素サーバに発行して、本質的にこの略図のインスタンスを購入する。構成要素サーバは、構築要求を受け取ると、略図を走査して、略図中の各構成要素に対する構築要求のリストをまとめる。次いでこれらは、ネットワークを介して各構成要素サーバに発行される。各構成要素サーバも同様に、それぞれの構成要素の新しいインスタンスを作成し、それぞれの対応する略図をロードして構築要求を発行し、以下同様にして、すべてのサービスがアクティブ化されるまでサプライチェーンを下降する。
【０２６９】
こうして、ユーザの略図は、ネットワークにわたって分散した手動構成要素及び自動構成要素の集まりに分解される。各構成要素によって具体化される各サービスが完了すると、その結果は、バイナリ結果がルート構成要素サーバに返されるまで正しい親構成要素に転送され、プロセスが完了する。次いでユーザは、ビルドプロセスの結果であるバイナリプログラムを得る。
【０２７０】
これより、前述したプロセスの実施態様の一例についてさらに詳細に説明する。
【０２７１】
エージェント
前述した例では、エージェントは構成要素間の通信の唯一の形態である。エージェントは、構成要素が、具体化するサービスの完了に必要なすべての情報の提供及び収集を担当する。エージェントは一般に、機能の限定された単純な実行可能なコードから形成され、これは、構成要素サーバの一部を成す場合もあれば、構成要素サーバによって実装される場合もある。使用の際に、エージェントは、各ポートを介して他の構成要素のエージェントと通信するようになされる。通常、エージェントはより詳細に以下に説明するようにメッセージを転送することによって通信する。
【０２７２】
具体的には、エンドステーション３が購入注文をエンティティステーション５に送信する。各エンティティステーション５は、購入注文を受け取ると、新しい構成要素インスタンスを生成する構成要素サーバ及び他の構成要素のエージェントを見つけてそれに接続可能な対応するエージェントを実装する。これは前述したように、又は、例えば、接続詳細を購入注文において指定することによって、実行することができる。エージェントは他のエージェントと接続する（通信する）だけであるが、データ処理を実行する一環としてエージェントとの手動によるデータ交換が行われる場合もある。
【０２７３】
具体的には、これより一例として、エージェントＸ１及びＹ１によって接続された構成要素Ｘ及びＹを有する略図Ｐを示す図１５を参照して説明する。
【０２７４】
特定の構成要素インスタンスの特定のエージェントのアドレスを指定するために、エージェントを一意に識別できることが必要がある。従って、この例では、構成要素Ｘは、製造業者ＩＤ  ＩＤｘを有するエンティティによって作成され、構成要素Ｙは、製造業者ＩＤ  ＩＤｙを有するエンティティによって作成される。
【０２７５】
略図Ｐがレイアウトされると、構成要素Ｘ及びＹの構成要素の表示が、通常は、構成要素の仕様の一部として略図Ｐにダウンロードされ、配置され、接続される。これは、図１０Ａ〜図１０Ｅに関連して前述した方法を使用してなされる。略図が構築される際、各構成要素には、Ｕ１及びＵ２で示すように一意のラベルが与えられる。これらのラベルによって、同じタイプの構成要素が二つ以上ある略図が、その構成要素の正しいインスタンスを参照することができる。
【０２７６】
各構成要素の表示には、製造業者ＩＤ及び品番を含む構成要素の仕様が関連付けられる。構成要素の仕様はエージェントを詳述する入力及び出力の仕様を含み、例えば、厳密に各構成要素に一つずつある。
【０２７７】
略図の構築を許可する前に、エンティティＩＤｘ、ＩＤｙがユーザに課金することができるように、略図Ｐを作成しているユーザを特定しなければならない。この例では、ユーザには識別子ＩＤｐが与えられる。この情報が略図に含まれると、構築の準備が整う。
【０２７８】
略図構築処理によって、複数のエンティティが購入注文契約を結ぶことになる。従って、構築の決定により、コスト及び契約上の責務が発生する。略図におけるミスは誤った構築に繋がり、時間及び金銭を無駄にすることになる。
【０２７９】
構築を進めると想定すると、次のステップでは、略図Ｐをビルダプログラムに渡す。ビルダプログラムは、略図を解釈してまとめ、略図内の各構成要素に対する購入注文を発行する。構成要素Ｘに対する購入注文は、以下の情報を含み得る。
・ベースステーション識別子  １
・略図識別子  Ｐ
・構成要素Ｘのラベル  Ｕ１
・エンティティ識別子  ＩＤｘ
・エンティティ品番  Ｘ
・以下を含む構成要素Ｘのエージェントの接続の詳細
・エンティティ識別子ＩＤ  ｙ
・エンティティ品番  Ｙ
・構成要素Ｙのエージェント番号  Ｙ１
・ユーザの識別子  ＩＤｐ
・略図識別子  Ｐ
・Ｙの構成要素ラベル  Ｕ２
構成要素Ｙに対する購入注文も同様の情報を含む。
【０２８０】
購入されている構成要素が二つ以上のエージェントを有する場合は、各エージェントが、各エージェントのターゲットを指定する別個の接続の詳細を購入注文に含めなければならない。
【０２８１】
ＩＤｘのエンティティは、ＩＤｐのユーザから購入注文を受け取ると、構成要素サーバを使用して構成要素のインスタンスを作成する。この点において、各エージェントに関連するコードを実行することによって、エージェントが作成される。
【０２８２】
購入注文の提供後、ここで構成要素Ｘの各インスタンスは、エージェントＸ１がエージェントＹ１と通信するために必要な情報を有している。
【０２８３】
基本的な例では、エージェントが一つのイベントトランザクションのみを実行するようになされる場合、唯一の通信方式は、エージェントの一つ、この例ではエージェントＸ１とのものであり、それによってヘッダ及びペイロードを含むメッセージを生成する。ヘッダは、メッセージをエージェントＹ１に転送するために必要なルーティング情報を指定し、ペイロードは転送される様々なデータを含む。
【０２８４】
メッセージはエージェントＹ１に転送され、エージェントＹ１はメッセージを受け取り、ペイロードからデータを抽出する。タスクが完了すると、エージェントを終了することができる。
【０２８５】
しかし一方、トランザクションは多重イベントトランザクションである場合、エージェントは、ネゴシエーションの実行等、複数のトランザクションを接続し実行するように動作する。この場合、エージェントの一つが、前述と同様にヘッダ及びペイロードを含むメッセージを生成する。この場合、メッセージの目的は通信を確立するためであるため、その性質は重要ではないが、互いにエージェントを認証するために使用される情報を含む。
【０２８６】
いずれの場合でも、通信が確立されると、必要に応じて複数のメッセージがエージェント間で転送され、例えば、エージェントネゴシエーションを行うことができる。
【０２８７】
従って、例えば、エージェントが図１６に示すデータタイプを取り扱うようになされる場合、エージェントＸ１は整数ＩＮＴ、文字ＣＨＡＲ及び浮動小数点数ＦＬＯＡＴを取り扱うことができ、エージェントＹ１は、二つの入力ＤＯＵＢＬＥ、浮動小数点数ＦＬＯＡＴ及び日付ＤＡＴＥを取り扱うことができる。従って、エージェントは、構成要素Ｘが浮動小数点数ＦＬＯＡＴの形態で出力を提供しなければならないと決定する。
【０２８８】
以上より、エージェントは構成要素間通信の唯一の形式であることが理解できる。その結果、エージェントは通信ネットワーク２、４を介して通信可能できなければならない。
【０２８９】
エージェントはそれ自体単純であるが、バンドリング及び受け渡しと呼ばれるプロセスによって、エージェントは複雑な振る舞い及び強力な情報提供・収集能力を示すことができる。
【０２９０】
受け渡しメカニズムは、エージェントからエージェントへのあるトランザクションを終了させ、別のトランザクションを開く。これは、構成要素が下位構成要素のエージェントを、まるで構成要素自体のエージェントであるかのように使用している場合に最も有用である。動作例は受け渡し手続きの明確化に役立ち、下位構成要素への受け渡しの一例を提示する。
【０２９１】
バンドリングは、特定の目的によって関連する複数のエージェントを一つの単純なエージェントとして取り扱えるようにする再帰的メカニズムである。動作例はバンドリング及びバンドリング解除メカニズムの明確化に役立ち、構成要素のバンドリング及びバンドリング解除の一例を提示する。
【０２９２】
構成要素サーバ
構成要素サーバは、エンティティステーション５に設けられ、エンティティステーションが構成要素を実装できるようにするソフトウェアアプリケーションである。具体的には、構成要素サーバは、エンドステーション３によって生成された購入注文を受け取り、次いで購入注文を使用して、適当なエージェントと共に、新しい構成要素インスタンスを作成するようになされる。
【０２９３】
これが完了すると、ローカル構成要素サーバが、以下エージェント表示と呼ばれるプロセスにおいて、構成要素に関連するエージェントをアクティブ化する。定義上、すべてのエージェントは、別の遠隔構成要素に関連する別のエージェントに接続される。エージェントが表示されれると、遠隔構成要素サーバで動作している相手方との対話に利用できるようになる。
【０２９４】
これより、構成要素ＣＰを表す図１７Ａを参照して、一つの例について説明する。具体的には、構成要素ＣＰは３つの下位構成要素Ａ、Ｂ及びＣから形成され、４つのエージェントＷ、Ｘ、Ｙ及びＺが提供される。
【０２９５】
構成要素サーバは、エンドステーション３から購入注文を受け取ると、各ビルドプロセスにおいてサービスを実行するための構成要素インスタンスの構築を開始する。
【０２９６】
これを実現するために、構成要素サーバは、以下の動作をする。
・図１７Ｂに示すように、購入注文ＰＯを、各構成要素Ａ、Ｂ及びＣに関連するサービスを供給するエンティティに提出し、
・各下位構成要素Ａ、Ｂ及びＣに必要なデータを提供して、定義されるサービスを各下位構成要素が行えるようにし、
・下位構成要素エージェントアドレスを供給して、これらのエージェントが終了すると、構成要素Ａ、Ｂ及びＣを組み付けられるようにする
ように動作する。
【０２９７】
一般に、構成要素サーバは、様々な組み付け段階に多くの構成要素を含むが、以下の説明では、一つの構成要素に対してのみ動作する。
【０２９８】
具体的には、構成要素サーバはエージェントＷ、Ｘ、Ｙ、Ｚを提示して、略図によって要求されるように、これらが他の構成要素のエージェントと通信できるようにする。これに加えて、構成要素ＣＰは下位構成要素Ａ、Ｂ及びＣを備えるため、複数の内部対話も解決しなければならない。
【０２９９】
一般に、構成要素ＣＰのユーザは、構成要素ＣＰが複数の下位構成要素Ａ、Ｂ、Ｃから形成されることに気付かない。従って、ユーザは、構成要素Ａ、Ｂ、Ｃ間で行う必要がある対話の詳細を提供する必要はなく、これは構成要素ＣＰを提供するエンティティによって決定される。従って、構成要素サーバは、構成要素Ａ、Ｂ及びＣに注文を出すときに、構成要素Ａ、Ｂ、Ｃの間で必要な対話の詳細も提供する。
【０３００】
構成要素サーバは、図１７Ｃに示すような一時的エージェントＴ１、Ｔ２、Ｔ３及びＴ４も提示して、構成要素ＣＰの内部エージェントと下位構成要素Ａ、Ｂ及びＣとの間のインタフェースを提供する。これら一時的内部エージェントＴ１、Ｔ２、Ｔ３及びＴ４は、図１７Ｃに示すような外部エージェントＷ、Ｘ、Ｙ、Ｚと共に提示され、それにより、解決し接続する機会を有したすべてのエージェントに、構成要素が実装できる。
【０３０１】
受け渡し
エージェントが静的に接続することに加えて、エージェント受け渡しメカニズムも存在する。エージェント受け渡しメカニズムによって、エージェントとエージェントとの接続を終了させ、エージェントの一つをさらに別のエージェントに再接続することができる。
【０３０２】
この振る舞いは、複数のエージェントを一つのエージェントとして管理する手段を提供する。これは、構成要素がいくつかの単純な情報トランザクションを行い、次いでエージェントを別の構成要素に受け渡し、てさらにネゴシエートすることによって実現される。これら単純なトランザクションだけで、複雑なトランザクション全体を、見かけは一つの構成要素として実行することができる。
【０３０３】
具体的には、受け渡しは、入念に手作業で構成された下位構成要素又は処理で内部構成されたサービスを、構成要素が提示できるようにする。従って、構成要素が複数のエージェントに見え、所定のサービスを実行するように見える。しかし、実際には、サービスは、それぞれのエージェントの少なくともいくつかを親エージェントからの受け渡しによって満たされる多くの下位構成要素によって供給される。これを実現するために、まず、親のエージェントは、ある外部構成要素に接続し、次いで、そのエージェントの他端を下位構成要素に接続するように命令しなければならない。
【０３０４】
受け渡しメカニズムを一通り実行することによって、受け渡しプロセスに関わるステップを示す。
【０３０５】
図１８Ａは、受け渡しを含む略図を示す。図１８Ａでは、構成要素Ｃ１のエージェントＡ１及び構成要素Ｃ２のエージェントＡ２は通常通り接続されるが、Ｃ２は図１８Ｂに示すような下位構成要素Ｃ３を有する。
【０３０６】
構成要素Ｃ２は、図１８Ｃに示すように、エージェントＡ１を下位構成要素Ｃ３のエージェントＡ３に受け渡すことを意図する。
【０３０７】
エージェントプロトコルを単純化するために、各エージェントが一度に他の一つのエージェントにしか接続されないものと仮定する。従って、エージェントＡ２は、エージェントＡ１及びＡ３に同時に接続することはできない。エージェントＡ２がエージェントＡ１に接続されると、エージェントＡ２の詳細を、構成要素Ｃ３を生成させる購入注文に含めることができない。構成要素Ｃ３を構築できるようにし、かつエージェントＡ３へのアクセスを得られるようにするために、図１８Ｄに示すような一時的エージェントＡ２ｂが作成される。
【０３０８】
エージェントＡ２ｂの詳細を購入注文に含めて、構成要素Ｃ３を構築し、エージェントＡ３を、構成要素Ｃ２が構成要素Ｃ３と通信する手段を提供するエージェントＡ２ｂに接続できるようにする。エージェントＡ１がエージェントＡ２に接続され、エージェントＡ２ｂがエージェントＡ３に接続されていると、構成要素Ｃ２は、エージェントＡ２及びＡ２ｂに終了を命令し、エージェントＡ１をエージェントＡ３に再接続させることができる。
【０３０９】
従って、構成要素Ｃ２はローカルエージェントＡ２及びＡ２ｂを使用して、受け渡し順序をエージェントＡ１及びＡ３のそれぞれに通信し、エージェントＡ１及びＡ３は図１８Ｅに示すように接続されることになる。一般的に、これは、エージェントにＡ１及びＡ３の識別子を交換させ、直接接続できるようにすることによって実現される。
【０３１０】
これより、構成要素から構成要素に渡す受け渡しメカニズムの一例について、図１９を参照して説明する。具体的には、この例では、略図は３つの構成要素Ａ、Ｂ、Ｃを含み、各構成要素は各エージェントＡ１、Ｂ１、Ｂ２、Ｃ１、Ｃ２を有する。
【０３１１】
この例では、エージェントＡ１はエージェントＢ１のアドレスを略図の購入注文から得る。同様に、エージェントＢ１もエージェントＡ１のアドレスを略図の購入注文から得る。前述したエージェント接続メカニズムを利用して、エージェントＡ１及びＢ１を接続し認証する。
【０３１２】
エージェントＡ１及びＢ１はそれぞれの情報を転送し、これによってエージェントＢ１はエージェントＡ１をエージェントＣ１に受け渡すことを決定する。構成要素Ｂは、エージェントＢ２をエージェントＣ２と通信させることによって、エージェントＣ１のエージェントアドレスを得る。次いでエージェントＢ１は構成要素Ａへの認証済みリンクを使用し、エージェントＣ１のエージェントアドレスと共に受け渡し要求を送る。
【０３１３】
エージェントＡ１は単に、エージェントＢ１から接続解除し、エージェントＣ１に接続する。エージェントＣ１がその他との接続で通信中の場合。エージェントＡ１はエージェントＣ１が空くのを待つ。同様に、構成要素ＢもエージェントＡ１のアドレスを得て、これをエージェントＣ１に転送し、エージェントＣ１がエージェントＡ１に再接続できるようにする。従って、エージェントＡ１とＢ１との間の接続が、エージェントＢ２とＣ２との間の接続に矢印で示すように受け渡され、図に示すようにエージェントＡ１とＣ１の間が接続されることになる。
【０３１４】
前述したように、エージェントは、手動でのネゴシエーション及びデータ転送を、例えばチャット又は電子メールの類のインタフェースを通して可能にする「ダム」インタフェースに過ぎない。
【０３１５】
受け渡しは、一つのイベントトランザクションシステムでは、メッセージを単純に後続エージェントに転送することができるため、絶対に必要なものではないことが理解できる。
【０３１６】
エージェントの組み合わせ
前述したように、各エージェントは、通常、別の構成要素に関連する他の一つのエージェントと対話する。一般に、構成要素は多くの入力及び出力を含み、従って多くのエージェントを有し得る。仮に、個人が略図作成時に各構成要素の各エージェント間の接続を定義する必要があるならば、多数の関連接続を行うべき状況での作業は繁雑になる。
【０３１７】
従って、典型的には、関連するエージェントを組み合わせ、それによって一つの接続を定義する。これは、複雑なペイロード及び／又はバンドリングを使用して実現することができる。
【０３１８】
複雑なペイロードは、各エージェントからのペイロードが組み合わせられて一つのペイロードになる場合に形成される。この場合、下位構成要素Ａ、Ｂ、Ｃを有する構成要素Ｐは、構成要素Ａ、Ｂ、Ｃのエージェントの各ペイロードを連結したもの又は他の様式での組み合わせに相当する一つのペイロードを提供する一つの外部エージェントを有する。この場合、一つのエージェントを、下位構成要素Ｄ、Ｅ、Ｆを有する構成要素Ｑに見せることができる。この場合、下位構成要素Ｄ、Ｅ、Ｆがデータと対話するためには、構成要素Ｑが複雑なペイロードを分解して、個々のペイロードのそれぞれを形成できるようにする必要があり、次いで各ペイロードを、構成要素Ｄ、Ｅ、Ｆのエージェントに提供することができる。
【０３１９】
バンドリングの場合、エージェントは、二つ以上のエージェントが事実上、一つのエージェントとして取り扱われるようなバンドルされた構成要素を使用することによって組み合わせられる。次に、バンドリングを解除する構成要素が使用されて、必要に応じて構成要素のバンドルを分解する。次いでこれは、実際にはいずれの対話にも関与しないエージェントが、前述したように他のエージェントに対話要求を転送することができるように、エージェントの受け渡しを実施できるようにする。
【０３２０】
これにより、ユーザに単純な一つのエージェントとして見せながら、複雑な対話が複数の構成要素間で可能になる。
【０３２１】
バンドリング
多くの場合、構成要素は複数のエージェントが特定のタスクのために情報を解決する必要がある。これらエージェントは時に関連する場合があるため、エージェントをグループ化してバンドルにして複雑性を隠し、そのようにして一つのエージェントのようにバンドルを取り扱うことは理にかなっている。これは略図を大幅に簡易化し、エラーを低減させる。
【０３２２】
従って、バンドリングの目的は、エージェントをより効率的に管理することである。バンドリングは、絶対に必要なものではないが、関連するエージェントを、それぞれの関係が保たれるように互いに結び付けられるようにし、多数のエージェントの管理をより容易な作業にする。
【０３２３】
特別な構成要素がバンドラ／バンドリング解除サービスを提供し、以下、これらを一般化して、バンドラと呼ぶ。この例では、バンドラは３つのエージェント、すなわち二つの「入力」及び一つの「出力」を有し、バンドルを解除するように動作するバンドラ（「デバンドラ」と呼ぶことができる）は、二つの「出力」及び一つの「入力」を有する。出力及び入力という語は、バンドラ及びデバンドラがほぼ同じタスクを実行することから対を成すものである。出力及び入力は両方とも、一対のエージェントのアドレスを収集し、第３のエージェントを通じて送るが、バンドラは通信を開始するものであり、従って、まずアドレスを収集し、一対のエージェントを入力にし、一つのエージェントを出力にする。デバンドラが入力を通じてアドレスを受け取ると、すぐに、役割が逆になる。バンドラ及びデバンドラは、エージェント情報を交換すると、接続された構成要素を互いに受け渡して役割を終える。これら接続された構成要素のいずれかがバンドラ又はデバンドラである場合、プロセスは再び開始される。
【０３２４】
図２０Ａは、バンドルエージェントＢＵ１、ＢＵ２、ＢＵ３を提供するバンドル構成要素ＢＵＮＤＬＥを通して接続された各構成要素Ａ、Ｂからの二つのエージェントＡ１、Ｂ１を表す。バンドルエージェントＢＵ３は、構成要素Ｘへの接続に使用される。バンドルエージェントＢＵ１、ＢＵ２、ＢＵ３は通常のエージェントと区別がつかない。
【０３２５】
使用の際に、図２０Ａに示す構成要素ＢＵＮＤＬＥは、接続をエージェントＡ１、Ｂ１から受け取り、エージェントＢＵ３を提示する。エージェントＢＵ３の役割は、エージェントＡ１、Ｂ１のアドレスを構成要素Ｘに提供することである。
【０３２６】
図２０Ａに示す例では、構成要素Ａ、Ｂ、Ｘは、エージェントＢＵ１、ＢＵ２及びＢＵ３それぞれのアドレスを略図の購入注文から受け取る。同様に、バンドル構成要素ＢＵＮＤＬＥも、エージェントアドレスＡ１、Ｂ１及びＸ１を各略図の購入注文から得る。エージェントＡ１、ＢＵ１は接続して認証し、エージェントＢ１及びＢＵ２ならびにＸ１及びＢＵ３も同じことをする。構成要素Ｘは構成要素ＢＵＮＤＬＥとネゴシエートし、エージェントＢＵ３のペイロードがバンドルを表すと決定する。
【０３２７】
従って、前述した受け渡しメカニズムを使用することによって、構成要素ＸはエージェントＡ１、Ｂ１のアドレスを決定し、バンドル構成要素ＢＵＮＤＬＥに、図２０Ｂに示すようにＡ１、Ｂ１を受け渡すように命令することができる。従って、図２０Ｂでは、構成要素ＸはエージェントＢＵ３を通してエージェントＡ１、Ｂ１を知る。次いで構成要素Ｘは、エージェントＢＵ３を介してバンドル構成要素ＢＵＮＤＬＥに、エージェントＡ１、Ｂ１をエージェントＸ１及びＸ２にそれぞれ受け渡すように命令する。次いでバンドル構成要素及び各エージェントはサービスを完了し、役割を終える。
【０３２８】
図２１に示すバンドリング構成要素ＢＵＮＤＬＥは、エージェントＡ１、Ｂ１の性質に関わりがない。バンドリング構成要素に関する限り、エージェントは任意の二つのエージェントであり、それぞれのペイロードは関係がない。これにより、図２１に示すようなバンドリング構成要素の連結が可能になる。任意の数のバンドリング構成要素を連結することができる。
【０３２９】
エージェントをバンドリングするバンドル構成要素を提供することに加えて、デバンドリング構成要素は逆の機能を実行するために提供される。
【０３３０】
この一例を図２２に示す。図２２では、図に示すように、構成要素Ａがデバンドリング構成要素ＤＥＢＵＮＤＬＥに接続し、そしてデバンドリング構成要素は二つの構成要素Ｘ、Ｙと接続する。この例では、デバンドリングプロセスは、構成要素エージェントＡ１とＤＢＵ１、ＤＢＵ３とＸ１、並びにＤＢＵ２とＹ１が購入注文に指定されるように接続し認証することから始まる。
【０３３１】
次いでデバンドリング構成要素は、バンドルによって表された二つのエージェントのアドレスを知る。次いで、Ｘ１及びＹ１に、エージェントＡ１が提供したアドレスに従って受け渡しを行うように要求する。この点で、デバンドリングエージェントはサービスを完了し、役割を終える。
【０３３２】
構成要素のバンドル及びバンドル解除を使用して、バンドルに対して複数の有用な演算を行うことができる。例えば、エージェントａ、ｂをバンドルから抽出し、エージェントａ、ｂを逆の順序にしてバンドルを再び組み立てることによって、エージェントａ、ｂをバンドル内で並び替えることができる。さらに、選択的デバンドリングを利用して、図２３に示すように、バンドルから所望のエージェントを抽出することができる。
【０３３３】
この例では、エージェントａ、ｂ、ｃ、ｄのバンドル内の各エージェントｃをバンドルから切り離す必要がある。これは、関心のあるエージェントが利用可能になるまで、デバンドル構成要素Ｕを使用してバンドルをバンドリング解除し、次いでバンドリング構成要素Ｂを使用して、バンドルを再びバンドリングすることによって実現される。
【０３３４】
階層バンドリング
例えば、典型的には、エージェントバンドルが最大で１００を越える多数のエージェントを含むことがある。バンドリング／バンドリング解除プロセスの効率を向上させるために、エージェントバンドルを階層的に配置することはよくある。そして、アクセスされる機会が多いエージェント又はエージェントのバンドルは、より容易にアクセスできるようになる。
【０３３５】
線形、動的階層又は用途を反映した構造等の複数の異なる階層構造を使用することができる。バンドルは、例えば図２４Ａに示すような階層ツリー状に配置することができる。
【０３３６】
これはバンドルの一例の構造を示す。具体的には、この例では、バンドルＢは、図に示すように、配置されたエージェントＡ1〜Ａ12を含む。従って、エージェントＡ1〜Ａ12のいくつかは、それ自体バンドルＢに含まれるバンドルＢ1〜Ｂ8を使用して配置される。従って、構成要素がエージェントＡ1との対話を要求する場合、バンドルを第１のレベルで解除して、エージェントＡ1へのアクセスを提供することができる。この場合、デバンドル構成要素を使用して、バンドルＢを第１の階層レベルまで下げて分解し、エージェントＡ1を抽出し、これを各エージェントに必要に応じて提供することができる。この時点で、バンドルＢ1及びＢ2も通常、バンドルＢから抽出される。この一例を図２４Ｂに示す。
【０３３７】
この例では、図に示すように、下位構成要素１００１、１００２及び１００３を有する構成要素１０００が提供される。使用の際に、構成要素１００２は、バンドルＢ内のエージェントＡ1によって提供されるペイロードに対して動作するようになされている。従って、使用の際に、構成要素１０００はエージェント１００４においてバンドルＢを受け取るように動作し、エージェント１００４はバンドルをエージェント１００５に転送するように動作する。これは通常、単純にバンドルＢをエージェント１００５に受け渡すエージェント１００４との受け渡しメカニズムによって実現される。
【０３３８】
いずれの場合でも、構成要素１００１は、階層の第１のレベルまでバンドルＢをバンドル解除するように動作するデバンドル構成要素である。次いでエージェントＡ1は、エージェント１００６を介して出力され、バンドルＢ1、Ｂ2はエージェント１００７、１００８を介してそれぞれ出力される。エージェントＡ1はエージェント１００９に転送され、構成要素１００２はエージェントＡ1のペイロードを受け取り、必要に応じて任意のデータ処理を提供することができる。次いで、エージェント１０１０を介して出力を提供することができる。
【０３３９】
これが、バンドル内の特定のエージェントと対話するために必要なすべてであることが理解できる。従って、バンドルＢ1及びＢ2自体を、さらなる処理のために他の構成要素に転送することができる。同様に、エージェントＡ1も、ここでその目的を遂げることができる。さらなる使用がバンドルによるものか、バンドルから抽出された任意のエージェントによるものかは、バンドリングプロセスにとって本質的なものではない。
【０３４０】
しかし、例示のみを目的として、この例では、構成要素１０００は、変更されたバンドルＢ'を出力エージェント１０１５に提供するようになされる。
【０３４１】
従って、この例では、エージェント１０１０に提供される出力は、エージェントＡ1から変更したペイロードＡ1'を含むことができる。次いで、エージェントＡ1'は、バンドルＢ1、Ｂ2と共に、エージェント１０１１、１０１２、１０１３を介してそれぞれ構成要素１００３に転送される。図に示すように、構成要素１００３は、この時点で変更されている、Ｂ'で示すバンドルＢを再びバンドリングし、エージェント１０１４を介してこれを出力エージェント１０１５に提供するように動作する。
【０３４２】
従って、構成要素１０００は、エージェントＡ1のペイロードを変更できるようにする。変更されたエージェントＡ1'をバンドルＢ'に再びバンドリングする必要はなく、代わりに、エージェントを必要に応じて、単にバンドルから抽出して使用できることが理解できる。
【０３４３】
図２４Ｃは、構成要素１０００の変更を示す。構成要素１０００の中で、追加の構成要素１０２０がエージェントＡ２のペイロードとの追加の対話を提供する。これを実現するために、追加のデバンドル構成要素１０２１及びバンドル構成要素１０２２が図に示すように使用される。
【０３４４】
この機能は前述したものと同様であるため、これ以上詳細に説明しなくても理解できる。
【０３４５】
バンドルの受け渡し
前述したように、エージェントの受け渡しは、対話に明示的に関わらないエージェントが責任を他の下位構成要素に渡せるようにするために行われる。
【０３４６】
正しくエージェントの受け渡しを行うためには、受け渡しを所定の順序に従って行う必要がある。これは、バンドルが関わる場合に特に重要である。
【０３４７】
この一例について、図２５Ａ〜図２５Ｅを参照して説明する。具体的には、図２５Ａは、３つの下位構成要素１１０１、１１０３、１１０５を含む構成要素１１００を含む略図を示し、下位構成要素１１０１、１１０３、１１０５は、エージェント１１０８、１１０９、１１１０を介してバンドル構成要素１１０７に接続するようになされた各エージェント１１０２、１１０４、１１０６をそれぞれ有する。バンドル構成要素１１０７は、親構成要素１１００のエージェント１１１２に接続するようになされたエージェント１１１１を含む。同様に、図に示すように同様の略図を含む構成要素１１２０も提供される。
【０３４８】
この図では、エージェント間の接続はまだ実装されていないため、点線として示される。
【０３４９】
最初に、図２５Ｂに示すように、略図がまず構築され、各構成得要素インスタンス及び対応するエージェントが生成されると、エージェントは図２５Ｂに示すように接続するように動作する。従って、最初に、エージェント１１０２、１１０４、１１０６がエージェント１１０８、１１０９、１１１０に接続し、エージェント１１１２がエージェント１１３２に接続する。
【０３５０】
エージェント１１１２及び１１３２はネゴシエートし、プロセスにおいてそれ以上役割を果たす必要がないと決定する。具体的には、エージェント１１１１、１１３１を受け渡すことができると決定する。これを実現するために、エージェント１１１１、１１３１はエージェント１１１１、１１３１のアドレスを交換する必要がある。各エージェントは他の一つのエージェントとしか接続することができないため、これは、各エージェント１１１２、１１３２に関連する一時的エージェントを作成することによって実現される。これは、図２５Ｂにおいてエージェント１１１２、１１３２内の点線で表される。
【０３５１】
この場合、エージェント及び関連する一時的エージェントは内部エージェント及び外部エージェントと呼ばれる。エージェント１１１２の場合、内部エージェントはエージェント１１１１に接続され、外部エージェントは１１３２の外部エージェントに接続される。
【０３５２】
各内部エージェント１１１２、１１３２は、各エージェント１１１１、１１３１のアドレスを決定する。次いでアドレスは外部エージェント１１１２、１１３２の間で転送され、必要に応じてエージェント１１１１及び１１３１に転送される。エージェント１１１１、１１３１は、互いのアドレスを得ると、直接通信することができ、これらエージェントは互いに直接ネゴシエートできるようになる。次いでエージェント１１１２、１１３２は、図２５Ｃに示すように、役割を終える。
【０３５３】
この例では、エージェント１１１１及び１１３１がネゴシエーションを行うと、構成要素１１０７、１１２７がこの時点でそれぞれのサービスを実行できるようになる。具体的には、バンドル及びデバンドル構成要素が対応する入力及び出力を有するため、この時点でさらなる受け渡しが実行可能であることが決定される。
【０３５４】
従って、エージェント１１０８、１１０９、１１１０のアドレスはバンドルに含められ、バンドルがエージェント１１１１からエージェント１１３１に転送される。これはバンドルが解除され、エージェント１１０８、１１０９、１１１０のアドレスはエージェント１１２８、１１２９、１１３０にそれぞれ転送される。同様のプロセスが逆方向でも行われる。エージェンのトアドレスが転送されると、接続をエージェント１１０８、１１０９、１１１０とエージェント１１２８、１１２９、１１３０との間に形成する必要がある。これを実現するために、図２５Ｄに示すように、外部エージェント１１０８、１１０９、１１１０がエージェント１１０２、１１０４、１１０６に接続され、内部エージェント１１０８、１１０９、１１１０が内部エージェント１１２８、１１２９、１１３０に接続されるように、一時的エージェントを前述したように生成する必要がある。このポイントで、エージェント１１１１及び１１３１は役割を終えることができる。
【０３５５】
これが完了すると、エージェント１１０８と１１２８、１１０９と１１２９、並びに１１１０と１１３０はネゴシエションを行い、エージェント１１０２と１１２２、１１０４と１１２４、並びに１１０６と１１２６のアドレスは、前述した様式と同様にして交換することができるようになる。従って、例えば、エージェント１１０２のアドレスが外部エージェント１１０８によって決定され、内部エージェント１１２８に転送され、次いで内部エージェント１１２８を介してエージェント１１２２に転送される。これが完了すると、受け渡しを行うことができ、図２５Ｅに示すように、エージェント１１０８、１１０９、１１１０、１１２８、１１２９、１１３０が役割を終え、エージェント１１０２、１１０４、１１０６はエージェント１１２２、１１２４、１１２６と直接通信する。また、このとき、構成要素１１０７及び１１２７も役割を終えることができる。
【０３５６】
受け渡しによって、エージェントに必要とされる対話が減少することが理解できる。さらに、バンドリングと併せて実装される場合に、多くのエージェントに対応するバンドル全体の受け渡しが可能である。これによって、計算負荷及びオペレータの複雑さが単純化された略図により軽減する。
【０３５７】
チェーニング
ビルドプロセスの実装においてさらなる有用な技術は、チェーニングとして知られる技術である。
【０３５８】
具体的には、チェーニングは、エージェント又はエージェントバンドルが、前述と同様に、必要に応じてペイロードを変更することができる略図を通して、エージェント又はより一般的にはエージェントのバンドルを転送することによって動作する。これに加えて、チェーニングは、略図又はその一部を分割せずに渡すことを意図する。これにより、システムを通してペイロードの変更を渡し、必要に応じて返すことができる。
【０３５９】
これより、チェーニングの一例を図２６Ａ〜図２６Ｇに示す例に関連して説明する。
【０３６０】
図２６Ａに示すように、各入力エージェント１１５２、１１５５、１１５８及び各出力エージェント１１５３、１１５６、１１５９をそれぞれ有する３つの構成要素１１５１、１１５４、１１５７が、図に示すようにエージェント１１６０、１１６１に接続される。構成要素は、実行可能なコードを生産し、コードの断片をビルドバンドルに挿入するように動作する。
【０３６１】
具体的には、エージェント１１６０がヘッダファイルをエージェント１１５１に提供する。これは通常、エージェントペイロードの形態で提供される。構成要素１１５０は、ヘッダファイルを受け取ると、コードをヘッダファイルの末尾に添付し、エージェント１１５３、１１５５を介して構成要素１１５４に転送する。ここでも、これは通常、エージェントペイロードの形態である。
【０３６２】
いずれの場合でも、構成要素１１５４はヘッダファイルに添付された実行可能なコードの断片を受け取り、自分の実行可能なコードの断片を添付する。これに代えて又はこれに加えて、構成要素１１５４は、構成要素１１５０が提供したコードの断片を変更することができる。いずれの場合でも、添付されたコードの断片を含むヘッダファイルは構成要素１１５７に転送され、さらなるコードの断片も同様にして追加される。プロセスは、必要なコードの断片がすべてヘッダファイルに追加されるまで続けられ、結果として得られる実行可能なコードがエージェント１１６１に供給される。
【０３６３】
ヘッダファイル及び添付されるコードの断片の構造の一例を図２６Ｂに概略的に示す。参照番号は各コード部分を生成する構成要素を示す。
【０３６４】
ターゲット構築サイトのＲＡＭの割り当て、プロセッサレジスタの割り当て、物理アドレスの詳細及び一般的な広域の詳細等、実行可能プログラムを実際に構築するには、はるかに多くの詳細が必要であることが理解できる。
【０３６５】
上記データをすべて供給するためには、最初の例において説明した単純な一つのエージェントの接続を、追加のエージェント及び実際には追加の構成要素を包含するように拡張する必要がある。４組のエージェントがいくつかの分割されないチェーニングを形成し、各構成要素が順にコードを追加し、メモリを割り当て、ＣＰＵレジスタ等を保持又は解放することができる図２６Ｃに示す例を考える。この場合、ファイルヘッダが一つの構成要素１０６３から受け取られ、一つの構成要素１０６３に返される。全てのエージェントが全ての構成要素のために相互に接続することは時間がかかり、略図を扱いにくくすることが理解できる。
【０３６６】
例では、各構成要素１１５１、１５５４、１１５７が複数の入力エージェント及び複数の出力エージェントを有する。これらは、一つのエージェントで置き換えることができるため、各構成要素は、一つのエージェントを使用してコード構築又はメモリ割り当てに関わるチェーニングにアクセスすることができる。
【０３６７】
次いで、これら関連するエージェントをすべて、前述したように組み合わせて一つのビルドバンドルにすることができ、それにより、一つの単純なエージェントを提示しながら、別個のエージェントの機能を保持することができる。従って、図２６Ｃに示す略図は、図２６Ｄに示す略図で置き換えることができる。この場合、構成要素１１６４、１１６５はエージェントを連結するように設計されたＣＡＴ構成要素であり、構成要素１１６３はコード構築に使用される構成要素である。従って、Ｌｉｎｕｘ（登録商標、以下同じ）ベースのシステムと併用する実行可能ファイルを構築する場合、これはＥＬＦ  ＩＮＩＴ構成要素の形態であることが得き、これについて付録Ａにおいて詳細に説明している。
【０３６８】
構成要素をさらに追加して、構成要素１１５１、１１５４、１１５７内部の処理を単純化することができる。こういった追加の構成要素は事実上、構成要素１１５１、１１５４、１１５７及び他のすべての構成要素をビルドバンドルの詳細から隠す。この一例は、構成要素が受け取ったバンドルを解除することができる、前述したビルドバンドルによって提供される。この一例を図２６Ｅに示す。構成要素１１６６はビルド構成要素であり、ビルドバンドルをエージェント１１６７において受け取っており、各バンドル又はエージェントをエージェント１１６８、１１６９、１１７０に提示する。
【０３６９】
各構成要素１１５１、１１５４、１１５７は各ビルド下位構成要素を含むことができ、この場合、ファイルヘッダもこれら構成要素に渡さなければならないことが理解できる。
【０３７０】
従って、例えば、ＥＬＦ  ＩＮＩＴ構成要素１１６３は、ヘッダをチェーンの一番上に供給し、チェーン状に接続された各構成要素が、実行可能なコードが構築されるまでそれぞれのコードを添付（ある適した構成要素を使用して）できるようにすることによって処理を開始することができる。一方、ＥＬＦ  ＩＮＩＴ構成要素１１６３は、チェーニングの結果を待ち、動作可能システムが必要に応じてＥＬＦ実行可能形式を形成するヘッダを先頭に付加することができる。
【０３７１】
結果は、切れ目のなく接続された下位構成要素の構成要素のツリーである。
【０３７２】
任意の長さのチェーンは、複雑性を隠しながら容易に構築することができる。いずれの場合でも、これにより、ビルド構成要素の供給者は、さらに複雑な構築サイトを調整するために、必要に応じてビルドバンドルを何百又は何千ものエージェントに拡張することができる。
【０３７３】
前述した機能に加えて、構成要素は、ビルドバンドルの部分を別の構成要素に出力（エクスポート）して、コードを関連セクションに挿入することができる。
【０３７４】
この一例を図２６Ｆに示す。具体的には、このシステムは、各実行可能なコードの断片を生成するようになされた３つの構成要素１２００、１２０１、１２０２を含む。この例では、構成要素１２００、１２０２は、これもまたコードの断片を生成するようになされた各下位構成要素１２０３、１２０４、１２０５、１２０６、１２０７を含む。これら構成要素１２００、・・・、１２０７は、複数のビルドＣＡＴ構成要素１２０８、１２０９、１２１０、１２１１を介してＥＬＦ  ＩＮＩＴ構成要素１２１２に接続される。使用の際に、ヘッダファイルが順に構成要素１２００に、その後構成要素１２０３、１２０４、１２０２に渡され、それから構成要素１２０１に、その後構成要素１２０５、１２０６、１２０７に渡される。
【０３７５】
従って、これによって、ヘッダファイルに図２６Ｇに示すようなコードの断片が添付される。
【０３７６】
この例では、構成要素１２００と構成要素１２０２の間のリンクが動的に作成される場合、構築時にリンクを作成することによって、ツリー構造をメッシュ構造に変換することができる。
【０３７７】
これは、例えば、データを指定された所定の場所に出力するために使用することができる。しかし、出力を提供するためには、構成要素が所定のメモリロケーション等を得ている、又はデータをバンドルに挿入してルート構成要素に転送可能とする必要があり得る。この場合、通常、ルート構成要素はバンドルを生成して構成要素の出力に転送される。次いで、これは各下位構成要素の出力に転送され、各下位構成要素は出力を生成してルートサーバに転送する。
【０３７８】
このメカニズムによって、データを生成し、ルートサーバの所望のメモリロケーションに構築することができることが理解できる。
【０３７９】
これが正しく機能するには、チェーニングを出力エージェントから任意の下位構成要素を通して再び出力エージェントに渡す必要がある。
【０３８０】
接続
前述した例の全てでは、エージェント間は１対１で対話が行われた。従って、構成要素からの一つの出力は、後続する構成要素の一つの入力に接続され、各エージェントは一つの対応するエージェントと対話するようになされる。
【０３８１】
これは、エージェントのネゴシエートの単純性を確保することによって、システムの複雑性を大幅に低減する。この場合、以下により詳細に説明するＤＵＰ構成要素のような構成要素を使用して、エージェントからの出力を複製し、この出力を複数の後続エージェントに転送し、それによって効率的な１体多接続を提供することができる。しかし、一方、エージェントの振る舞いは、１対多、多対１及び多対多の対話をエージェント間で行うように変更することができる。従って、例えば、一つの構成要素からの出力をいくつかの連続した構成要素の入力に接続することが可能である。この場合、構成要素の出力に提供されるデータをいくつかの後続する構成要素の入力に、ＤＵＰ構成要素を接続する必要なく、同時に提供することが可能なことが理解できる。この場合、出力に関連するエージェントは、いくつかのエージェントと同時にネゴシエーションをする必要がある。
【０３８２】
これより、この一例について図２７を参照して説明する。
【０３８３】
図２７はエージェント１０３１を有する構成要素１０３０を示し、エージェント１０３１は、この例では、１０進法、２進法又は１６進法コードの出力を、好ましい順で提供するようになされる。構成要素１０３０は、必要に応じて１０進法又は１６進法、及び、１６進法又は２進法の形式でデータを受け取るようになされた各エージェント１０３３、１０３５を介して構成要素１０３２及び１０３４に接続される。従って、この場合、エージェント１０３１、１０３３、１０３５はネゴシエーションを行い、この場合は１６進法コードである共通のデータ形式を決定しなければならないことが理解できる。
【０３８４】
次いで、構成要素１０３０は、出力を１６進法コード形式で提供するように動作する。従って、エージェント１０３１は、出力を最も好ましくない形式で提供しなければならない。この場合に、１０進法コードのみで動作するようになされたエージェント１０３７を介してデータを受け取るようになされた第３の構成要素１０３６が提供される場合、共通のデータ形式を見つけることができず、従って、構築例外エラーが発生することが理解できる。従って、提供する出力が多すぎると、対話によりネゴシエーション及びデータ転送プロセスが大幅に複雑化することが理解できる。
【０３８５】
これにもかかわらず、同報通信データを一つのエージェントから複数の他のエージェントに提供することが可能であり、これが状況によっては効率の向上に繋がり得るという点で、１対多、多対１及び多対多接続性をエージェント間に提供することには大きな利点がある。
【０３８６】
多段階構築
動的な構成要素又は動的な略図の実装を可能にするために、多段階構築を使用することができる。具体的には、通常、多段階構築は、設計者が、困難な構築を制御するために、複数の段階で略図を意図的にレイアウトして、次いでこれを、初期段階の進行を満足したときに実装する状況を指す。しかし、これは構成要素レベルで実装することもできる。
【０３８７】
具体的には、これにより、初期のデータ処理の結果に応じて構成要素の機能が実装中に変更されるときに、構成要素の動的変更が可能になる。これよち、この一例について図２８Ａ〜図２８Ｃを参照して説明する。
【０３８８】
図２８Ａに示すように、エージェント１０５１、１０５２、１０５３、１０５４及び１０５５を有する構成要素１０５０が提供される。構成要素は、エージェント１０５１、１０５２、１０５３を介して入力を受け取り、エージェント１０５４を介して出力を提供するようになされる。構成要素１０５０は、入力エージェント１０６１、１０６２及び出力エージェント１０６３を有する下位構成要素１０６０を含む。図に示すように、入力エージェント１０６１、１０６２は、入力エージェント１０５１、１０５２に接続され、出力エージェント１０６３は内部エージェント１０５５に接続される。
【０３８９】
使用の際に、構成要素１０５０は、エージェント１０５１、１０５２、１０５３を介してデータを受け取り、これらを処理し、次いでエージェント１０５４を介して出力を提供するようになされる。この例では、エージェント１０５１、１０５２を介してデータを受け取る場合、データは構成要素１０６０に転送され、構成要素１０６０は入力を処理して出力を生成し、出力はエージェント１０６３を介して内部エージェント１０５５に転送される。
【０３９０】
内部エージェント１０５５は、セレクタとして知られる特定のタイプのエージェントである。具体的には、エージェント１０５５は、エージェント１０６３から受け取ったペイロードを調べ、次いで、ペイロードに含まれているデータに応じて一つ又は複数の略図を構築するように動作する。従って、例えば、エージェント１０６３から受け取ったペイロードが１０進数である場合、セレクタエージェント１０５５は一つの構成要素１０７０を含む略図１０６４を選択し、これを、図２８Ｂに示すように、構成要素１０５０の略図に組み込ませることができる。このようにして、図に示すように、エージェント１０７１及び１０７２は、エージェント１０５３及び１０５５に接続され、出力エージェント１０７３はエージェント１０５４に接続される。
【０３９１】
略図１０６４は、エージェント１０７１、１０７２、１０７３に接続された外部エージェントを有する場合があり、図に示すように、外部エージェントはエージェント１０７１、１０７２、１０７３を、エージェント１０５３、１０５４、１０５５に接続できるようにするために、前述したように受け渡す必要があることが理解できる。同様に、セレクタエージェント１０５５は、二つのエージェントに同時に接続することができないため、接続には、図２８Ｂの点線で示すように、一時的エージェント１０５５を作成する必要もある。
【０３９２】
使用の際に、構成要素１０７０が仕様に組み込まれると、前述と同様にして、エージェント１０５５はエージェント１０６３をエージェント１０７２に、受け渡すように動作することができ、それによって構成要素１０７０が、エージェント１０７１、１０７２を介して受け取ったデータを必要に応じて処理できるようにする。処理済みデータは、エージェント１０７３を介して、当業者に理解されるように提供することができる。
【０３９３】
しかし、エージェント１０５５は、エージェント１０６３が提供した出力が１６進法形式であると判定する場合、セレクタエージェント１０５５は異なる略図１０６５を選択しなければならない。この一例を図２８Ｃに示し、この場合、組み込まれる略図は、１６進数を１０進法形式に変換する追加の構成要素１０８０に接続された構成要素１０７０を含む。従って、図２８Ｃに示す略図は、内部エージェント１０５５に接続された入力エージェント１０８１及び構成要素１０７０の入力１０７２に接続された出力エージェント１０８２を有する構成要素１０８０を含む。
【０３９４】
この場合、内部エージェント１０５５は、ペイロードをエージェント１０８１に転送する前に略図を構築させ、エージェント１０８０がデータを、エージェント１０８２を介して、エージェント１０７２に転送する前に１０進法形式に変換できるようにする。ここでも、図に示すように、これには一時的エージェント１０５５を形成する必要があり得る。動作の残りの部分については前述した通りである。
【０３９５】
従って、前述した処理では、セレクタエージェントは、構成要素１０６０によって提供された出力を解析して後続する略図１０６４、１０６５を決定する必要がある。従って、ビルドプロセス中、セレクタエージェント１０５５は、エージェント１０６３と通常通りにネゴシエーションをするように動作する。これが完了し、構成要素１０６０が具体化されるサービスを行うと、エージェント１０６３は出力をペイロードとしてセレクタエージェント１０５５に供給する。セレクタエージェントはペイロードに含まれる出力を決定する。次いで、必要に応じて後続する略図１０６４、１０６５を選択する。次いで、後続する略図を、任意の下位構成要素が実装される通常の方法で構築して実装することができる。
【０３９６】
これから、エージェント１０５５は、略図が選択される前にエージェント１０６３との接続を終了することができ、この場合、一時的エージェント１０５５は必要ないことが理解できる。
【０３９７】
従って、この形態の構成要素を実装するには、構成要素１０５０を実装するエンティティは動作モードを変更する必要がある。具体的には、構成要素１０５０の略図が、通常の状況でのように予め定義される場合、エンティティが購入注文を受け取るときに構成要素インスタンス１０５０を生成する。この構成要素インスタンスも、同様に、追加の構成要素インスタンスが構成要素１０６０等の下位構成要素に必要であると決定する。従って、略図において定義されるように、各構成要素インスタンスである、構成要素１０７０及び／又は１０８０が導入される。これらの構成要素インスタンスは構成要素１０５０への異なる構成要素サーバに実装することができ、実際に、異なるエンティティによって実装され得ることが理解できる。
【０３９８】
エンティティは、構成要素１０５０の購入注文を受け取ると、最初に、構成要素１０６０に対応する一つの構成要素インスタンスを開始する。この状況では、構成要素インスタンス１０６０は、通常通りにデータを処理して、スケマティックセレクタエージェント１０５５に出力を提供するように動作する。次いで、セレクタエージェント１０５５は、残りのサービスを実装するために必要な略図、又は要求されるデータ処理を決定するように動作する。
【０３９９】
従って、図２８Ｂに示す略図の場合、スケマティックセレクタエージェント１０５５は、構成要素１０７０に対応する構成要素インスタンスを使用することになる略図を選択する。その一方で、図２８Ｃに示す略図の場合、セレクタエージェント１０５５は、構成要素１０８０及び１０７０に対応する二つの構成要素インスタンスのそれぞれを使用することになる略図１０６５を開始する。
【０４００】
多段階構築は、好ましい実装に応じて自動的に又は手動で実装することができる。
【０４０１】
手動処理の場合、内部エージェント１０５５は、構成要素１０５０を動作させているエンティティに、エージェント１０６３からのペイロードで受け取ったデータの指示等の出力を提供するようになすことができる。オペレータは出力を調べ、必要に応じて、例えば図２８Ｂ、図２８Ｃに示す構成要素略図の残りの部分を構築する。ユーザは略図を定義し、次いで構築するように動作し、各構成要素インスタンスが通常通り生成されることになる。従って、エージェント１０５５は前述したような受け渡しを行う。構成要素が実装され、エージェントによるネゴシエーションが完了すると、構成要素１０５０は、残りのデータ処理を必要に応じて完了できるようにする。
【０４０２】
一方、自動処理作の場合、エージェント１０５５は、残りの構成要素及び相互接続の選択を自動的にトリガをかける。一般に、これはメモリに記憶されている所定のリスト等から選択される予め定められた略図に従って実現する必要があることが理解できる。従って、この選択は、エージェント１０６３から受け取ったデータを使用して、ルックアップテーブル（ＬＵＴ）にアクセスし、例えば、必要な略図を決定することができる。
【０４０３】
これが信頼できるように機能するためには、エージェント１０６３に提供される可能性のあり得るいずれのデータも取り扱うことができる略図を提供されていなければならない。さもなければビルドプロセス全体が失敗に終わるか、又は手動動作に変える必要がある。
【０４０４】
従って、前述した例では、ビルドプロセスは２段階で完了するが、任意の数の段階を提供することができる。いずれの場合でも、多段階構築技術によって、広範囲の機能の実現が可能になる。
【０４０５】
具体的には、多段階構築は略図全体に使用することができる。従って、ユーザは、多段階構築向けに設計された略図を定義することができる。この場合、ユーザは三つ又は四つの異なる略図を定義することができ、最終的に使用される略図は、処理を通して部分的に得られる結果に依存する。これが行われる場合、セレクタエージェント後にデータ処理を行う可能性のあるいずれの構成要素も、セレクタエージェントが使用すべき略図を決定するまで構築されない。
【０４０６】
この決定は、ユーザからの入力と共に行うことができる。従って、ユーザは、段階的出力を生成する略図を部分的に定義することができる。段階的出力が得られると、ユーザは、得られた特定の出力に応じて、略図の残りの部分を完了することができる。
【０４０７】
この場合、第２の段階の構築に関わる構成要素に対する購入注文は、第１の段階が完了し、所望の出力が得られるまで発行されないことが理解できる。
【０４０８】
これによって、ユーザは多段階でデータ処理を実行し、実行可能なコードを構築することができる。これは同様に、ビルドプロセスが失敗した場合に発生する費用を低減するとともに、考慮すべき変数の数を低減することができるため、略図を最適化する機会をユーザに提供する。
【０４０９】
多段階構築によって、構成要素の動的な実装も可能になる。これは、略図が固定の静的な略図ではなく条件によって変更可能な構成要素である。この場合、エンティティは、完了に多段階構築を必要とする構成要素を定義することができ、このことはユーザが意識しなくてもよい事項（トランスペアレント）である。構成要素は、エージェント１０５１、１０５２、１０５３、１０５４等の外部エージェントを提供することによって、ビルドプロセス中に略図中の他の構成要素と通常通りに対話する。これによって、他の構成要素を通常通りに構築することができ、構成要素１０５０からの出力は、第２の内部構築段階が完了した後でのみ提供される。
【０４１０】
その結果、一般に、後続する構築段階で必要な構成要素の実装に要求されるいずれの購入注文も発行するのはエンティティであり、従って、これは場合によっては自動的に行い得ることが理解できる。従って、エンティティサーバは、特に第２の構築段階において使用される構成要素が別のエンティティによって提供される場合、第２の構築段階のルートサーバとして働くことができる。
【０４１１】
プロトタイプ構成要素
前述した例では、動的な構成要素の場合であっても構成要素は予め定義される。これは、入力及び出力されるデータの性質が予め決定されるためである。これは、ユーザが、フォーラムから構成要素を選択するときに、構成要素の特定の入力及び出力の要件を認識していることを意味する。
【０４１２】
従って、図２８Ａ〜図２８Ｃに関連して前述した例では、構成要素は動的であってもよく、これによって、例えば、構成要素が異なる形式を有する入力を受け取れるようにすることができる。しかし依然として、これらの形式を予め定義する必要があり、そのため、ユーザに提供される実装の選択肢が限られてしまう。
【０４１３】
一方、エンティティはフォーラムに置かれるプロトタイプ構成要素を提供することができる。プロトタイプ構成要素は、定義済みの構成要素の略図を含まず、また同様に、確定済みの入力仕様及び出力仕様を含まない。代わりに、プロトタイプ構成要素は、提供可能な機能の指示を含む。従って、ユーザは、入力を組み合わせることのできるプロトタイプの構成要素を選択することができる。
【０４１４】
この段階において、入力及び／又は出力の性質、特に取り扱うことのできるデータ形式は定義されない。従って、ユーザがプロトタイプ構成要素を選択して略図に含めるときに、ユーザが、組み合わせたいデータ形式の指示を、エンティティに提供する必要がある。この手続きは複数の方法で行うことができる。
【０４１５】
第１の例では、ユーザが構成要素を選択し、これを略図に追加しようとするときに、構成要素に望む入力仕様及び／又は出力仕様を提供するようにユーザに促し、これがエンティティに転送されて検討される。次いでエンティティは、要件に従って各サービスを提供することが可能であるか否かを評価する。可能であり、構成要素を実装することができる場合、この確認が、必要とされる構成要素エージェントの定義済み入力仕様及び出力仕様と共にユーザに送られる。次いで、仕様を使用して構成要素を確定し、略図に追加できるようになる。
【０４１６】
この形態のプロトタイプ構成要素を、以下、条件付きプロトタイプと呼び、これは、略図に組み込み可能になる前に、構成要素を実装可能であるというエンティティからの確認が必要なためである。
【０４１７】
しかし、一方、エンティティが、必要な入力仕様及び出力仕様に関わりなく構成要素に具体化されるデータ処理サービスを行うことができることに自信を持つ場合、プロトタイプ構成要素を無条件プロトタイプとして提供することが可能である。
【０４１８】
この場合、プロトタイプ構成要素は単に、略図にすぐに組み込むことができる。この場合、構成要素のエージェントは、他の構成要素のエージェントと通信し、そこから入力仕様及び出力仕様を決定するようになされる。従って、エージェントは、通常通りにネゴシエーションをする時に、ビルドプロセス中に対応するエージェントが選択した任意の入力選択肢又は出力選択肢を効率的に許容する。
【０４１９】
エージェントネゴシエーションは、一つの無条件プロトタイプ構成要素の入力エージェントが単に、出力エージェントによって指定された好ましい形式に従って出力からのデータを受け取ることができることを示すだけであるという点で基礎的である。同様に出力も、単に後続する構成要素の入力に関連するエージェントによって要求される形式でデータを提供することができることを示すだけである。
【０４２０】
従って、無条件プロトタイプの入力仕様及び出力仕様は、効率的に、略図内の他の隣接する構成要素によって要求される入力仕様及び出力仕様に従って決定される。
【０４２１】
従って、二つの条件付きプロトタイプ構成要素が相互に接続される場合、共通の仕様が自動的に定義されないことがあり得ることが理解できる。この場合、略図を作成するユーザ又は構成要素を実装するエンティティによるいくつかのユーザ入力が、略図構築を成功させるために必要になる。
【０４２２】
いずれの場合でも、無条件プロトタイプ構成要素の場合、構成要素を実装する場合、エンティティは単に、形式に関わりなくデータを受け取り、必要なデータ処理を行うように動作するだけである。これは、適当に柔軟な構成要素を定義することができる場合、自動的に行い得ることが理解できる。
【０４２３】
基本構成要素
前述したように、システムは、構成要素を階層的に組み合わせられるようにして、複雑で連続したデータ処理を行えるようにする。従って、フォーラムを介して提供可能な基礎的な基本構成要素を使用して、複雑な構成要素を構築することができる。
【０４２４】
基本構成要素は、論理処理等の大半の略図で必要な基本的なデータ処理を表し、通常、適した実行可能なコードを利用して自動的に実装される。例を付録Ａに提供する。
【０４２５】
コンテキスト依存性
構成要素供給者のサービス実装に保護を提供するため、システムは、コンテキストに依存するコードを生成するように実装することができる。
【０４２６】
コンテキスト依存コードとは、コードが実行されるコンテキストを利用するようにコードが生成されるということである。このコンテキスト依存性は、構成要素が生成した実行可能なコードを抽出し、別のプロジェクトで使用することを非常に難しくするため、固有のＩＰ（知的財産）保護を構成要素に提供するにあたって有用である。
【０４２７】
具体的には、供給者がコードを顧客に送ると、顧客は、顧客、環境及び仲間の供給者によって提供されるコンテキストに基づいた一意のソリューションを受け取る。従って、顧客が、供給された結果を調べることによって特定の供給者プロセス詳細を想像で見つけることができ得るコンテキスト独立コードを供給するのとは対照的に、供給者のＩＰは、ソリューションの性質がカスタマイズされることによって隠される。供給者が顧客の結果の中にそれぞれのソリューションを深く細かく構築する場合、隠蔽性が増す。
【０４２８】
これとは対照的に、従来のコーディングの慣行は、コンテキストから独立させることによってコードの再使用を促進する。これにより、すべてコードを変更することなく、異なるプロジェクトの範囲でのコードの再使用が可能になる。仮に、構成要素がこのようにしてコードを生成するものであれば、誰かが構成要素を再び購入する必要はなくなり、構成要素を生成する経済性が揺るがされる。従って、この場合に構成要素提供者に対するＩＰ保護はない。
【０４２９】
構成要素はサービスであるため、再使用を促すべきであり、従って、コンテキスト依存コードを生成すれば有益である。これは、コードが使用されるコンテキストを利用することによって、構成要素が、コードの要件に基づいた、カスタマイズされた出力を生成することによって実現される。コンテキストは、以下のものを含むことができる。
・開始時の実行可能な既知の状態
・前の命令からのレジスタの既知の状態
・スタック及びメモリの既知の状態
・レジスタ、スタック及びメモリの割り当て
・プロジェクト内のそれ自体（構成要素）の番号
・どの構成要素が自分の構成要素に接続されるか
・コードを置くべき場所
コンテキスト依存コードは、同じタスクを実行する多くの方法があり、方法によってはシステムの他の部分に依存することを利用する。依存するコードを作成することによって、第３者が、あまり書き換えることなくコードの容易な再使用を防止し、又はリバースエンジニアリングを防止する。あるレベルの依存性を越えると、リバースエンジニアリングし書き換えるよりも、構成要素を単に再購入するほうが経済的になる。
【０４３０】
コンテキスト依存性は、結果を生むべきコンテキストを供給者が調べることによって実現される。各コンテキストは一意であるため、各コンテキストをカスタマイズすることが可能である。
【０４３１】
例えば、コンテキストを無視して、プログラムを終了するコードを構築することができる。従って、
例１
留意点：これはｘ８６アセンブリであり、またアセンブリが１６進数の代わりに提示される。
【０４３２】
mov eax, 1 ;store number 1 in register eax
mov ebx, 0 ;store number 0 in register ebx
int 0x80 ;trap call to Unix OS
この結果、定数１及び０が、登録されたｅａｘ及びｅｂｘにそれぞれロードされ、ソフトウェア割り込みを実行してオペレーティングシステムにトラップして戻る。このコードを実行すると、オペレーティングシステムがプログラムを終了し、コードをメモリから解放する。例１は、これを顧客に送ると、供給者のＩＰを与えることになるので、コンテキストに鈍感である。
【０４３３】
コンテキストが包含される場合、以下のように特定の変更を行うことができる。
１）送るコード量を少なくする。
２）実行時間を短くする。
３）コードをこの特定のコンテキストでしか動作できないようにする。
【０４３４】
前の命令の実行は、ＣＰＵレジスタに既知の定数を残し得る。ｅａｘ及びｅｂｘのそれぞれがすでに１及び０を含んでいる希な場合、このコンテキストの結果は単に、以下のようになり得る。
例２
int 0x80
他の多くの組み合わせが存在する。例えば、異なるレジスタが正しい定数を含む場合、レジスタからレジスタへの移動は、定数をレジスタに移すよりも安価である。同様に、レジスタは、存在する定数が必要な数に非常に近いものである場合に加算することができる。それぞれの場合で、生じる結果は他のいずれのコンテキストでも使用不可能なものである。さらに、顧客は、それぞれのコンテキストでの他の多くの組み合わせに気付かないであろう。
【０４３５】
コンテキスト依存性は、これより説明する複数の異なるメカニズムを使用して実現することができる。
【０４３６】
アセンブリレベルのコンテキスト依存性
一例では、前述したプロセスは、構成要素のサプライチェーンを使用し、実行可能アプリケーションのコードを生成する。コード生成構成要素サプライチェーンの根底には、アセンブリ命令に似たものに類似した構成要素がある。これら根底の各構成要素は、通常、１〜３のマシンコード命令を生成し、いくつかの例としては、以下のものがある。
・assign
・add
・multiply
・divide
・subtract
・jump condition
これら各構成要素は、レジスタ、スタックメモリ、ヒープメモリ及びマシン状態に対してどのような作用を有するかを理解する。
【０４３７】
マシンの状態は、プログラムにおいて使用される命令の中から選択されたものに対するプロセッサの既知の状態の累積計算である。例えば、以下のものである。
【０４３８】
;eax=?, ebx=?, ecx=?, edx=?
mov eax, 1 ;eax=1         ;eax=1, ebx=?, ecx=?, edx=?
mov ebx, 2 ;ebx=2         ;eax=1, ebx=2, ecx=?, edx=?
add eax, exb ;eax=eax+ebx ;eax=3, ebx=2, ecx=?, edx=?
mov ecx, eax ;ecx=eax     ;eax=3, ebx=2, ecx=3, edx=?
単一パラメータのコンテキスト依存性
単一パラメータ依存性とは、生成されたコードが一つのレジスタの状態に依存することである。単一パラメータ依存性は、最小レベルのマシン状態コンテキスト依存性を表す。
【０４３９】
以下に、ａｓｓｉｇｎ構成要素の実装について説明する。この構成要素は、構築時に既知の指定の定数値に、特定のレジスタを設定する。例えば、ａｓｓｉｇｎ（ｅａｘ，１）は、ｅａｘが値１を得ることになるコードを生成する。ａｓｓｉｇｎ構成要素は、ａｓｓｉｇｎコードが実行されて結果を実現するコードを作成する前の既知のマシンの状態を用いることによってコンテキスト依存性を実現する。
【０４４０】
例えば、マシン状態が｛ｅａｘ＝２，ｅｂｘ＝１０，ｅｃｘ＝０，ｅｄｘ＝１｝の場合、表１に示すように、ｅａｘへの１の割り当てを実現する複数の方法がある。
【０４４１】
【表１】
0005456756.tif 000002
【０４４２】
一般に、サイズ及び速度を最小に抑えながら依存性レベルを最大にする選択肢が最良の選択肢である。前述した例は、割り当て番号及び入力のマシン状態に合致するいくつかのルールを示す。さらなる詳細を表２に示す。
【０４４３】
【表２】
0005456756.tif 000003
【０４４４】
マルチレベルのコンテキスト依存性
アセンブリに近い低レベルにコンテキスト依存性を作り出すことは、実装が最も困難なレベルである。これは、与えられた問題を実装することができる方法の数が限られていることによる。より高いレベルの構成要素がこのようなコンテキストに依存する構成要素を使用するには、固有のコンテキスト依存性が高すぎる。
【０４４５】
コード生成プリミティブのようなアセンブリが十分なコンテキスト依存性を有する場合、これらを下位構成要素として使用する構成要素は、リバースエンジニアリングするよりもコード全体を書き直すほうが容易になる程度まで依存性を有するようになる。
【０４４６】
コンテキスト依存性の具体例を付録Ｃに示す。
【０４４７】
可変コンテキスト依存性
前述した例では、複数回のコード生成が行われる場合、各回での出力結果は、コンテキストに直接依存するため同じである。
【０４４８】
しかし、さらなる保護を提供するために、コードが同じコンテキストにおいて生成される都度、結果が異なるように、出力されたコードを変更することが可能である。これは、以下の事項によって実現することができる。
・ランダムコンテキストの導入（ディザリングとして知られる）
・複数の可能な出力からの選択（例えば、表１は所定のコンテキストに可能な８つの結果を示し、これら８つの選択肢の中の一つがランダムに選択されて出力として使用される）
・データ処理の再分配のネゴシエーション（メッシングとして知られる）
従って、例えば、構成要素は、レジスタを乱数に設定する等により、後続する構成要素が使用するランダムコンテキストを導入するようになすことができる。さらに、システムは、複数の等しく適切であるが、異なるコンテキスト依存性ソリューションのる出力を選択するように動作することができる。
【０４４９】
この具体例を付録Ｃに説明する。
【０４５０】
ディザリング
この場合、構成要素は、複数の異なる技術を用いてデータ処理を内部で行うようになされる。この場合、技術は異なる結果コードを生成するように構成される。この一例について、これより図２９Ａに関連して説明する。
【０４５１】
具体的には、この例では、構成要素１２５０が示される。この場合、構成要素は、図に示すように共に接続された５つの下位構成要素１２５１、１２５２、１２５３、１２５４、１２５５を含む。下位構成要素の厳密な性質は、この例では重要ではないが、例示のみを目的として、構成要素１２５０は値をレジスタｅａｘに割り当てるようになされている。この場合、値は、外部エージェント１２５６を介してレジスタｅａｘに書き込まれる。値はDUP構成要素１２５１に転送され、DUP構成要素１２５１は、値を各構成要素１２５２、１２５３、１２５４にコピーする。
【０４５２】
この例では、各エージェント１２５２、１２５３、１２５４は、値を異なる方法で割り当てるようになされる。
【０４５３】
従って、値「Ｖ」の場合、単に、構成要素１２５２は、コマンドｅａｘ＝Ｖを使用してこの値をレジスタに書き込むようになされる。構成要素１２５３は、コマンドｅａｘ＝０，ｅａｘ＝ｅａｘ＋Ｖを使用してレジスタをクリアし、値「Ｖ」を追加するようになすことができる。最後に、構成要素１２５４は、例えばコマンドｅａｘ＝１０，ｅａｘ＝ｅａｘ−（１０−Ｖ）を使用してレジスタを所定の値に設定し、次いでレジスタを必要に応じて変更するようになすことができる。
【０４５４】
従って、構成要素１２５２、１２５３、１２５４のそれぞれは、同じ最終結果を実現する異なるコマンドを生成することが理解できる。
【０４５５】
この場合、決められたコマンドの形態での構成要素処理の結果は構成要素１２５５に転送される。構成要素１２５５は、複数の異なる入力を受け取り、その中からランダムに一つを選択するようになされたディザ構成要素である。
【０４５６】
従って、構成要素１２５０が実装され、値Ｖを受け取ると、各構成要素１２５２、１２５３、１２５４は値Ｖに基づいて適当なコマンドを生成する。コマンドはディザ構成要素に渡され、ディザ構成要素はコマンドの中から一つをランダムに選択し、エージェント１２５７を介して出力する。従って、構成要素１２５０が所定の値Ｖに対して行われる都度、３つの異なるコマンドの一つがエージェント１２５７に出力として提供される。
【０４５７】
この場合、構成要素１２５０は外部コンテキストから独立している。すなわち、構成要素はレジスタｅａｘの現在の状態を考慮に入れることができない。しかし依然として、生成される結果コードは各場合で異なるようにディザリングをすることが望ましい。
【０４５８】
従って、このシステムは、同じ外部コンテキストの場合であっても異なる出力が提供されることを保証するように動作することが理解できる。これは、構成要素がサービスを行う様式が秘密のまま保たれることを保証するのに役立つ。
【０４５９】
これはディザ構成要素１２５５の動作を強調するための過度に単純化した例であり、この技術をより複雑な環境において実装し、それによって構成要素からの出力に自動的な変動を導入することができることが理解できる。
【０４６０】
例えば、これは図２９Ｂに示すように、外部コンテキスト依存性と共に実装することもできる。この例では、構成要素１２５４は構成要素１２５８で置き換えられ、追加の入力エージェント１２５９が図に示すように提供される。この場合、エージェント１２５９は、レジスタｅａｘの現在の値「Ｖ2」の指示を、既知であれば提供する。
【０４６１】
従って、この場合、構成要素１２５８は、コマンドｅａｘ＝ｅａｘ−（Ｖ2−Ｖ）を使用してｅａｘの値を設定するようになされる。従って、構成要素１２５８からの出力は外部コンテキスト依存性を導入し、それによって構成要素１２５０のコンテキスト依存性がさらに高められることが理解できる。入力エージェント１２５９が値Ｖ2を受け取らない場合、構成要素は出力を提供しないようになすことができる。この場合、単に、構成要素１２５５は、構成要素１２５２、１２５３によって提供される出力の中から一つを選択する。しかし、出力が構成要素１２５８によって提供される場合、ディザリング構成要素は、構成要素１２５２、１２５３、１２５８のいずれか一つからの出力を、構成要素１２５０の出力としてランダムに選択するようになすことができる。
【０４６２】
メッシング
メッシングの場合、構成要素は協働して、各構成要素の出力を、各構成要素の各作業に基づいて変更できるようにする。
【０４６３】
この一例について、これより、図３０Ａ、図３０Ｂに関連して説明する。
【０４６４】
この場合、図３０Ａでは、二つの構成要素１２６０及び１２６５が設けられ、構成要素１２６０は下位構成要素１２６２、１２６３、１２６４を含み、構成要素１２６５は下位構成要素１２６７、１２６８、１２６９を含む。この例では、構成要素１２６０、１２６５は、図に示すように、入力Ｗ、Ｘ、Ｚを受け取り、各出力Ｗ'、Ｘ'及びＹ'、Ｚ'を生成するようになされる。この場合、最終的な出力は連結構成要素１２７０を使用して組み合わせられて、最終結果コードＷ'、Ｘ'、Ｙ'、Ｚ'が形成される。
【０４６５】
しかし、構成要素１２６０、１２６５は、メッシングにより、各構成要素が生成するコードを変更するように動作することができる。
【０４６６】
従って、この場合、構成要素１２６０及び１２６５はネゴシエーションをして、下位構成要素１２６３を実装する厳密な場所が構成要素の動作にとってあまり重要ではないと決定する。具体的には、構成要素の機能が、構成要素１２６３を構成要素１２６５の下位構成要素として実装することができることを意味する。
【０４６７】
この例では、入力エージェントは変更されないままであり、構成要素１２６０、１２６５は依然として、同一の様式で入力Ｗ、Ｘ、Ｚを受け取る必要があることが理解できる。
【０４６８】
しかし、メッシング処理の後、構成要素によって生成される結果出力は変更されている。従って、図３０Ｂに示す配置では、構成要素の出力は、構成要素１２６０の場合はＷ'であり、構成要素１２６５の場合はＸ'、Ｙ'、Ｚ'である。
【０４６９】
その結果、メッシング後、構成要素１２６０、１２６５の出力は変更されている。
【０４７０】
この例では、構成要素１２６０及び１２６５の出力は、構成要素１２７０によって連結される。これは、全体の略図及びこれが動作する方法に影響を及ぼすことなく、構成要素自体が異なる出力を生成する場合であっても、構成要素１２６０及び１２６５を実装した最終結果を略図に統合できることが明らかになる。
【０４７１】
従って、これは、略図において他の構成要素に依存する構成要素の出力を変更することにより、コンテキスト依存性を導入する。これは、構成要素１２６０及び１２６５の出力をモニタする第３者が、それによってサービスの実装をリバースエンジニアリングする能力を低下させることが理解できる。
【０４７２】
この各例では、メッシング手続きに対して複数の予想外の恩恵がある。具体的には、入力Ｘを受け取り、続けて出力Ｘ'を受け取る構成要素１２６０のエージェントは、入力Ｘが構成要素１２６５に提供されるように単純に受け渡すことができる。
【０４７３】
さらに、構成要素１２６０は、ここではもはや、連結構成要素１２６４を実装する必要がない。これにより、構成要素１２６５内で必要な処理をわずかに増やすだけで、構成要素１２６０が必要とする処理が大幅に低減される。従って、このシナリオでは、メッシングの使用によって、略図の実装の効率を全体的に増大させることもできる。
【０４７４】
前述したメッシング処理は、略図内に実装される構成要素に従属することが理解できる。従って、メッシングはビルドプロセス中でしか実装することができない。
【０４７５】
一般に、メッシングを行う能力は、メッシングをエージェントの機能の一部としてネゴシエートする意欲の指示を、エンティティに提供させることによって実現される。従ってこの場合、エンティティは、接続する構成要素のタイプを検出し、次いでネゴシエート選択肢を提供するように動作するエージェントを作成することができる。これは、例えば、他の構成要素が、構成要素の残りの部分に過度に影響を及ぼすことなく容易に実装することができる任意の下位構成要素の詳細を含み得る。
【０４７６】
エージェントは、ネゴシエート要求を受け取る場合、ネゴシエーションが可能であることを示す、ネゴシエート選択肢が設定されているか否かを決定する。
【０４７７】
ネゴシエーションが開始されると、これは様々な様式で実装することができる。例えば、これには、動作中のエンティティによる手動の介入が必要な場合もある。しかし通常、これは、エージェントに、構成要素の動作に過度に影響を及ぼすことなく構成要素外で実装可能な下位構成要素のリストを交換させることによって実現することができる。
【０４７８】
従って、上で触れた例では、構成要素１２６０及び１２６５のインスタンスが構築されると、エージェント１２６１は、下位構成要素１２６３の指示をエージェント１２６６に提供する。この場合、エージェント１２６６は、構成要素略図に基づいてチェックを行い、構成要素１２６６を構成要素略図に比較的容易に統合することができると決定する。従って、エージェント１２６６はエージェント１２６１に、これを行うべきであることを示す。
【０４７９】
従って、当業者が理解するように、ビルドプロセス中、構成要素１２６５は、構成要素１２６３の実装を要求する購入注文を生成する。次いで、受け渡しによって、前述したようにエージェント１２６１が１２６５に受け渡せるようにする。
【０４８０】
この処理は、構成要素デザイナに、例えば構成要素の機能に基づいて使用し得る共通のメッシングを予想させることによって容易に実現できることが当業者に理解できる。これによって、エンティティは構成要素を動的構成要素として実装することが可能になる。
【０４８１】
従って、構成要素１２６５を提供するエンティティは、構成要素１２６３が下位構成要素として実装される場合があり得ることを予想することができ、これによって、エンティティは構成要素１２６５を動的構成要素として作成することが可能になる。この場合、エンティティは、構成要素１２６５に二つの略図、すなわち構成要素１２６３を含むものと含まないものとを定義する。この場合、エージェント１２６１は、メッシングを処理すると、構成要素１２６３の指示を提供する。エージェント１２６６は、セレクタエージェントとして実装されるため、構成要素１２６３の指示を受け取り、これを使用して、構成要素１２６５の実装に使用する略図を選択することができる。
【０４８２】
潜在的なメッシング選択肢を予想し、動的構成要素として実装可能な適切な略図を作成することは、構成要素作成の複雑性を増大させるが、これはまた、構成要素を実装するエンティティが、構成要素がデータ処理を実行する方法を秘密のままにすることに役立つことが理解できる。従って、潜在的なメッシングに関して構成要素を柔軟にすることへのこの投資は、データ処理を実行するエンティティの知識に対する保護が追加されることで報われる。
【０４８３】
メッシングのために１２６５を提供するエンティティとの協働に合意した、１２６０を提供するエンティティは、１２６０によって購入される間に、構成要素１２６３等が１２６５を介してコードを送るようなビルドバンドルを提供可能であることが理解できる。
【０４８４】
メッシングは動的構成要素に従って行う必要はなく、代わりに手動で行うことも可能であることが理解できる。
【０４８５】
いずれの場合でも、前述したコンテキスト依存コードを生成する技術は、各データ処理を実行する方法のリバースエンジニアリングに対する強力な障壁を提供し、それにより、構成要素の開発への投資に対する保護に関して、エンティティに強力な保護を提供することができることが理解できる。
【０４８６】
構成要素の開発におけるエンティティの保護は、開発への投資に明らかに報いるものであり、それにより、エンティティはサービス提供に関して競争することが可能になる。
【０４８７】
概括
従って、一例では、前述したシステムは、ユーザが、構成要素の組み合わせを定義することによってデータ処理を実行する、又はコンピュータコードを生成できるようにする。この場合、各構成要素は各データ処理サービスに対応する。これによって、構成要素の組み合わせが実行されると、所望のデータ処理が実行される一連のデータ処理を定義する。又は、所望のコードが生成されることになる一連のデータ処理を定義する。
【０４８８】
一般に、構成要素は、定義されたデータ処理サービスを実行可能な各エンティティによって提供され、これは手動又は自動手続きを通して実現することができる。従って、ユーザが適した構成要素の組み合わせを定義することができるようにするために、通常、多くの場合は、構成要素はフォーラムと呼ばれる中央システムを通して提供される。これは、通常、一つ又は複数の処理システムによって実装され、フォーラムに構成要素の仕様の形式の構成要素の形式的定義を受け取らせることによって実現することができる。
【０４８９】
データ処理を実行するためには、構成要素の組み合わせを、構成要素を対話できるように十分に詳細に定義できることが必要がある。これを実現するためには、前述した例では、使用される構成要素及び構成要素間の対話を記した略図が定義される。略図は通常、適したＧＵＩを使用して定義されるため、ユーザはフォーラムに提示された構成要素を選択し、これらを略図にドラッグ・アンド・ドロップし、構成要素間に適した接続を定義して構成要素間の対話を定義することができる。この点において、フォーラムは、構成要素の仕様に対するアクセスを提供するポータルとして動作する一つ又は複数の処理システムによって提供される。
【０４９０】
略図が完成すると、これをビルドとして知られるプロセスで実装することができる。
【０４９１】
ビルド中、各構成要素インスタンスを略図内の各構成要素に生成することができる。
【０４９２】
各構成要素インスタンスは、通常、各エンティティによって提供される処理システムを使用して実装される各構成要素サーバ上で作成することができる。使用の際に、システムが実装されると、データを各構成要素インスタンス間で転送することができ、構成要素インスタンスの少なくともいくつかが、受け取ったデータに対して要求されるデータ処理を実行して、必要に応じて処理済みデータの出力を提供する。
【０４９３】
構成要素インスタンスは互いに通信可能であり、具体的には、情報及びデータを、両方の構成要素が理解可能な形式で転送可能なことが理解できる。
【０４９４】
一例では、これはエージェントを使用して実現され、各エージェントは、各構成要素のポートに提供される。従って、一つの構成要素のポートに関連するエージェントは、別の構成要素のポート出力に関連するエージェントと協働する。ポートは一般に双方向の情報交換に使用されるが、多くの場合、データ転送には方向が関連するため、ポートは一般に入力及び出力に当てはまる。
【０４９５】
通常、エージェント間の通信は、アドレス情報及び転送される様々なデータを含むペイロードと共にヘッダを含むメッセージを転送することによって実現される。エージェント間の対話は、一方のエージェントから別のエージェントにメッセージを送らせるだけという単純なものでよい。一方、ネゴシエーション後のデータ転送を含む２段階プロセスも行うことができる。この場合、エージェントはまず互いにネゴシエーションをして、各構成要素間でのデータ転送に使用することができる共通のデータ形式を決定し、それから必要に応じてデータ転送に進む。従って、ネゴシエーション中、ペイロードは通常、エージェントが取り扱うことのできる許容可能なデータ形式等のリストを含む。従って、第１のエージェントは適したリストを第２のエージェントに送り、第２のエージェントは許容可能な形式の指示でこれに応答する。処理するデータを転送する場合、データはペイロードに含まれる。
【０４９６】
従って、一例では、エージェントは構成要素間の対話の一つの形式を表す。
【０４９７】
略図をビルドプロセス中に構築すべき場合、これは、略図内の構成要素を提供する各エンティティに、購入注文を送ることによって実現することができる。次いで、各エンティティは、各構成要素インスタンスを、任意の関連するエージェントと共に含む各構成要素サーバを構築する。これが完成すると、エージェントは必要な任意のネゴシエーションを行い、それから構成要素間でのデータ転送が行われ、構成要素は、構成要素によって具体化される各データ処理を実行できるようになる。
【０４９８】
この例では、エンティティは、各構成要素の購入注文を受け取り、これは、構成要素に関連するエージェントと他のエージェントとの間に形成が必要な接続を指定する。具体的には、これは、構成要素インスタンス及び対応するエージェントが構築されるときに、エージェントが他のエージェントと直接通信することができるように、他のエージェントのエージェントアドレスを含む。
【０４９９】
さらに、一例では、生成されたコードは前述したようなコンテキスト依存コードであることができ、システムが、顧客及び供給者の知的財産（ＩＰ）を保護することによって経済的に採算のとれる開発モデルを提供できるようにする。一例では、結果コードに対するすべての権利は顧客に与えることができるが、供給者が利用するＩＰ及びコードが作成された方法は決して顧客に知らされない。従って、顧客は、結果を生み出すプロセスではなく結果を購入する。現実的な例としては、製造業者からの車の購入がある。顧客は車にのみ関心を持ち、車がどのように製造されるかについては関心を持たない。
【０５００】
前述した技術は、ソフトウェアがどのように構築されるかを集積するため、これは、供給者のＩＰを保護するＩＰ保護メカニズムを提供する。すなわち、「どのように製造されるか」は顧客に決して知らされない。これは、コンテキスト依存コードの生成によってさらに高めることができる。これは同様に、供給者がそれぞれの特殊能力を保護するのを助ける。
【０５０１】
前述した例は、コンテキストに依存するコードを生成するようになすことができる。従って、従来のコードと比較してサイズを大幅に縮小するシステムについて説明していることが理解できる。さらに、構成要素供給者がコード生成プロセスの小さいが詳細な局面に集中できるようにすることによって実現することのできる専門化により、信頼性及び最適化の劇的な向上を実現することが可能になる。
【０５０２】
従って、これは、現在の「職人」手法（個人又は小規模グループが大規模アプリケーションのすべての部分に対して初めから終わりまで線状に取り組む）から離れて、製造業界における現行の模範的経営慣行に取って代わる「工業的」モデル（専門家構成要素供給者、高度な連携及び組み立てラインの概念を用いる）に移行する完全に新しいソフトウェア構築プロセスを提供する。
【０５０３】
これは、以下の技術の一つ又は複数を使用して実現することができる。
・競争要素をソフトウェア開発に加える、
・供給者の専門化を可能にする、
・供給者及び顧客両方のＩＰを保護する、
・クライアントに完全に譲渡可能な所有権を生み出す、
・工業的スタイルのソフトウェアサプライチェーンを作成する。
【０５０４】
その結果、いくつかの例では、処理は以下のことをすることができる。
・構成要素の供給者が直接競争して、各サービスを提供できるようにすることによって、構成要素供給者間の競争を可能にし、
・供給者及びクライアントのＩＰを均整が取れるように保護し、
・構成要素のサプライチェーンの開発を可能にし、
・完全分散型の構成要素の処理エンジンを提供し、
・完全自動コードの生成をサポートする。
【０５０５】
一実施態様では、これは以下のツールの使用を通して支援される。
・構成要素デザイナー  −  構成要素の視覚的組み立てをサポートするアプリケーション
・構成要素公開及び非公開仕様ファイル  −  ＸＭＬ等、所定の形式で構成要素の定義のため
・構成要素サーバ  −  構成要素公開仕様ファイルに指定のサービス供給をサポートするアプリケーション
・構成要素の提供を調整する、エージェントによって具体化されるサーバ間通信メッセージのセット
ＩＰ保護
処理は、構成要素を個々に識別することができ、設計されたコンテキスト内でしか使用可能な出力を生成することができない固有のメカニズムを提供することによって供給者の知的財産を保護することができる。
【０５０６】
この点において、現在のコンパイラ技術は所有するプロセスを使用してコードを生成することができるが、結果のコードは常に同じであり（コンテキストの独立）、作成者のＩＰを認識することなく他者により望み通りに再使用される恐れがあることに留意されたい。例えば、Ｃでの「ｐｒｉｎｔｆ」関数は、作成者が何等認識することなく、コードライブラリ又はバイナリコードを介して無制限に再使用することが可能である。
【０５０７】
しかし、前述した技術では、供給者は、構築プロセスの副産物としてコンテキストベースのＩＰ保護をもたらす構成要素を定義することによって、それぞれの構成要素ＩＰを保護する方法を知ることができる。
【０５０８】
ＩＰ保護は、構成要素供給者が、構成要素サーバを動作させることによって、それぞれのサービスを提供するという意味で対称的である。供給者は、構成要素が最終的に、構成要素の消費者によってどのように使用されるかについての情報に対するアクセスできない場合がある。
【０５０９】
使用に応じた料金の支払い
これに加えて、前述したモデルは、コンテキスト独立環境に存在する受動的に再使用可能要素からのコードの開発を助長する現在のコーディングの慣行とは対照的に、使用に応じて料金を支払う構成要素の戦略を可能にする。コンテキスト独立構成要素は、ユーザが使用の都度、構成要素を再購入する必要性をなくし、構成要素を元から生成することの経済性を揺るがす。
【０５１０】
現在、法的なライセンスメカニズムが、コンテキスト独立コードを保護するように働く唯一の防護手段である。しかし、コンテキスト依存コード生成の導入は、構成要素供給者間の直接市場競争と共に、個々の構成要素が生成する実行可能なコードの抽出及び再使用を、その構成要素をリバースエンジニアリングするよりも購入したほうが安くするのに十分難しくする。
【０５１１】
サプライチェーン
説明したプロセスは、業界型のサプライチェーンをサポートする。この場合、所定の構成要素に対する購入注文が供給者に届き、構成要素ベンダーサイトに配備された構成要素サーバが必要な下位構成要素に対する購入注文を自動的に生成する。このような自動化により、効率的な「ジャストインタイム」による構成要素のサプライチェーンが生み出される。
【０５１２】
分散型構築
プロセスは真の分散型コード構築をサポートする。
【０５１３】
当業者は、多くの変形及び変更が明らかになることが理解できよう。当業者に明らかになるこのような変形及び変更のすべてを説明していないが、本発明が広く掲げる精神及び範囲内にあるものと考えられるべきである。
【０５１４】
付録Ａ
このセクションは、通常、実行可能なコードの構築に使用される基本構成要素の例を含む。
【０５１５】
以下の例では、構成要素の実装に実際に使用される実行可能なコードについては、一般に簡単であり、当業者に理解されるように、十分にプログラマの理解の範囲内であるため、説明を省略する。いずれの場合でも、異なる形態の基本構成要素の実装を提供し得ることも理解できる。
【０５１６】
バンドル
前述したように、バンドル構成要素は、複数のエージェント接続を一つのエージェント接続にバンドリングするように動作する。入力及び出力の数の違いを含め、様々な、異なるバンドリング構成要素を提供することができる。
【０５１７】
図３１Ａに示すＢＵＮ２構成要素は、エージェント入力１、２を介して入力される二つのエージェントを一つのエージェントにバンドリングすることができる基本構成要素である。バンドルには、ＮＩエージェントから収集された名前が付けられる。別のＢＵＮ２構成要素に接続される場合、離れた場所にあるＢＵＮ２構成要素からのバンドル名がＮＯエージェントに出力され、エラーを修正できるようにする。エージェントＢはバンドルを出力し、エージェントＥはいずれの動作エラーも出力する。
【０５１８】
図３１Ｂに示すＢＵＮ３構成要素は、入力エージェント１、２、３を介して入力される三つのエージェントをバンドリングすることができる基本構成要素である。バンドルには、ＮＩエージェントから収集された名前が付けられる。別のバンドル３に接続される場合、離れた場所にあるバンドル３からのバンドル名がＮＯエージェントに出力され、エラーを修正できるようにする。エージェントＢはバンドルを出力し、オプションのエージェントＥがいずれの動作エラーも出力する。
【０５１９】
ＤＵＰ
ｄｕｐ構成要素は、例えば、図３１Ｃに示すように、二つ以上の出力エージェントＯに接続された入力エージェントＩを含む。
【０５２０】
使用の際に、入力エージェントＩが受け取った入力ペイロードが複製され、必要に応じて、各出力エージェントＯから供給される。これによって、一つのエージェントからのデータをコピーし、必要に応じて複数のエージェントに分配することができる。
【０５２１】
Ｄ２Ｈ
この構成要素は、図３１Ｄに示され、エージェントＩが受け取ったペイロードを、１０進数から１６進数に変換して、エージェントＯから出力する。これはエージェントＰによって与えられる精度で行われる。変換のいずれのエラーもオプションのエージェントＥにら出力される。
【０５２２】
Ｈ２Ｂ
図３１Ｅに示すＨ２Ｂ構成要素は、エージェントＩが受け取ったペイロードを、１６進数から２進数に変換して、エージェントＯから出力する。これはエージェントＰによって与えられる精度で行われる。変換のいずれのエラーもオプションのエージェントＥに出力される。
【０５２３】
ｅｎｄｉａｎ
図３１Ｆに示すｅｎｄｉａｎ構成要素は、エージェントＩがペイロードとして受け取った入力１６進数のバイト単位で反転してエージェントＯに出力する。例えば、入力が０１２３４５６７の場合、出力は６７４５２３０１になる。これはエージェントＰによって与えられる精度で行われる。変換のいずれのエラーもオプションのエージェントＥに出力される。
【０５２４】
Ｆｉｎｄ＆Ｒｅｐｌａｃｅ
図３１Ｇに示すこの構成要素は、エージェントＦｉｎｄに入力される文字列の出現を求めて、エージェントＩｎに入力された文字列をサーチし、各外観をエージェントＲｅｐｌａｃｅに入力された文字列で置き換え、結果をエージェントＯｕｔに送る。
【０５２５】
文字列Ｆｉｎｄが見つからない場合、エージェント文字列Ｉｎは変更されることなくエージェントＯｕｔに出力される。
【０５２６】
Ｆｉｎｄ  Ｔａｇ
図３１Ｈに示すこの構成要素は、Ｔａｇ  Ｉｎエージェントに入力されたタグを求めてＸＭＬ  Ｉｎエージェントに提示されたＸＭＬ文書をサーチする。
【０５２７】
これは、
・Ｖａｌｕｅ  Ｏｕｔにタグに関連する値、
・ＸＭＬ  ＯｕｔにＸＭＬ文書の残りの部分、
・Ｅｘｃｅｐｔｉｏｎに発生したいずれの例外、
を出力する。
【０５２８】
例えば、エージェントＸＭＬ  Ｉｎに入力されたペイロードが、
"<b>
<a>1</a>
</b>
<a>2</a>
<b>
<a>3</a>
</b>"
であり、Ｔａｇ  Ｉｎエージェントのペイロードが「ａ」である場合、Ｖａｌｕｅ  Ｏｕｔは「２」であり、ＸＭＬ  Ｏｕｔは、
"<b>
<a>1</a>
</b>
<b>
<a>3</a>
</b>"
になる。
【０５２９】
例外は、ＸＭＬ  Ｉｎエージェントのペイロードが有効なＸＭＬではない場合、又はＴａｇ  Ｉｎエージェントのペイロードが見つからない場合に発生する。例外が発生する場合、いずれの出力にも何も現れない。
【０５３０】
ＸＭＬがＢａｓｅ６４形式でエンコードされたデータを含む場合、これは、ＸＭＬ  ＯｕｔエージェントのペイロードにおいてＢａｓｅ６４形式のエンコードとして現れるが、もしＶａｌｕｅ  Ｏｕｔエージェントに表される場合はデコードされる。
【０５３１】
Ａｄｄ＿ｔａｇ
図３１Ｉに示すａｄｄ  ｔａｇ構成要素は、Ｔａｇ  Ｉｎエージェントに入力されるペイロードに示されるタグに基づいて、またＶａｌｕｅ  Ｉｎエージェントに入力される値に従って、有効なＸＭＬにおいて＜Ｔａｇ  Ｉｎ＞Ｖａｌｕｅ  Ｉｎ＜／Ｔａｇ  Ｉｎ＞の形態のＸＭＬデータ（タプル）を作成する。値をＢａｓｅ６４数として記憶する必要がある場合にはそうされる。ＸＭＬにおいて有効ではないタグである場合、例外が発生し、ＸＭＬ  Ｏｕｔエージェントに出力されるペイロードは何も含まない。
【０５３２】
Ｃａｔ
図３１Ｊに示すこの構成要素は、エージェント１及び２に入力されるペイロードの文字列を連結し、結果を残りのエージェントに出力する。例えば、文字列１が「バナナ」であり、文字列２が「スムージー」である場合、出力エージェントは「バナナスムージー」を出力する。
【０５３３】
Ｌｅｎ
図３１Ｋに示すこの構成要素は、エージェントＩが受け取った文字列の長さを測定し、長さをエージェントＯから出力する。例えば、エージェントＩにおける入力文字列が「ＡＢＣＤＥＦ」である場合、出力は６になる。
【０５３４】
ＬＵＴ
図３１Ｌに示すこの構成要素は、ルックアップテーブル」プロトコルに従って、ＸＭＬでエージェント「Ｔ」に供給されるルックアップテーブルから入力「Ｉ」をサーチし、適合する出力をエージェント「Ｏ」から出力する。
【０５３５】
テーブルは複数のエントリからなり、ほとんどの場合、入力／出力タプルで構成される。エージェント「Ｉ」における入力がタプルの入力に一致する場合、エージェント「Ｏ」における出力は同じタプルからの出力になる。テーブルは、一つのタグ「ｏｔｈｅｒｗｉｓｅ」を含むオプションエントリも有する。このタグが提示され、一致するタプルが見つからなかった場合、出力「Ｏ」は、「その他」タグに関連する出力値になる。一致するものを見つけることができなかった場合、すなわち、テーブルデータがプロトコルに適合しない場合、例外が発生する。例外が発生する場合、出力Ｏには何も現れない。
【０５３６】
「ルックアップテーブル」プロトコルの一例は以下である。
<protocol>
<protocol_name>lookup table</protocol_name>
<protocol_data>
<entry>
<input>input 1</input>
<output>output 1</output>
</entry>
<entry>
<input>input 1</input>
<output>output 1</output>
</entry>
<entry>
<otherwise>output otherwise</otherwise> 
</entry>
</protocol_data>
</protocol> 
Ａｎｄ
図３１Ｍに示すこの構成要素は、エージェント１及び２に入力されたペイロードに示されるブール文字列の論理和を計算し、結果をエージェントＯのペイロードに出力する。入力のいずれかをブール文字列に解析することができない場合、例外が発生し、エージェントＯからは何も送られない。例えば、１が「ｔｒｕｅ」であり、２が「ｆａｌｓｅ」の場合、Ｏは「ｆａｌｓｅ」になる。
【０５３７】
Ｍａｔｈ
図３１Ｎ、図３１Ｏ及び図３１Ｐは、エージェント１、２に入力されたペイロードの除算、加算及び等号判定という数学的関数を行う数学演算子構成要素Ｄiv、ＡＤＤ、ＥＱを示す。この場合、結果は各出力エージェントＯに出力され、例外がエージェントＥに出力される。
【０５３８】
Ｂｕｉｌｄ  ＡＳＭ１
図３１Ｑに示すＢｕｉｌｄ  ＡＳＭ１構成要素は、コードの断片の収集を担当するデータ構造を表すビルドチェーニングの処理をする、ビルド構成要素のメンバである。
【０５３９】
Ｂｕｉｌｄ  ＡＳＭ１は、エージェントｃｏｄｅを介してコードを受け取り、ビルドエージェントに接続されたビルドチェーニングへの挿入に進む。
【０５４０】
Ｂｕｉｌｄ  ＡＳＭ１構成要素の内部略図の一例を図３１Ｒに示す。外部エージェントｃｏｄｅが内部エージェントＤＵＰに渡され、内部エージェントＤＵＰがｃｏｄｅエージェントのペイロードを二つコピーすることが分かる。ｃｏｄｅエージェントのコピーの一つは構成要素ＬＥＮに提示され、ＬＥＮはコード文字列の長さを計算する。次にこれはＤiv構成要素に提示され、２で除算され、それからアドレスチェーニングに加えられる。アドレスチェーニングは構成要素ＢＵＮ３のエージェント１で受け取られ、構成要素ＢＵＮ３のエージェント２に出力される。コードエージェントの二つ目のコピーはＢＵＮ３のエージェント３に提示され、コードをビルドチェーニングに送る。構成要素ＢＵＮ３は、アドレスイン／アウト及びｃｏｄｅエージェントを共にバンドリングし、ビルドファミリのその他のメンバに送る役割を果たす。
【０５４１】
Ｂｕｉｌｄ  ＡＳＭ２
図３１Ｓに示すＢｕｉｌｄ  ＡＳＭ２構成要素もビルド構成要素のメンバである。
【０５４２】
Ｂｕｉｌｄ  ＡＳＭ２は、エージェントｃｏｄｅでコードを受け取り、エージェントｂｕｉｌｄに接続されたビルドチェーニングへの挿入に進むようになされる。Ｂｕｉｌｄ  ＡＳＭ２はまた、エージェントＡｄｄｒ  ｏｕｔ上のコードに割り振られたメモリの現在アドレスを提供する。
【０５４３】
Ｂｕｉｌｄ  ＡＳＭ２構成要素の内部略図の一例を図３１Ｔに示す。外部エージェントｃｏｄｅが内部エージェントＤＵＰに渡され、内部エージェントＤＵＰがｃｏｄｅエージェントのペイロードを二つコピーすることが分かる。ｃｏｄｅエージェントのコピーの一つは構成要素ＬＥＮに提示され、ＬＥＮはコード文字列の長さを計算する。次にこれはＤiv構成要素に提示され、２で除算され、それからアドレスチェーニングに加えられる。アドレスチェーニングは構成要素ＢＵＮ３のエージェント１で受け取られ、構成要素ＤＵＰを使用して複製され、それからＢＵＮ３構成要素のエージェント２に返される。
【０５４４】
アドレスの二つ目のコピーはＡｄｄｒ  ｏｕｔエージェントに入力される。ｃｏｄｅエージェントの二つ目のコピーは構成要素ＢＵＮ３のエージェント３に入力され、コードをビルドチェーニングに送る。構成要素ＢＵＮ３は、アドレスイン／アウト及びｃｏｄｅエージェントを共にバンドリングし、ビルドファミリのその他のメンバに送る役割を果たす。
【０５４５】
Ｉｎｉｔ＿ｅｌｆ
図３１Ｕに示すＩｎｉｔ＿ｅｌｆ構成要素もビルド構成要素の一つである。
【０５４６】
Ｉｎｉｔ＿ｅｌｆ構成要素は、ビルドファミリのその他の構成要素とインタフェースするｂｕｉｌｄバンドルを出力する。このｂｕｉｌｄバンドルを介して、Ｉｎｉｔ＿ｅｌｆ構成要素はコードを受け取り、コードは実行及びロード（ＥＬＦ）のためのファイル形式に形成される。このファイル形式データがｅｌｆエージェントに提示される。
【０５４７】
Ｉｎｉｔ  Ｅｌｆ構成要素の内部略図の一例を図３１Ｖに示す。エージェントｂｕｉｌｄが構成要素ＢＵＮ３に渡され、ＢＵＮ３はバンドルを解除してアドレスイン／アウト及びｃｏｄｅエージェントを復元することが分かる。これはこの例のために設計されたビルドチェーニングを単純にしたものであるため、限られた機能しか有さない。従って、コードが実行及びロードファイル形式（ＥＬＦ）に組み込まれるとき、アドレス情報は無視される。ａｄｄｒｅｓｓエージェントは、断片が追加されるときにコードアドレスを追跡するためだけに使用される。ｃｏｄｅエージェントは、ＢＵＮ３構成要素のエージェント３で復元されると、ＤＵＰ構成要素に出力され、ＤＵＰ構成要素は二つのコピーを作る。コピーの一つは、ＥＬＦファイルの総サイズの計算に使用されて、構成要素Ｆｉｎｅ＆Ｒｅｐｌａｃｅを介してヘッダに包含され、コードの二つ目のコピーはＣＡＴ構成要素を介してヘッダに添付され、Ｂ２Ｈ構成要素を使用して２進数に変換され、それから外部エージェントｅｌｆに提示されて親に送られる。
【０５４８】
付録Ｂ
具体例
代替の技術について、以下詳細に記す複数の具体例において概説する。
【０５４９】
第１の具体例
第１の例では、一つの構成要素を含む略図が構築される。この単純な例は、構築に関わるステップを強調する役割を果たす。
【０５５０】
図３２Ａは、「ａｄｄ」サービスを提供する構成要素「Ａｄｄ１」の外部構成要素の表示Ａｄｄ１を示す。内部構成要素の表示を図３２Ｂに示す。図に示すように、構成要素は二つの入力ＩＮ１、ＩＮ２及び二つの出力ＯＵＴ、ＥＸＣＥＰＴＩＯＮＳを含む。
【０５５１】
この例では、構成要素の表示Ａｄｄ１は、図３２Ｃに示す略図「Ａｄｄ１  ｔｅｓｔ」にレイヤアップされる。この略図は、ルート構成要素と呼ばれる外枠、構成要素の表示Ａｄｄ１からなり、これには、図３２Ｃのハッチングが施された四角で示される４つの内部エージェントＩＮ１、ＩＮ２、ＯＵＴ、ＥＸＣＥＰＴＩＯＮＳが接続される。この例では、すべてのエージェントは対になって１本の線で接続される。
【０５５２】
あらゆる構築もルート構成要素サーバのから始まり、この例では、ルート構成要素サーバは前述した例において概説した処理システムの一つに対応する。理論上、前述した例におけるベースステーション１、エンドステーション３及びエンティティステーション５のいずれか一つが、ルート構成要素サーバとして機能することができるが、この例では、ルート構成要素サーバはユーザのエンドステーション３である。
【０５５３】
ルート構成要素サーバは、構築要求を受け取ると、ルート構成要素の構築に進む。この例では、ルート構成要素に関連するルート略図がロードされスキャンされる。次いで、ルート略図内のすべての構成要素の表示が識別され、二次構築要求がルート構成要素サーバによって発行される。この場合、一つの構築要求のみが「Ａｄｄ１」構成要素サーバに発行される。これは、この例の略図にこの一つの構成要素しか含まれていないためである。
【０５５４】
例えば、各エンティティによって運用され、離れた場所に配置されたエンティティステーション５の一つであることができる「Ａｄｄ１」構成要素サーバ上に、「Ａｄｄ１」の略図が、ルート略図がルート構成要素に関連付けられるのとほとんど同じように、構成要素に関連して存在する。図３２Ｂは、「Ａｄｄ１」構成要素サーバ上に常駐する「Ａｄｄ１」の略図を表す。略図は何も含んでいないことに留意されたい。従って、構成要素Ａｄｄ１はいずれの下位構成要素も含まない。
【０５５５】
「Ａｄｄ１」構成要素サーバは、ルートサーバから発行された二次構築要求を受け取ると、それは新しい顧客に提供する輸送手段としての役割を果たす新しいインスタンスを作成する。ルート構成要素サーバの動作と同様に、「Ａｄｄ１」構成要素サーバは、「Ａｄｄ１」に関連する略図をロードし、さらなる構築要求を送り出すことができる様に、任意の構成要素の表示を求めてスキャンする。しかし、この例では、「Ａｄｄ１」略図は空であるため、それ以上の構築要求は発行されない。
【０５５６】
ルート構成要素サーバによって発行される「Ａｄｄ１」構築要求は、「Ａｄｄ１」構成要素に関連するエージェントについての情報を供給することに留意することが重要である。これにより、「Ａｄｄ１」構成要素インスタンスのエージェントを正しい宛先、この場合はルート構成要素サーバに接続することが可能になる。
【０５５７】
ルート構成要素の次のステップは、内部又は外部エージェントを求めてルート略図をスキャンすることである。ルート構成要素であるため、これはいずれの外部エージェントも含まない。しかし、略図は、図３２Ｃに示すように４つの内部エージェントＩＮ１、ＩＮ２、ＯＵＴ、ＥＸＣＥＰＴＩＯＮＳを含む。
【０５５８】
次いで、ルート構成要素サーバはこれら内部エージェントの作成に進み、内部エージェントはそれぞれの相手、すなわち「Ａｄｄ１」構成要素サーバ上のエージェントＩＮ１、ＩＮ２、ＯＵＴ、ＥＸＣＥＰＴＩＯＮＳとコンタクトをとり始める。「Ａｄｄ１」構成要素サーバは同様の機能を実行する。「Ａｄｄ１」略図はエージェントのためにスキャンされ、４つの外部エージェントＩＮ１、ＩＮ２、ＯＵＴ、ＥＸＣＥＰＴＩＯＮＳしか見つからなかった。次いで、「Ａｄｄ１」構成要素サーバは、これら外部エージェントの作成に進み、外部エージェントもまたルート構成要素サーバにおけるそれぞれの相手とコンタクトをとり始める。
【０５５９】
ルート構成要素サーバ及び「Ａｄｄ１」構成要素サーバはそれぞれの内部及び外部エージェントのそれぞれの作成に成功したため、接続に成功する。
【０５６０】
この点で、ルート構成要素サーバは「Ａｄｄ１」構成要素サーバへの４つの通信経路を確立している。ここで、ユーザは、ルート構成要素サーバ上で利用可能なエージェントを介して「Ａｄｄ１」構成要素サーバにおけるサービスを利用することができる。
【０５６１】
「Ａｄｄ１」略図は空であるため、エンティティによって要求されるサービスは、「Ａｄｄ１」構成要素サーバに所在するオペレータによって手動で実行されなければならない。従って、ルート構成要素サーバのユーザが内部エージェントＩＮ１、ＩＮ２にそれぞれ数を入力すると、「Ａｄｄ１」構成要素サーバのオペレータは、これらの数を受け取り、次いでそれぞれのサービスを行うことができる。この例では、「Ａｄｄ１」構成要素サーバのオペレータは、数を手動で追加し、エージェントＯＵＴを使用してそれぞれの結果を出力しなければならない。
【０５６２】
「Ａｄｄ１」構成要素が入力又は出力の形式、例えば使用すべき数体系の底又は使用すべき小数点以下の桁数を検証したい場合、エージェントは、すべての相手が満足するまで追加のペイロードパケットを自由に送ることができる。この場合、情報をさらに転送する必要はないため、エージェントは自由にリンクを終了することができる。
【０５６３】
トランザクションが完了すると、エージェントをルート構成要素サーバ及び「Ａｄｄ１」構成要素サーバの両方において、エージェントを終了することができ、ルート構成要素インスタンス及び「Ａｄｄ１」構成要素インスタンスをそれぞれ役割を終わらせることができる。
【０５６４】
この例はかなり単純であるが、構成要素サーバ、エージェントがどのように対話するか、及び通常はエンドステーション３から離れて配置される構成要素サーバに遠隔実行されるサービスの概念を強調する役割を果たす。従って、例えば、ルート構成要素サーバはタウンズビルにあり、「Ａｄｄ１」構成要素サーバはローマにあってもよい。これにもかかわらず、「Ａｄｄ１」構成要素サーバの場所はタウンズビルにいるユーザに対してトランスペアレントである。
【０５６５】
留意すべき最後のポイントは、ＥＸＣＥＰＴＩＯＮＳエージェントの使用についてである。ＥＸＣＥＰＴＩＯＮＳエージェントは、Ａｄｄサービスを提供するエンティティが契約通りのサービスを提供するにあたって何らかの問題がある場合に使用することができ、問題を伝えるために使用することができる。
【０５６６】
第２の具体例
第２の例は、この例では「Ａｄｄ」サービスの提供が、自動化された構成要素「Ａｄｄ２」の使用を通して提供されること以外は、第１の例と実質的に同じである。構成要素「Ａｄｄ２」の構成要素の表示Ａｄｄ２の一例を図３３に示す。図に示すように、構成要素の表示Ａｄｄ２は、構成要素の表示Ａｄｄ１と実質的に同じである。
【０５６７】
この例は、単純な構成要素のサービスの自動化が非常に容易であることを示す。具体的には、自動化は、自動化ａｄｄの各インスタンスに属するエージェントの状態をモニタリングし、状態が変化したときに特定のタスクを行うことによって実現される。
【０５６８】
この例では、「ＡＤＤ２」構成要素のエージェントＩＮ１、ＩＮ２がペイロードを受け取っており、エージェントＯＵＴが接続されたときに、エージェントＩＮ１、ＩＮ２からのペイロードが共に追加され、エージェントＯＵＴを介してペイロードパケットとして送り出される。
【０５６９】
この自動化ａｄｄ構成要素は、１０進数加算の場合のみ機能するように設計されるため、入力が有効な１０進数ではない場合、入力が正しくない形式であることを示すメッセージを送る。エージェントＯＵＴが終了指示を受け取っている場合、エージェントＩＮ１、ＩＮ２は終了パケットをそれぞれの相手に送る。
【０５７０】
この結果は、ルート構成要素が数値５及び４を自動化「Ａｄｄ２」構成要素に送った場合、結果９がルート構成要素のエージェントＯＵＴにすぐに到着する。ルート構成要素が次いで、数値５を送ったエージェントを介して数値６を送るべき場合、数値１０が出力に到着し、再開を必要とすることなく任意の修正が可能である。
【０５７１】
ルート構成要素が、エージェントＩＮ１、ＩＮ２を介して文字「ｆivｅ」及び数値４をそれぞれ送るべき場合、エージェントＩＮ１はメッセージ「数の形式が正しくありません」を自動化された「Ａｄｄ２」構成要素から受け取る。
【０５７２】
第３の具体例
第３の具体例は、ａｄｄ構成要素の複雑性を拡張して、１０進数及び１６進数等、底の異なる数値の入力を取り扱えるようにする。これは、１０進数又は１６進数のいずれかとして入力を許容できる加算であり、１０進数又は１６進数のいずれかを出力することができる。
【０５７３】
図３４Ａは、「Ａｄｄ３」構成要素の構成要素の表示Ａｄｄ３の一例である。「Ａｄｄ３」構成要素は、図に示すように、エージェントＩＮ１、ＩＮ２、ＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２、ＦｏｒｍａｔＯＵＴ、ＥＸＣＥＰＴＩＯＮＳを有する入力及び出力を含む。この例では、「Ａｄｄ３」構成要素は、このより複雑なサービスを行うように選択され、配置された多くの内部構成要素を含む複合構成要素である。図３４Ｂは「Ａｄｄ３」構成要素の内部略図であり、これは、このより複雑なサービスを行うために複数の新しい構成要素を導入している。
【０５７４】
図３４Ｂに示す略図の詳細は、特定の形式の数を別の形式に変換するサービスを行う複数の「ｃｏｎｖｅｒｔ」構成要素である。このようにして、「Ａｄｄ３」構成要素のユーザは各数の形式を指定することができる。
【０５７５】
自動化「Ａｄｄ２」構成要素は１０進数に対してしか機能しないため、むしろ脆い。しかし、「Ａｄｄ３」構成要素は同じ基本サービスを行うが、多くの形式の入力数を取り扱うことができ、さらには出力数値を任意の所望の形式で生成することができるという点ではるかに堅牢である。これは、脆い「Ａｄｄ２」構成要素を使用しているにも拘わらずである。
【０５７６】
エージェントＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２、ＦｏｒｍａｔＯＵＴを使用して形式化が実現される。
【０５７７】
エージェントＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２に供給された各入力数は、各「ｃｏｎｖｅｒｔ」構成要素を使用して１０進数に変換され、それから「Ａｄｄ２」構成要素に転送される。各「ｃｏｎｖｅｒｔ」構成要素は４つのエージェントＩＮ、ＦｏｒｍａｔＩＮ、ＯＵＴ、ＦｏｒｍａｔＯＵＴを有する。
【０５７８】
「Ａｄｄ３」構成要素の各ＩＮエージェントからの数はエージェントＩＮに提示され、「Ａｄｄ３」構成要素の各ＦｏｒｍａｔＩＮエージェントによって指定された形式のものであると解釈される。
【０５７９】
この例では、「ｃｏｎｖｅｒｔ」構成要素の３つのインスタンスが、「Ａｄｄ２」構成要素に属するエージェントごとに一つずつ使用される。これは、「Ａｄｄ２」構成要素が１０進数に対してのみ機能するため必要である。
【０５８０】
「Ａｄｄ３」構成要素が外部エージェントＩＮ１、ＩＮ２、ＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２、ＦｏｒｍａｔＯＵＴ、ＥＸＣＥＰＴＩＯＮＳのすべての構築に使用される場合、ルート構成要素（図示せず）上のそれぞれの相手のエージェントに接続されることになる。
【０５８１】
次いで、「Ａｄｄ３」構成要素は、図３４Ｂに対応する内部略図を構築する。これは構築要求及びエージェント接続詳細をすべての下位構成要素に送る。「Ａｄｄ３」構成要素のすべての外部エージェントＩＮ１、ＩＮ２、ＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２、ＦｏｒｍａｔＯＵＴ、ＥＸＣＥＰＴＩＯＮＳは、各「ｃｏｎｖｅｒｔ」下位構成要素に直接接続されるため、受け渡されて、下請け業者「ｃｏｎｖｅｒｔ」構成要素が外部エージェント上の相手エージェントに直接接続することになる。外部エージェントから離れて、「Ａｄｄ３」構成要素は、エージェントが接続されるとすぐにそれぞれのペイロードを自動的に送るように設定された、３つの内部エージェントＤＥＣＩＭＡＬを有する。これらエージェントはそれぞれのペイロードを自動的に送り、終了パケットを受け取るとすぐに終了を送るため、事実上、自動化エージェントである。
【０５８２】
ｃｏｎｖｅｒｓｉｏｎ構成要素が自動化される場合、「Ａｄｄ３」構成要素全体も事実上、自動化される。これは、より単純なプログラミング構成要素から複雑なプログラミング構成要素を構築する良い例であり、非基本的自動化でもある。「Ａｄｄ２」構成要素は自動化されたが、下位略図を介してタスクを実行する方法がないため、基本構成要素として分類される。事実上、これら技術を利用して生成されたすべてのソフトウェアは、最低レベルの基本要素（ｐｒｉｍｉｔivｅ）から導出される。
【０５８３】
「Ａｄｄ３」構成要素は自動化「Ａｄｄ２」構成要素よりも多様である。「Ａｄｄ３」構成要素の購入者は、変換がどのように機能するかについて心配することなく加算を行うことができ、複雑性レベルの遮蔽を示す。
【０５８４】
第４の具体例
この具体例は、最も複雑なａｄｄ構成要素について考察する。
【０５８５】
この例では、「Ａｄｄ５」構成要素も「ａｄｄ」サービスにさらなるテスト及び機能を提供する。しかし、考察は、技術の特定の主要特徴を説明するのに十分な複雑性を加えるだけであることに留意されよう。「Ａｄｄ５」構成要素は、エージェントバンドリング、基本入力テスト、略図選択及び例外の取り扱いの使用を示す。
【０５８６】
「Ａｄｄ５」構成要素は、形式仕様の入力バリエーションを含むことによって「Ａｄｄ３」構成要素を拡張し、バンドリングを使用して外部エージェントの数を低減する。図３５Ａは、「Ａｄｄ５」構成要素の構成要素の表示を示す。以下の表３に概説する５つのエージェントを有する。
【０５８７】
【表３】
0005456756.tif 000004
【０５８８】
図３５Ｂは、「Ａｄｄ５」構成要素の内部略図を示す。この例は、表４に概説する６個の他の構成要素を使用する。
【０５８９】
【表４】
0005456756.tif 000005
【０５９０】
Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ
Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素は、入力文字列（Ｉｎ）をＬＩＳＴエージェントの有効文字列リストと比較することによって機能する。この例では、リストは「Ｄｅｃｉｍａｌ」及び「Ｈｅｘａｄｅｃｉｍａｌ」である。入力文字列は、有効な場合、有効であるとして渡され、ＯＵＴ（ｃｈｅｃｋｅｄ）エージェントは「ｔｒｕｅ」に戻る。文字列が有効ではなかった場合、ＯＵＴ（ｃｈｅｃｋｅｄ）エージェントは「ｆａｌｓｅ」に戻る。ｖａｌｉｄａｔｅ  ｓｔｒｉｎｇのさらなるサービスは、入力文字列を指定された出力形式に再フォーマットすることである。これには、空きスペース（スペース及び復帰改行文字）の除去、文字列の小文字への変換、及び、また文字列長のトリミングが含まれ得る。ＦＯＲＭＡＴエージェントがこの出力形式を指定する。
【０５９１】
Ｏｒ
Ｏｒ構成要素は、複数のソースからの入力に基づいてイベントをトリガするときに使用される論理演算子である。入力のいずれかがｔｒｕｅの場合にはｔｒｕｅを出力するように、すべての入力を組み合わせる。Ｏｒを購入した最初のとき、入力エージェントは、それぞれ接続されたばかりであるためすべて未定義である。従ってペイロードを有さない。次いで、Ｏｒ構成要素は、送るべき出力が何であるかを決定するのに十分な情報を得るまでエージェントペイロードを待つ。Ｏｒ構成要素は入力エージェントのいずれかが「ｔｒｕｅ」のペイロードを有すると、すぐに「ｔｒｕｅ」を出力し、その他の場合は、すべての入力エージェントが「ｆａｌｓｅ」と特定されるまで待ち、すべて「ｆａｌｓｅ」と特定されたポイントで「ｆａｌｓｅ」を出力する。
【０５９２】
Ｂｕｎｄｌｅｄ  Ａｇｅｎｔｓ
エージェントＩＮ１、ＩＮ２、ＯＵＴが、バンドリングを利用して、一方は数値を表し、一方は数の形式を指定する二つのエージェントを共に組み合わせる。このバンドリングは、数の形式がバンドルの最初の位置にあり、数値が２番目の位置にあるものと想定する。これら二つの特定のエージェントの組み合わせをナンバーバンドリングと呼ぶ。互換性を保証するために、エージェントＩＮ１、ＩＮ２は、ナンバーバンドルを生成するエージェントのみに接続しなければならず、ＯＵＴエージェントはナンバーバンドルを取り扱うことのできるエージェントにのみ接続されなければならない。バンドリングについてさらに情報を得るには、バンドリング及びバンドリング解除のセクションを参照のこと。
【０５９３】
「Ａｄｄ５」構成要素のエージェントＩＮ１、ＩＮ２の数値入力Ｉｎ１、Ｉｎ２は、構成要素Ｃ１、Ｃ２によってバンドリングが解除され、数値のエージェント及び数の形式のエージェントが得られる。構成要素Ｃ２、Ｃ１がそれぞれのサービスを行った後、Ｉｎ１の数値がエージェントＡ３７に接続され、数の形式はエージェントＡ２６に接続されることになる。
【０５９４】
数値入力Ｉｎ２の場合、数値はエージェントＡ３９に接続されることになり、数の形式はエージェントＡ２９に接続されることになる。次いで、各入力Ｉｎ１、Ｉｎ２の数の形式は、Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素Ｃ６、Ｃ７によって検証されフォーマットされる。出力形式を指定するエージェントＡ１９もＣ５を使用してチェックされる。
【０５９５】
Duplicates and Validate Lists and Formats
Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素は、所定の要件に基づいて入力をチェックしフォーマットできるようにする。
【０５９６】
この例では、加算構成要素Ｃ１１において使用されるＡｄｄ構成要素に指定された形式がエージェントＦｏｒｍａｔＩＮ１、ＦｏｒｍａｔＩＮ２、及びＦｏｒｍａｔＯＵＴに準拠することを保証する必要がある。各Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素Ｃ５、Ｃ６、Ｃ７は、指定された有効文字列リストを要求し、有効文字列リストは内部エージェントＡ１４によって供給され、Ｄｕｐ構成要素Ｃ４によって３回複製される。この場合、内部エージェントＡ１４のペイロードは「１０進数、１６進数」であり得る。内部エージェントＡ１０は、「空きスペースなし、小文字」のようなものであり得る３つのＶａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素に要求される出力形式を指定する。これは、Ｄｕｐ構成要素Ｃ３を使用して、内部エージェントＡ１０から受け取った文字列を複製することによって実現される。
【０５９７】
Ｓｅｌｅｃｔivｅ  Ｃｏｎｓｔｒｕｃｔｉｏｎ
Ｖａｌｉｄａｔｅ  Ｓｔｒｉｎｇ構成要素のＯＵＴ（ｃｈｅｃｋｅｄ）エージェントＡ２３、Ａ５３、Ａ３１は、各形式仕様が入力検証に合格したか否かを示す。これらのいずれかが不合格である場合、さらなる機能を手動で実行する必要がある。ＯＵＴ（ｃｈｅｃｋｅｄ）エージェントＡ２３、Ａ５３、Ａ３１は、Ｏｒ構成要素Ｃ８を使用して一つのエージェントＡ３６に組み合わせられ、エージェントＡ３６は、「Ａｄｄ４」によって提供される手動の加算を使用すべきか、又は「Ａｄｄ３」によって提供される自動的な加算を使用すべきかを指定するエージェントペイロードを有する。
【０５９８】
図３５Ｂにおける略図の中核部分は、ａｄｄｉｔｉｏｎ構成要素Ｃ１１によって行われる。この構成要素は、ａｄｄｉｔｉｏｎ構成要素の下位略図がセレクタエージェントＡ３６のペイロードに従属するという点で特殊である。
【０５９９】
構成要素Ｃ１１の内部で、エージェントＡ３６は、自動「Ａｄｄ３」構成要素を構築するか、それとも手動「Ａｄｄ４」構成要素を構築するかを選択する。エージェントＡ１、Ａ３、Ａ１９のそれぞれに提供された入力Ｉｎ１、Ｉｎ２及びＦｏｒｍａｔが、ｖａｌｉｄａｔｅ  ｓｔｒｉｎｇ構成要素Ｃ５、Ｃ６、及びＣ７によって行われる入力チェックにそれぞれ合格する場合、「Ａｄｄ３」構成要素が使用されて加算演算が行われる。逆に、入力が検証に合格しない場合、加算は手動「Ａｄｄ４」構成要素によって行われ、人が入力を調べて問い合わせることができる。情報に何の意味もない場合、例外が生成され、親構成要素に渡される。
【０６００】
ａｄｄｉｔｉｏｎ構成要素Ｃ１１は、エージェントによって提供される情報に基づいて異なる下位略図が構築される選択的構築の使用を示す。この例には単純なケースしか提示しないが、一般に、この技術は極めて強力である。略図設計を構成要素への入力情報に基づいて選択することを可能にする。また、構築を多段階で完成することを可能にし、各段階が完了すると、次の段階の構築を起動することができる。
【０６０１】
多段階構築は、いずれの時点でも使用される構成要素の総数を大幅に低減し、コンピュータ資源を最小に抑えることができる。また、完全直列構築（すなわち、構成要素が１回毎に一つずつ購入され、構築される）と、完全並列構築（すなわち、すべての構成要素が同時に購入され構築される）との間のトレードオフを可能にする。直列構築は、コンピュータ資源を最小に抑えるが、本質的に並列構築よりも遅い。
【０６０２】
ａｄｄｉｔｉｏｎ構成要素Ｃ１１は下位略図に一つの構成要素しか有さないが、一般には任意のサイズの略図を含むことができる。ａｄｄｉｔｉｏｎ構成要素Ｃ１１の動作は、略図の残りの部分に関しては、利用者が意識することはない。この例では通常の構成要素とまったく同じように動作する。
【０６０３】
実際には、エージェントのペイロードに基づいて下位略図を選択する構成要素サーバを使用して実装することが可能である。一方、「Ａｄｄ５」構成要素の一部として直接実装することも可能である。この場合、ａｄｄｉｔｉｏｎ構成要素Ｃ１１の各エージェントＡ３６〜Ａ４３は内部エージェントとして実装され、ａｄｄｉｔｉｏｎ構成要素Ｃ１１の下位略図が構築されるときに受け渡される。
【０６０４】
構成要素の出力
ａｄｄｉｔｉｏｎ構成要素Ｃ１１によって行われる加算の出力は、ｂｕｎｄｌｅ構成要素Ｃ１０を使用して複数のバンドルに組み合わせられる。
【０６０５】
第５の具体例
前述した四つの具体例では、どのようにしてエージェント情報の処理できるかについて示した。前述した各例は、コードの構築を取り扱っているが、代わりにコンピュータプログラムがいくつかのタスク、これら例では加算演算を行っていたことに留意されたい。これから、図１、図３Ａ〜図３Ｂ及び図１０Ａ〜図１０Ｅのフローチャートに記した例はソフトウェア生成の例であるが、処理動作を直接行うにあたっても使用することが可能なことが理解できる。
【０６０６】
いずれの場合でも、第５の具体例は、実行可能なコードをバイト単位で直接構築する技術を利用することによってこの概念を拡張する。
【０６０７】
この例では、ＩＢＭ  ＰＣ上で実行されると、所定の位置に所定の色でピクセルを画面上に表示し、コードを構築する構成要素について概説する。しかし、生成されるコードは完全なプログラムではなく、この構成要素が組み込まれるように設計されるプログラムの要件に沿って構築されるコードの断片である。この構成要素は、出力にｘ８６マシンコードを生成する。この構成要素の詳細はＩＢＭ  ＰＣアーキテクチャに固有であるため、概説に留める。
【０６０８】
図３６Ａは、「Ｐｕｔ  Ｐｉｘｅｌ」構成要素の構成要素の表示Ｐｕｔ  Ｐｉｘｅｌを示す。５つの入力エージェントＸ、Ｙ、Ｗｉｄｔｈ、Ｃｏｌｏｕｒ及びＳｃｒｅｅｎ、並びに二つの出力エージェントＥｘｃｅｐｔｉｏｎｓ及びＢｕｉｌｄがある。
【０６０９】
各エージェントの説明を以下の表５に示す。
【０６１０】
【表５】
0005456756.tif 000006
【０６１１】
図３６Ｂは「Ｐｕｔ  Ｐｉｘｅｌ」構成要素の内部略図を示す。この構成要素は以前からの「Ａｄｄ５」構成要素を、複数の新しい構成要素（Ｍｕｌ、Ｍｏｖ、Ｓｅｇ  Ｐｒｅｆｉｘ、及びＢｕｉｌｄ）と共に使用する。
【０６１２】
構成要素の概説を以下の表６に示す。
【０６１３】
画面上のピクセルはすべて、ビデオメモリに記憶され、ビデオメモリは通常のメモリ内の特定のアドレスセットでしかない。これらメモリエリア内で何かを変更すると、画面上で変更される。ＩＢＭ  ＰＣのメモリはセグメント及びオフセットによって参照される。セグメントはメモリの大きな領域を選択し、オフセットはセグメント内のすべてのロケーションにアクセスできるようにする。スクリーンメモリは１６進数のセグメントアドレスＡ０００に位置する。オフセットはピクセルの位置を決定し、そのオフセットに記憶されている値がピクセルの色を決定する。
【０６１４】
【表６】
0005456756.tif 000007
【０６１５】
画面画像は一度に１行ずつ線形な配列として記憶されるので、画面上の任意の点（ｘ，ｙ）のオフセットは（ｙ＊ｗｉｄｔｈ）＋ｘで与えられる。乗算（Ｃ１）及び加算（Ｃ２）がこの計算を行う。
【０６１６】
「Ｐｕｔ  Ｐｉｘｅｌ」構成要素は、画面が正しいビデオモードに設定され、ｓｃｒｅｅｎエージェントによって指定されるセグメントレジスタは１６進数のＡ０００に設定されることを記入する。
【０６１７】
「Ｐｕｔ  Ｐｉｘｅｌ」構成要素は３つのＭＯＶアセンブリ命令を作成する。ピクセルの色が、Ｃ３及びＣ６を使用してＡＬレジスタに移される。次いで、計算されたピクセルオフセット（Ａ１４）は、Ｃ４及びＣ７によってＤＩレジスタに移される。次いで最後に、色を含むレジスタの値（ＡＬ）が、セグメントレジスタ内の値及びオフセットを含むレジスタ内の値（ＡＬ―＞セグメント：ＤＩ）によって記述されたメモリロケーションに移される。
【０６１８】
アセンブリ命令はＭＯＶ構成要素を使用し、ＭＯＶ構成要素は送信元及び宛先を取り、要求されたＭＯＶ命令に適切な１６進数マシンコードを出力する。
【０６１９】
個々の構成要素によって生成されたコードは、ｂｕｉｌｄ構成要素によって収集されて組み合わせられ、Ｂｕｉｌｄエージェント（Ａ４８）に送ることのできる実行可能なコードを生成する。
【０６２０】
これはこれより説明するチェーニングを利用して実現することができる。
【０６２１】
具体的には、この例では、ｐｕｔｐｉｘｅｌ構成要素は、図に示すようにｂｕｉｌｄエージェントＡ４８を介して提供される実行可能なコードを生成するようになされる。一般に、結果として得られる実行可能なコードは、適切な処理システムによって実行されると、処理システムにピクセルを画面上の要求された位置に配置させる。
【０６２２】
実行可能なコードは、ルートサーバ上の特定のメモリ配置において構築する必要があるため、略図中のエージェントは、実行可能なコードを構築すべきメモリ配置を知る必要がある。
【０６２３】
これを実現するために、実行可能なコードの構築に必要な適当なエージェントをバンドリングしたものから形成されるビルドバンドルが、ルートサーバによって提供される。通常、これは、ルートサーバに適当なエージェントを必要に応じて実装させることによって実現される。この場合、ビルドバンドル中のエージェントのペイロードは、要求されるメモリ配置の詳細を含む。こうしてビルドバンドルは、特定のデータを構築すべきメモリ配置を指定する。
【０６２４】
ルートサーバは、ビルドバンドルをｂｕｉｌｄエージェントＡ４８に転送し、これは次いで、ｂｕｉｌｄ構成要素Ｃ１２のｂｕｉｌｄ出力エージェントＡ３５に渡される。次いで、バンドルはエージェントＡ３４、Ａ３３、Ａ３２、Ａ３１、Ａ３０を介して再びエージェントＡ２６に転送される。これにより、ｍｏｖｅ構成要素Ｃ６はｍｏｖｅアセンブリ命令を生成し、これをペイロードとしてビルドバンドルに必要に応じて包含することができる。ビルドバンドルで提供されるｍｏｖｅアセンブリ命令には、ルートサーバによって、ビルドバンドルにおいて定義される各メモリロケーションが関連付けられる。
【０６２５】
このように変更されたビルドバンドルは、次いで、エージェントＡ２６、Ａ３０を介して再びｍｏｖｅ構成要素Ｃ７のエージェントＡ２９に転送される。ｍｏｖｅ構成要素Ｃ７は対応するｍｏｖｅ命令を生成し、これをビルドバンドルに含め、ビルドバンドルをエージェントＡ３１、Ａ３２、Ａ３７を介して再びエージェントＡ３６に転送する。この場合、ｓｅｇ  ｐｒｅｆｉｘ構成要素Ｃ８は次のｍｏｖｅ命令のプレフィックスを計算し、これをビルドバンドルに各ペイロードとして包含し、それからビルドバンドルをエージェントＡ３７、Ａ３３、Ａ３４、Ａ３９を介して再びエージェントＡ３８に転送する。ｍｏｖｅ構成要素Ｃ９は、次いでさらに命令を挿入し、それからビルドバンドルを再びｂｕｉｌｄエージェントＡ４８に、ひいては再びルートサーバに提供する。
【０６２６】
上記例では、ｐｕｔｐｉｘｅｌ構成要素を通るビルドバンドルの経路は、エージェントＡ４８−Ａ３５−Ａ３４−Ａ３３−Ａ３２−Ａ３１−Ａ３０−Ａ２６−Ａ３０−Ａ２９−Ａ３１−Ａ３２−Ａ３７−Ａ３６−Ａ３７−Ａ３３−Ａ３４−Ａ３９−Ａ３８−Ａ３９−Ａ３５−Ａ４８を通り、チェーニングを形成する。
【０６２７】
従って、この場合、ｐｕｔ  ｐｉｘｅｌ構成要素は、必要に応じて入力をエージェントＸ、Ｙ、ＷＩＤＴＨにおいて受け取るのみならず、ｂｕｉｌｄ出力Ａ４８を介してビルドバンドルを受け取るようになされることが理解できる。この場合、データを入力Ｘ、Ｙ、ＷＩＤＴＨのそれぞれ一つにおいて受け取るとすぐに、このデータは必要に応じて、対応する下位構成要素に転送されて処理される。従って、入力を受け取るとすぐに入力に対して作用することができる。
【０６２８】
第６の具体例
最後の具体例は、図３６ＡのＰｉｔ  Ｐｉｘｅｌ構成要素を使用して、図３６Ｃに詳述するスタンドアロンプログラムを作成することを示す。
【０６２９】
「Ｐｕｔ  Ｐｉｘｅｌ」構成要素を、ビデオモードの変更及びセグメントレジスタの、スクリーンメモリの値への設定を担当する「Ｓｅｔｕｐ  Ｓｃｒｅｅｎ」構成要素と併せて使用する。スクリーンメモリのアドレスは「Ｐｕｔ  Ｐｉｘｅｌ」構成要素に入力され、出力は、生成されるコードに対応するバイト及びメモリの記憶に使用されるセグメントレジスタである。これはｐｕｔ  ｐｉｘｅｌ構成要素によって使用される。プログラムはフロッピー（登録商標）ドライブから起動すべきであり、画面をクリアし（ｓｅｔｕｐ  ｓｃｒｅｅｎ構成要素から）、次いで一つのピクセルを位置２０、５０に赤の色で表示する。
【０６３０】
ｐｕｔ  ｐｉｘｅｌ構成要素は、エージェントｘ、ｙ及びｗｉｄｔｈに入力される数値、並びに、数値に対応する形式を含む複数の数値バンドルから入力を得る。色入力は、ルート略図の内部エージェントから直接入力される。前述したように、ビデオメモリのセグメントアドレスを記憶するために使用されるセグメントレジスタは、ｓｅｔｕｐ  ｓｃｒｅｅｎ構成要素から入力される。Ｐｕｔ  Ｐｉｘｅｌ構成要素の出力ｂｕｉｌｄは、構成要素によって生成されたバイトをｂｕｉｌｄ構成要素に送る。ｂｕｉｌｄ構成要素はバイトを、ｓｅｔｕｐ  ｓｃｒｅｅｎ構成要素によって生成されたバイトに添付する。次いで、ブートディスクに要求されるように、バイトを正しくフォーマットすることを担当するＢｏｏｔ構成要素に、Ｂｕｉｌｄ構成要素は完成したプログラムを送る。
【０６３１】
付録Ｃ
可変コンテキスト依存性について、内部略図を図３７Ａに示すａｓｓｉｇｎ構成要素の使用に関連してこれより説明する。
【０６３２】
Ａｓｓｉｇｎ構成要素は、実行されると、指定された数値（エージェントｖａｌｕｅ）を指定のレジスタ（エージェントｒｅｇｉｓｔｅｒ）に割り当てるコードを生成する。Ａｓｓｉｇｎ構成要素はｂｕｉｌｄチェーニングと併せて動作して、各割り当て後に、ＣＰＵ内の各レジスタの既知の値を計算して記録する。この情報はマシンの状態を表し、事実上、ａｓｓｉｇｎ構成要素が動作するコンテキストとしての役割を果たす。
【０６３３】
マシンの状態
マシンの状態は、各レジスタが、構築時に決定することができる値を含むか否か、決定することができる場合には値が何であるかを記録する。レジスタの値は、実行時でしか決定することができない場合には未知になる。以下の例では、マシンの状態は、以下の形式を有するＸＭＬペイロードに対応する。
【０６３４】
<eax>A</eax>
<ebx>B</ebx>
<ecx>C</ecx>
<edx>D</edx>
ここで、Ａ、Ｂ、Ｃ、又はＤはレジスタの１０進数値又は文字列「ｕｎｋｎｏｗｎ」に対応する。例えば、以下のようになる。
【０６３５】
<eax>0</eax>
<ebx>1</ebx>
<ecx>unknown</ecx>
<edx>10</edx>
この例はｘ８６ＣＰＵのレジスタのうち、４個のみのマシン状態を追跡するだけであり、これは様々なＣＰＵアーキテクチャに応じて拡張し変更することができることが理解できる。
【０６３６】
構成要素
ｂｕｉｌｄ中のすべての構成要素は、Ｉｎｉｔ＿ｅｌｆ、ｉｎｔ  ０×８０、Ｂｃａｔ及びＡｓｓｉｇｎ構成要素を含め、マシン状態サービスをサポートしなければならない。Ｉｎｉｔ＿ｅｌｆ構成要素は、値０を含むレジスタｅａｘ、ｅｂｘ、ｅｃｘ及びｅｄｘに対応するＬｉｎｕｘエグゼキュータブルのスタートアップマシン状態でビルドチェーニングを初期化する。Ａｓｓｉｇｎ構成要素は、マシン状態における一つのレジスタエントリの値を、割り当てるレジスタ及び値に一致するように設定する。ｉｎｔ  ０×８０構成要素は、この構成要素によって生成されるコードは、レジスタｅａｘの値を実行時に変更するシステムコールに対応するため、マシン状態におけるｅａｘエントリを「ｕｎｋｎｏｗｎ」に設定する。Ｂｃａｔはビルドチェーニングの一部を成し、コードチェーニングと並列してマシン状態チェーニングを提供することによってマシン状態をサポートし、これにより、各構成要素がマシン状態をチェーニング内の前の構成要素から受け取り、更新されたマシン状態を次の構成要素に送ることができる。
【０６３７】
この例は、主にＡｓｓｉｇｎ構成要素を使用してコンテキスト依存コーディングを示す。具体的には、Ａｓｓｉｇｎ構成要素の内部略図の一例を図３７Ａに示す。
【０６３８】
図に示すように、Ａｓｓｉｇｎ構成要素は、表７に機能をまとめた複数の下位構成要素から形成される。これら構成要素のそれぞれは、レジスタの指定の値への割り当てを実現する一つのルールを実装する。これら構成要素はすべて、Ｍｏｖ  ｉｍｍｅｄｉａｔｅを除き、既知のマシン状態に従属する結果コードを生成する。Ｍｏｖ  ｉｍｍｅｄｉａｔｅは、コンテキスト情報が利用可能ではない場合の後退した位置である。これら構成要素は非公開構成要素であり、公開市場に提供されるように設計されたものではないことを意味する。これら構成要素は単に、管理のためにＡｓｓｉｇｎ構成要素の設計の簡易化を助けるだけである。
【０６３９】
【表７】
0005456756.tif 000008
【０６４０】
各ルールは優先度順にテストされる。一致するものが見つかった場合、計算されたコードが出力され、後続するルール構成要素が結果コードをＢｕｉｌｄ  ＡＳＭ２構成要素に渡し、Ｂｕｉｌｄ  ＡＳＭ２構成要素はコード及び更新したマシン状態をビルドチェーニングに挿入する。
【０６４１】
Ａｄｄ  Ｏｔｈｅｒ構成要素の外部略図の一例を図８に示す。図３７Ｂ〜図３７Ｅは、Ａｄｄ  Ｏｔｈｅｒ構成要素の内部略図を示す。前の構成要素がすでに割り当てサービスを実行していた場合、Ｆｏｕｎｄ  Ｉｎエージェントは「ｔｒｕｅ」を受け取り、図３７Ｃに示す略図の構築を起動する。この略図は単に、前のルール構成要素が提供した結果を渡すだけである。エージェントＦｏｕｎｄ  Ｉｎが「ｆａｌｓｅ」の場合、図３７Ｄに示す略図が構築される。この略図は、各レジスタエントリをマシン状態情報から抽出し、次いでレジスタが既知の値を有しているか否かをテストする。既知の値を有する一つのレジスタがセレクトレジスタ構成要素によって選択される。複数のレジスタが既知の値を有する場合、ｓｅｌｅｃｔ  ｒｅｇｉｓｔｅｒ構成要素がランダムに選択する。この結果、コードはコンテキスト及び要件が同一の場合であっても可変であるため、出力コードがディザリングされる。
【０６４２】
図３７Ｄでは、エージェントＦｏｕｎｄ  ｍａｔｃｈが、図３７Ｃ又は図３７Ｅの略図の構築をトリガする。既知の値を有するレジスタが見つからなかった場合、図３７Ｃが構築される。これは、Ａｄｄ  Ｏｔｈｅｒルールがマシン状態コンテキストに一致しなかった場合に行われる。図３７Ｃは単に、要件を次のルール構成要素に渡し、図３７Ｄによって生成されたエージェントＣｈｏｓｅｎ  ｒｅｇを終了させるだけである。一致が見つかった場合、図３７Ｅが構築される。この略図は、適切なコードを生成し、マシン状態を更新する。
【０６４３】
この略図は、アセンブリコードで以下の構造を有するマシンコードを生成する。
【０６４４】
Mov Reg1, Reg2
Add Reg1, K
ここで、Ｒｅｇ１は割り当てるべきレジスタであり、Ｒｅｇ２は既知の値を含むレジスタであり、Ｋは、要求される割り当て値を得るためにＲｅｇ２の値に加算する必要がある数である。
【０６４５】
レジスタの既知の値の差を計算する。
【０６４６】
Ｒｅｇ１は、エージェントＲｅｇｉｓｔｅｒ  Ｉｎで受け取ったペイロードによって指定され、「ｅａｘ」、「ｅｂｘ」、「ｅｃｘ」、「ｅｄｘ」の一つに対応し、Ｒｅｇ２は、図３７Ｄによって既知のレジスタをサーチした結果としてエージェントＣｈｏｓｅｎ  ｒｅｇによって指定される。Ｋは、構成要素８１によりマシン状態から抽出されたＲｅｇ２（８０）の既知の値と、エージェントＶａｌｕｅ  Ｉｎによって指定される要求される割り当て値の間の差から計算される。
【０６４７】
生成されるマシンコードは二つの部分で計算され、第１の部分は、以下にに対応する。
【０６４８】
Mov Reg1, Reg2
Add Reg1
また、第２の部分は値Ｋに対応する。第１の部分は、ｌｏｏｋｕｐ  ｔａｂｌｅ構成要素８２を使用して、Ｒｅｇ１、Ｒｅｇ２情報を適切なマシンコードに変換することで計算される。
【０６４９】
ルックアップテーブルを指定するエージェント８３によって送られるペイロードの一例は以下である。
【０６５０】
<protocol>
<protocol_name>lookup table</protocol_name>
<protocol_data>
<entry>
<input>eaxeax</input>
<output>89C005</output>
</entry>
<entry>
<input>eaxebx</input>
<output>89D805</output>
</entry>
.....
</protocol_data>
</protocol>
このルックアップテーブルは、Ｒｅｇ１及びＲｅｇ２の各組み合わせごとに一つのエントリを含むため、レジスタｅａｘ、ｅｂｘ、ｅｃｘ、及びｅｄｘに１６個のエントリがある。第２のルックアップテーブル８４は、Ｋのコードを含め、送られたコードに対応するバイト数を出力する。
【０６５１】
構成要素８５、８６及び８７はＫを計算する。ｅｎｄｉａｎ構成要素８７は数をバイト単位で置換してｘ８６と互換性を有するようにする。次いでこれは命令マシンコードと連結され、最終的な出力コードを生成する。コードを生成することに加えて、マシン状態は構成要素８８、８９及び９０によって更新される。
【０６５２】
Ｈｅｌｌｏｗ  Ｗｏｒｌｄ例
この一例について、「ｈｅｌｌｏ  ｗｏｒｌｄ」プログラムに関連してこれより説明する。具体的には、構成要素を生成する「アセンブリ的な」コードで書かれた従来の「ｈｅｌｌｏ  ｗｏｒｌｄ」プログラムの例を以下に記す。
【０６５３】
BITS32
GLOBAL _start
section .text
_start:
mov ebx, 1 ;standard out
mov eax, 4 ;system write system call
mov ecx, string ;Pointer to string
mov edx, 11 ;Length of string
int 0x80 ;start system call
mov ebx, 0 ;exit error code
mov eax, 1 ;System exit system call
int 0x80 ;start system call
section .data
string db 'hello world'
これは、以下を使用してアセンブルされリンクされる。
【０６５４】
nasm -f elf hello. asm -o hello.o -l hello.lst
ld -s hello.o. -o hello
実行できる逆アセンブラを表８に示す。これはマシンコードを示し、以下を使用して作成された。
【０６５５】
ndisasm -e 128 -b 32 hello
従来のコードとの比較として、前述したａｓｓｉｇｎ構成要素を使用して同じプログラムを作成した。これは図３８Ａに示すルート略図を使用して実現した。
【０６５６】
完全にするために、図３８Ａに示す略図を表すＸＭＬ文書を以下に示す。
【０６５７】
<?xml version="1.0" encoding="UTF-8 ?>
<schematic>
<name>test</name>
<author>none</author>
<description>undescribed</description>
<w>400</w>
<h>460</h>
<agent>
<x>371</x>
<y>412</y>
<agent_id>2147483647<agent_id>
<agent_name>Code Out</agent_name>
<agent_description></agent_description>
<auto_term>manual</auto_term>
<persistance>persistance</persistance>
<payload></payload>
<optional>false</optional>
<auto_payload>false</auto_payload>
<hand_off>true</hand_off>
<sound_file></sound_file>
</agent>
...
<component>
<filename>/dream/asm/techreview/assign.comp</filename>
<schematic_component_id>1</schematic_component_id>
<x>190.0</x>
<y>66.0</y>
</component>
...
<link>
<half_link>
<schematic_component_id>10</schematic_component_id>
<agent_id>3</agent_id>
</half_link>
<half_link>
<schematic_component_id>17</schematic_component_id>
<agent_id>1</agent_id>
<half_link>
<anchor>
<x>190.0</x>
<y>66.0</y>
</anchor>
</link>
... 
</schematic>
従来の技術によって生成した結果コードと本発明により生成した結果コードの比較を表８に記す。
【０６５８】
【表８】
0005456756.tif 000009
【０６５９】
従って、両方のコードとも機能は同一であり、二つの論理ブロックをｐｒｉｎｔ  ｓｔｒｉｎｇ及びｓｙｓｔｅｍ  ｅｘｉｔの形態で含むことが理解できる。しかし、コンテキスト依存コードは、走らされるコンテキストを利用しているため、サイズが大幅に低減され、この例では、従来の技術の場合の３４バイトに対して２４バイトである。
【０６６０】
例えば、従来のコンテキスト独立コードは、Ｃプログラムｈｅｌｌｏ．ｃとして実装される場合である。
【０６６１】
main()[
printf("hello world");
]
そして、以下を使用して統計的にリンクしてストリップすると、
gcc -static hello.c -o hello
strip hello
３７７ｋＢのエグゼキュータブルになる。このプログラムはｐｒｉｎｔｆを使用し、ｐｒｉｎｔｆは汎用であり、かつコンテキストから独立したものであり、明らかにコードの膨張を際立たせる。
【０６６２】
この場合、コンテキスト独立の従来のｐｒｉｎｔ  ｓｔｒｉｎｇコードが再使用される場合、変更する必要があるのはストリングポインタ（０×８０４９０Ａ４）だけである。ｓｙｓｔｅｍ  ｅｘｉｔは完全にコンテキストから独立しており、再使用するために変更はまったく必要ない。
【０６６３】
しかし、コンテキストに依存したものでは、ｐｒｉｎｔ  ｓｔｒｉｎｇは、Ｌｉｎｕｘでのエグゼキュータブルのスタートアップ状態である、ｅａｘ、ｅｂｘ、ｅｃｘ及びｅｄｘがゼロの場合のみ働く。さらに、ｓｙｓｔｅｍ  ｅｘｉｔは、ｅｂｘが１の場合のみ働く。本例では、ｓｙｓｔｅｍ  ｅｘｉｔは、ｅｂｘがｐｒｉｎｔ  ｓｔｒｉｎｇコードによって１に初期化されることを利用する。
【０６６４】
Ｄｏｕｂｌｅ  ｐｒｉｎｔ  ｓｔｒｉｎｇ  "Ｈｅｌｌｏ  ｗｏｒｌｄ"
この例は、二つのｐｒｉｎｔ  ｓｔｒｉｎｇのシステムコールを使用して「Ｈｅｌｌｏ」を、次いで「ｗｏｒｌｄ」をプリントする。本発明によりこれを行う略図の一例を図３８Ｂに示し、手動で最適化されたコンテキスト独立コードと結果コードの比較を表９に示す。従来のアセンブリコードは以下の通りである。
【０６６５】
BITS32
GLOBAL _start
section .text
_start:
mov ebx, 1 ;standard out
mov eax, 4 ;system write system call
mov ecx, string1 ;Pointer to string1
mov edx, 6 ;Length of string1
int 0x80 ;start system call
mov ebx, 1 ;standard out
mov eax, 4 ;system write system call
mov ecx, string2 ;Pointer to string2
mov edx, 5 ;Length of string2
int 0x80 ;start system call
mov ebx, 0 ;exit error code
mov eax, 1 ;System exit system call
int 0x80 ;start system call
section .data
string1 db 'hello '
string2 db 'world'
この例では、コンテキスト独立例は手動で最適化され、当業者に理解されるように、同等の標準的なＣ＋＋プログラムと比較してサイズが大幅に低減される。重要なのは、コードバレーの２番目のｐｒｉｎｔ  ｓｔｒｉｎｇでは、ｅｃｘがｓｔｒｉｎｇ２のポインタに設定されることを出力する（ａｄｄ  ｅｃｘ，０×６）。この場合、前のｐｒｉｎｔ  ｓｔｒｉｎｇがｅｃｘをｓｔｒｉｎｇ１の値に初期化した。ｓｔｒｉｎｇ２のアドレスはｅｃｘの前の値に相対して計算される。これは、ａｓｓｉｇｎ構成要素内のＡｄｄ  ｓｅｌｆを使用して実現される。
【０６６６】
【表９】
0005456756.tif 000010
【０６６７】
この例では、コードの各生成において、Ｍｏｖ  ｏｔｈｅｒ、Ｉｎｃ  ｏｔｈｅｒ、Ｄｅｃ  ｏｔｈｅｒ及びＡｄｄ  ｏｔｈｅｒからランダムな出力がある。これらはそれぞれ、表１０に示すように複数のソリューションからランダムに選択する。これは、要件又はコンテキストを変更しなくとも、機能は同じでありながら、アプリケーションの要件を満たす異なる出力が生成されることを示す。
【０６６８】
【表１０】
0005456756.tif 000011
【図１】
0005456756.tif 000012
【図２】
0005456756.tif 000013
【図３Ａ】
0005456756.tif 000014
【図３Ｂ】
0005456756.tif 000015
【図５】
0005456756.tif 000016
【図６】
0005456756.tif 000017
【図７】
0005456756.tif 000018
【図８】
0005456756.tif 000019
【図９】
0005456756.tif 000020
【図１０Ａ】
0005456756.tif 000021
【図１０Ｂ】
0005456756.tif 000022
【図１０Ｃ】
0005456756.tif 000023
【図１０Ｄ】
0005456756.tif 000024
【図１０Ｅ】
0005456756.tif 000025
【図１１】
0005456756.tif 000026
【図１２】
0005456756.tif 000027
【図１３】
0005456756.tif 000028
【図１４】
0005456756.tif 000029
【図１５】
0005456756.tif 000030
【図１６】
0005456756.tif 000031
【図１７Ａ】
0005456756.tif 000032
【図１７Ｂ】
0005456756.tif 000033
【図１７Ｃ】
0005456756.tif 000034
【図１８Ａ】
0005456756.tif 000035
【図１８Ｂ】
0005456756.tif 000036
【図１８Ｃ】
0005456756.tif 000037
【図１８Ｄ】
0005456756.tif 000038
【図１８Ｅ】
0005456756.tif 000039
【図１９】
0005456756.tif 000040
【図２０Ａ】
0005456756.tif 000041
【図２０Ｂ】
0005456756.tif 000042
【図２１】
0005456756.tif 000043
【図２２】
0005456756.tif 000044
【図２３】
0005456756.tif 000045
【図２４Ａ】
0005456756.tif 000046
【図２４Ｂ】
0005456756.tif 000047
【図２４Ｃ】
0005456756.tif 000048
【図２５Ａ】
0005456756.tif 000049
【図２５Ｂ】
0005456756.tif 000050
【図２５Ｃ】
0005456756.tif 000051
【図２５Ｄ】
0005456756.tif 000052
【図２５Ｅ】
0005456756.tif 000053
【図２６Ａ】
0005456756.tif 000054
【図２６Ｂ】
0005456756.tif 000055
【図２６Ｃ】
0005456756.tif 000056
【図２６Ｄ】
0005456756.tif 000057
【図２６Ｅ】
0005456756.tif 000058
【図２６Ｆ】
0005456756.tif 000059
【図２６Ｇ】
0005456756.tif 000060
【図２７】
0005456756.tif 000061
【図２８Ａ】
0005456756.tif 000062
【図２８Ｂ】
0005456756.tif 000063
【図２８Ｃ】
0005456756.tif 000064
【図２９Ａ】
0005456756.tif 000065
【図２９Ｂ】
0005456756.tif 000066
【図３０Ａ】
0005456756.tif 000067
【図３０Ｂ】
0005456756.tif 000068
【図３１Ａ】
0005456756.tif 000069
【図３１Ｂ】
0005456756.tif 000070
【図３１Ｃ】
0005456756.tif 000071
【図３１Ｄ】
0005456756.tif 000072
【図３１Ｅ】
0005456756.tif 000073
【図３１Ｆ】
0005456756.tif 000074
【図３１Ｇ】
0005456756.tif 000075
【図３１Ｈ】
0005456756.tif 000076
【図３１Ｉ】
0005456756.tif 000077
【図３１Ｊ】
0005456756.tif 000078
【図３１Ｋ】
0005456756.tif 000079
【図３１Ｌ】
0005456756.tif 000080
【図３１Ｍ】
0005456756.tif 000081
【図３１Ｎ】
0005456756.tif 000082
【図３１Ｏ】
0005456756.tif 000083
【図３１Ｐ】
0005456756.tif 000084
【図３１Ｑ】
0005456756.tif 000085
【図３１Ｒ】
0005456756.tif 000086
【図３１Ｓ】
0005456756.tif 000087
【図３１Ｔ】
0005456756.tif 000088
【図３１Ｕ】
0005456756.tif 000089
【図３１Ｖ】
0005456756.tif 000090
【図３２Ａ】
0005456756.tif 000091
【図３２Ｂ】
0005456756.tif 000092
【図３２Ｃ】
0005456756.tif 000093
【図３３】
0005456756.tif 000094
【図３４Ａ】
0005456756.tif 000095
【図３４Ｂ】
0005456756.tif 000096
【図３５Ａ】
0005456756.tif 000097
【図３５Ｂ】
0005456756.tif 000098
【図３６Ａ】
0005456756.tif 000099
【図３６Ｂ】
0005456756.tif 000100
【図３６Ｃ】
0005456756.tif 000101
【図３７Ａ】
0005456756.tif 000102
【図３７Ｂ】
0005456756.tif 000103
【図３７Ｃ】
0005456756.tif 000104
【図３７Ｄ】
0005456756.tif 000105
【図３７Ｅ】
0005456756.tif 000106
【図３８Ａ】
0005456756.tif 000107
【図３８Ｂ】
0005456756.tif 000108
【図４】
0005456756.tif 000109