(57)【要約】並列処理開発環境は、並列処理ルーチンを作成するように、それを通して開発者が環境にアクセスしてもよい、インターフェースを提供するグラフィカルプロセス制御サーバを有する。開発環境はまた、並列処理ルーチンの認可および使用料を管理するための財務サーバを含み、並列処理ルーチンの開発者は、ルーチンに対して受容された認可および使用料の一部分を受容する。環境は、並列処理ルーチン内の盗用および悪質ソフトウェアを識別する。
2013536535.tif 000002
【特許請求の範囲】
【請求項１】
並列処理計算開発環境であって、
（ａ）カーネルおよび（ｂ）アルゴリズムのうちの少なくとも１つを含む、並列処理ルーチンを作成するように、それを通して少なくとも１人の開発者が前記開発環境にアクセスしてもよい、インターフェースを提供する、グラフィカルプロセス制御サーバと、
前記並列処理ルーチンの認可および使用料を管理するための財務サーバであって、前記並列処理ルーチンの前記開発者は、前記認可および使用料の一部分を受容する、財務サーバと
を含む、開発環境。
【請求項２】
前記財務サーバは、前記並列処理ルーチンについて、（ａ）認可費用、（ｂ）使用費用、および（ｃ）公開権限のうちの少なくとも１つを判定するように、少なくとも１人の管理者から入力を受容し、前記公開権限は、前記ルーチンが他の組織と共有されてもよいかどうかを示す、請求項１に記載の環境。
【請求項３】
第１の開発者は、第１のカーネルを作成するように前記開発環境にアクセスし、第２の開発者は、前記第１のカーネルを使用する第１のアルゴリズムを作成するように前記開発環境にアクセスし、
前記財務サーバは、認可料で前記第１のカーネルを前記第２の開発者に認可するため、および前記認可料の少なくとも一部分を前記第１の開発者に支払うために使用される、
請求項１に記載の開発環境。
【請求項４】
前記財務サーバは、前記第１の開発者による前記環境の利用の支払いとして、前記認可料の一部分を保持する、請求項３に記載の環境。
【請求項５】
第２のカーネルのプロファイルを作成し、前記カーネルの相対的性能を判定するように、前記第１のカーネルのプロファイル結果に対して前記第２のカーネルのプロファイル結果を比較する、開発サーバを含む、請求項３に記載の環境。
【請求項６】
少なくとも１人の開発者および複数の組織に関する情報を記憶するためのデータベースと、
前記開発者および前記組織と相互作用するようにインターフェースを提供するためのグラフィカルプロセス制御サーバと、
（ａ）前記開発者から、前記開発者の履歴書を受容し、（ｂ）前記組織のうちの少なくとも１つから、行われる任務の説明を受容するように、前記グラフィカルプロセス制御サーバと協働する、補助リソースサーバと
を含み、
前記補助リソースサーバは、前記少なくとも１人の開発者の前記履歴書に合致する仕事を提供する組織のリストを双方向に提供し、前記開発者による前記少なくとも１つの組織の選択を受容し、前記開発者の前記履歴書を前記選択された組織に伝送することが可能であり、前記組織のうちの１つは、前記履歴書の中の情報に基づいて行われる前記仕事に関する情報で前記開発者に応答する、並列処理開発環境。
【請求項７】
処理ノードのクラスタを含む、並列処理システム上で実行する並列処理ルーチンのプロファイルデータを自動的に判定するための並列処理開発環境内で動作するコンピュータ実装方法であって、
前記クラスタの単一の処理ノード上の試験データを処理し、第１の実行時間を判定するように、前記並列処理ルーチンを実行するステップと、
前記第１の実行時間をＮで割ることによって、前記クラスタのＮ個の処理ノード上の前記試験データを同時に処理するように、前記並列処理ルーチンを実行するための予測実行時間を開発サーバ内で計算するステップと、
前記クラスタのＮ個の処理ノード上の前記試験データを同時に処理し、第２の実行時間を判定するように、前記並列処理ルーチンを実行するステップと、
前記予測実行時間を前記第２の実行時間で割ることによって、前記並列処理ルーチンのアムダールスケーリングを前記開発サーバ内で計算するステップと
を含み、
前記アムダールスケーリングおよび前記第１の実行時間は、前記プロファイルデータの少なくとも一部を形成する、方法。
【請求項８】
前記並列処理ルーチンによって使用される最大量のＲＡＭを前記開発サーバ内で判定するステップをさらに含み、前記プロファイルデータは、前記使用される最大量のＲＡＭを含む、請求項７に記載の方法。
【請求項９】
前記並列処理ルーチンのうちのそれぞれに対する（ａ）定義されたカテゴリおよび（ｂ）定義されたキーワードのうちの少なくとも１つ、ならびに前記並列処理ルーチンのうちのそれぞれと関連付けられるキーワードに基づいて、
前記並列処理環境内で少なくとも１つの同様の並列処理ルーチンを選択するステップと、
参照プロファイルを判定するように、前記選択された同様の並列処理ルーチンのうちのそれぞれに対する実行および計算するステップを行うステップと、
選択された並列処理ルーチンに対して前記並列処理ルーチンを評価し、ランク付けするように、前記プロファイルデータを前記参照プロファイルのうちのそれぞれと比較するステップと
をさらに含む、請求項７に記載の方法。
【請求項１０】
並列処理ルーチンのソースコードの中の盗用を識別するためのコンピュータ実装方法であって、
（ａ）第１のソース比較ファイルを作成するように、候補ソースコードファイルから、書式設定、コメント、変数名、およびファイル名を除去するステップと、
（ｂ）前記候補ソースコードファイルの中の選択されたカテゴリおよびキーワードに基づいて、データベース内で同様の既存並列処理ルーチンを識別するステップと、
（ｃ）前記識別された並列処理ルーチンの次のソースコードファイルを選択するステップと、
（ｄ）第２のソース比較ファイルを形成するように、前記選択されたソースコードファイルから、書式設定、コメント、変数名、およびファイル名を除去するステップと、
（ｅ）前記第２のソース比較ファイルの中のコード文に合致する、前記第１のソース比較ファイルの中のある割合のコード文を判定するように、前記第１のソース比較ファイルを前記第２のソース比較ファイルと比較するステップと、
（ｆ）前記判定された割合が所定の値よりも大きい場合に、前記候補ソースコードファイルを拒絶するステップと、
（ｇ）ファイル比較が終了されるまで、または前記ソースコードファイルが拒絶されるまで、前記候補ソースコードファイルを前記選択されたソースコードファイルと比較するように、ステップ（ｃ）から（ｆ）を繰り返すステップと、
（ｈ）前記判定された割合が前記所定の値よりも大きい場合に、前記候補ソースコードファイルが前記選択されたソースコードを盗用したことを判定するステップと
を含む、方法。
【請求項１１】
各前記ソースコードファイルに対する前記ソースコードの複数のインスタンスは、前記ソース比較ファイルのうちのそれぞれを生成するように作成され、
前記インスタンスのうちのそれぞれは、それぞれのコードブロック内の独立文の１つの順列を表し、
各前記順列は、配置が特定のコードブロック内のいずれの文の従属関係にも影響しないならば、任意の関連文とともに、独立しているものとして判定されるソースコード文を、前記ブロック内に配置することによって作成される、請求項１０に記載の方法。
【請求項１２】
各前記順列は、前記ソースコードファイルのうちのそれぞれの中の前記ソフトウェアコード文を、それらを分離するルーピングまたは分岐文を伴わずに、２つ以上のコード文を含むブロックにグループ化することによって、作成され、
独立しているものとして判定される前記ソースコード文は、コードブロック内の任意の先行代入文の左側でも見出される、その同じブロック内の代入文の右側で見出される変数を含まない、請求項１１に記載の方法。
【請求項１３】
並列処理システム用のソースコードの中の盗用を識別するためのコンピュータ実装方法であって、
複数の編集済みソースコードファイルを作成するように、複数のソースコードファイルからの非命令文字、コメント、変数名、およびファイルを編集するステップと、
複数の残りの編集済みソースコードファイルの中のコード文に合致する、前記編集済みソースコードファイルのうちの第１のソースコードファイルの中のある割合のコード文を判定するように、前記編集済みソースコードファイルのうちの前記第１のソースコードファイルを、前記複数の残りの編集済みソースコードファイルのうちのそれぞれと比較するステップと、
前記判定された割合が所定の値よりも大きい場合、前記編集済みソースコードファイルのうちの前記第１のソースコードファイルが、前記残りの編集済みソースコードファイルを盗用したことを判定するステップと
を含む、方法。
【請求項１４】
前記ソースコードファイルのそれぞれに対する前記ソースコードの複数のインスタンスは、前記ソース比較ファイルのうちのそれぞれを生成するように作成され、前記インスタンスのうちのそれぞれは、それぞれのコードブロック内の独立文の１つの順列を表す、請求項１３に記載の方法。
【請求項１５】
各前記順列は、前記ソースコードファイルのうちのそれぞれの中の前記ソフトウェアコード文を、それらを分離するルーピングまたは分岐文を伴わずに、２つ以上のコード文を含むブロックにグループ化することによって、作成される、請求項１３に記載の方法。
【請求項１６】
並列処理機能のソースコードの中の盗用を識別するためのコンピュータ実装方法であって、
第１の構成要素編集比較ファイルを作成するように、ソースコードファイルの中の候補関数からの非命令文字、コメント、変数名、およびファイル名を編集するステップと、
同様の関数の間の合致、および前記候補関数を含有するソースコードファイルの中の選択されたカテゴリおよびキーワードに基づいて、データベース内の前記同様の関数を識別するステップと、
前記識別された同様の関数の中の次の関数を選択するステップと、
第２の構成要素編集比較ファイルを形成するように、前記選択された次の関数からの非命令文字、コメント、変数名、およびファイル名を編集するステップと、
前記第２の構成要素編集比較ファイルの中のコード文に合致する、前記第１の構成要素編集比較ファイルの中のある割合のコード文を判定するように、前記構成要素編集比較ファイルを前記第２の構成要素編集比較ファイルと比較するステップと、
前記判定された割合が所定の値よりも大きい場合、前記ソースコードファイルの中の前記候補関数が前記選択された次の関数を盗用したことを判定するステップと
を含む、方法。
【請求項１７】
並列処理ルーチンの開発を促進するためのシステムであって、
前記並列処理ルーチンを作成するように、それを通して少なくとも１つの開発者サーバが前記システムの開発環境にアクセスしてもよい、インターフェースを含む、グラフィカルプロセス制御サーバと、
前記グラフィカルプロセス制御サーバから前記並列処理ルーチンを受容し、データベース内に前記並列処理ルーチンを記憶するための開発サーバと、
前記並列処理ルーチンについて、（ａ）認可料および（ｂ）使用料のうちの一方または両方を得るための財務サーバであって、前記財務サーバは、前記未払い認可料の少なくとも一部および前記未払い使用料の少なくとも一部を前記システムの所有者に分配することが可能であり、前記財務サーバは、さらに、前記未払い認可料の少なくとも一部および前記未払い使用料の少なくとも一部を前記並列処理ルーチンの開発者に分配することが可能な財務サーバと
を含む、システム。
【請求項１８】
並列処理ルーチンの開発者への経済報酬を追跡するための方法であって、
前記並列処理ルーチンの開発環境の財務サーバ内で、前記並列処理ルーチンと関連付けられる認可料を得るステップと、
前記財務サーバ内で、前記並列処理ルーチンの使用と関連付けられる使用料を得るステップと、
前記未収認可料の少なくとも一部および前記未収使用料の少なくとも一部を前記並列処理ルーチンの開発者に分配するステップと
を含む、方法。
【発明の詳細な説明】
【背景技術】
【０００１】
本願は、２０１０年８月２６日に出願された、米国仮出願シリアル番号第６１／３７７，４２２号の利益を主張するものであり、該仮特許出願は、参照により本明細書中に援用される。
【０００２】
従来の並列処理ソフトウェア開発モデルは、（ａ）開発者に対する収益を生じない（オープンソース、ＧＰＬモデル）、（ｂ）企業環境内で共有すること（会社または支配組織の裁量での利益共有）によって開発者に支払う、（ｃ）プログラミング任務（コンサルティング）ごとに開発者に支払う、または（ｄ）期間ごとに開発者に支払う（給与モデル）。これらの支払モデルは、何らかの支配会社の裁量である。したがって、開発者は、労働の報酬を完全には受けない場合がある。
【０００３】
支配会社自体は、典型的には、完成したアプリケーションのみに対する報酬を受容する。例外は、会社が特殊化した機能のライブラリを作成し、ライブラリ全体を販売する場合である。ソフトウェアを書くことは、たとえ同じまたは他の組織が必要機能性をすでに開発していたとしても、開発者が何度も繰り返して種々のソフトウェアコード構成要素を再開発する必要があって、非常に時間がかかる。これは、以前に作成されたソフトウェア構成要素を識別し、それらにアクセスする方法が現在ないためである。欠けているものは、１）必要なソフトウェア機能性を迅速に識別することができ、２）そのようなコードに容易にアクセスすることができ、３）基礎的ソフトウェアコードが盗用から本質的に保護され、４）発信元会社がそれらの機能性の使用から報酬を受容することができるように、複数の非関連組織からの開発者が、有用なソフトウェア機能性を共有することを可能にする、ビジネスモデルである。
【０００４】
現在、個人または組織は、購入者の機器に基礎的コードのコピーを置く、アプリケーションの単一のコピーを購入することができる。これは、購入者が、基礎的コードを複製し、重複コードを再パッケージ化し、元の開発組織への謝礼を伴わずに重複コードを再販することを可能にできる。アプリケーション開発中に、その競争相手と比べて性能利点があるかどうかを開発組織が知ることは、非常に困難となり得る。同様に、アプリケーションプログラム購入者は、主にアプリケーション作成組織の請求権に依存しなければならず、一対一の比較能力はほとんど利用可能ではない。アプリケーションの性能は、そのアプリケーションによって処理される特定のデータの関数となり得るため、ユーザの条件下で複数のアプリケーションの性能を比較する能力は、アプリケーション購入者にとって極度に貴重となり得て、第三者評価を通して直接利用可能ではない。
【発明の概要】
【課題を解決するための手段】
【０００５】
並列処理開発環境を利用する組織は、１人以上の管理者と、０人以上の開発者とを含んでもよい。組織は、並列処理開発環境を利用する従業員がいる実際の会社を表してもよく、または並列処理開発環境を使用して並列処理ルーチンを開発するように協働する個人の集合体を表してもよい。
【０００６】
並列処理開発環境は、クライアント／サーバベース、マルチコア、マルチサーバグラフィカルプロセス制御、コンピュータプログラム管理、およびアプリケーション構築共同システムを表す。
【図面の簡単な説明】
【０００７】
【図１】図１は、一実施形態における、１人以上の開発者が、処理ノードのクラスタ上で作動する並列処理ルーチンを作成し、管理することを可能にする、１つの例示的な並列処理開発環境を示す。
【図２】図２は、一実施形態における、３つのカーネルおよび別のアルゴリズムを含む、開発者によって作成された１つの例示的なアルゴリズムを示す。
【図３】図３は、図１のクラスタを使用してデータを処理するプログラムを選択することによって、ユーザがタスクを行うように図１の管理サーバのプログラムにアクセスする、１つの例示的なシナリオを示す。
【図４】図４は、試験データを処理する第１のルーチンの性能を、試験データを処理する第２のルーチンの性能と比較するための図１の開発サーバの例示的使用を示す。
【図５】図５は、一実施形態における、並列処理ルーチンのアムダールスケーリングを自動的に判定するための１つの例示的な方法を示す。
【図６】図６は、図１の環境内に記憶された１つ以上の他の並列処理ルーチンに対して、第１の並列処理ルーチンを自動的に評価するための１つの例示的な方法を図示するフローチャートである。
【図７Ａ】図７Ａおよび７Ｂは、第１の開発者によって図１の環境に提出された例示的な第１のソフトウェアソースコードを示す。
【図７Ｂ】図７Ａおよび７Ｂは、第１の開発者によって図１の環境に提出された例示的な第１のソフトウェアソースコードを示す。
【図８Ａ】図８Ａおよび８Ｂは、第２の開発者によって図１の環境に提出された例示的な第２のソフトウェアソースコードを示す。
【図８Ｂ】図８Ａおよび８Ｂは、第２の開発者によって図１の環境に提出された例示的な第２のソフトウェアソースコードを示す。
【図９】図９は、一実施形態における、ソフトウェアソースコードの中の盗用の割合を判定するための１つの例示的な方法を示す。
【図１０】図１０は、編集済み機能的構成要素へのソフトウェアソースコードの編集のための１つの例示的な編集プロセスを示す。
【図１１】図１１、１２、１３、および１４は、図８Ａおよび８Ｂのソフトウェアソースコードの関数の例示的な関数表および変数表を示す。
【図１２】図１１、１２、１３、および１４は、図８Ａおよび８Ｂのソフトウェアソースコードの関数の例示的な関数表および変数表を示す。
【図１３】図１１、１２、１３、および１４は、図８Ａおよび８Ｂのソフトウェアソースコードの関数の例示的な関数表および変数表を示す。
【図１４】図１１、１２、１３、および１４は、図８Ａおよび８Ｂのソフトウェアソースコードの関数の例示的な関数表および変数表を示す。
【図１５】図１５は、書式設定、コメント、変数名、およびファイル名を除去することによって、図８Ａおよび８Ｂのソースコードから生成された１つの例示的なソース比較ファイルを示す。
【図１６】図１６は、図１５のソース比較ファイル内の関数をサイズの昇順で順序付けることによって生成された１つの例示的なソース比較ファイルを示す。
【図１７】図１７、１８、および１９は、それぞれ図８Ａおよび８Ｂのソフトウェアソースコードから生成された、第１の関数「ｐｏｗｅｒ」、第２の関数「ｐｏｗｅｒ１」、および第２の関数「ｍａｉｎ」に対する例示的な構成要素編集ファイルを示す。
【図１８】図１７、１８、および１９は、それぞれ図８Ａおよび８Ｂのソフトウェアソースコードから生成された、第１の関数「ｐｏｗｅｒ」、第２の関数「ｐｏｗｅｒ１」、および第２の関数「ｍａｉｎ」に対する例示的な構成要素編集ファイルを示す。
【図１９】図１７、１８、および１９は、それぞれ図８Ａおよび８Ｂのソフトウェアソースコードから生成された、第１の関数「ｐｏｗｅｒ」、第２の関数「ｐｏｗｅｒ１」、および第２の関数「ｍａｉｎ」に対する例示的な構成要素編集ファイルを示す。
【図２０】図２０、２１、２２、および２３は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、１つの例示的な第２の関数表、および３つの第２の変数表を示す。
【図２１】図２０、２１、２２、および２３は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、１つの例示的な第２の関数表、および３つの第２の変数表を示す。
【図２２】図２０、２１、２２、および２３は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、１つの例示的な第２の関数表、および３つの第２の変数表を示す。
【図２３】図２０、２１、２２、および２３は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、１つの例示的な第２の関数表、および３つの第２の変数表を示す。
【図２４】図２４は、書式設定、コメント、変数名、およびファイル名を除去することによって、図７Ａおよび７Ｂのソフトウェアソースコードから生成された１つの例示的なソース比較ファイルを示す。
【図２５】図２５は、図２４のソース比較ファイル内の関数を昇順で順序付けることによって生成された１つの例示的なソース比較ファイルを示す。
【図２６】図２６、２７、および２８は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、関数「ｐｏｗｅｒ」、「ｐｏｗｅｒ１」、および「ｍａｉｎ」に対する例示的なソース比較ファイルを示す。
【図２７】図２６、２７、および２８は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、関数「ｐｏｗｅｒ」、「ｐｏｗｅｒ１」、および「ｍａｉｎ」に対する例示的なソース比較ファイルを示す。
【図２８】図２６、２７、および２８は、それぞれ図７Ａおよび７Ｂのソフトウェアソースコードから生成された、関数「ｐｏｗｅｒ」、「ｐｏｗｅｒ１」、および「ｍａｉｎ」に対する例示的なソース比較ファイルを示す。
【図２９】図２９は、ソフトウェアソースコードファイルから生成された例示的なデータファイルを示す。
【図３０】図３０は、コードブロック、独立文、および従属文を図示する、例示的なソフトウェアソースコードの断片を示す。
【図３１Ａ】図３１Ａは、図１６および２５のソース比較ファイルのうちのそれぞれの最初の１９文字の間の合致を図示する、１つの例示的な表を示す。
【図３１Ｂ】図３１Ｂは、図３１Ａの表へのＮｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ方程式の適用に起因する、例示的な表を示す。
【図３１Ｃ】図３１Ｃは、間隙検出のための規定を図示する、例示的なＳｍｉｔｈ−Ｗａｔｅｒｍａｎドット表を示す。
【図３１Ｄ】図３１Ｄ−Ｆは、バージョンＸと既存のソフトウェアソースコードとの間の盗用率合致を図示する、例示的なシナリオを示す。
【図３１Ｅ】図３１Ｄ−Ｆは、バージョンＸと既存のソフトウェアソースコードとの間の盗用率合致を図示する、例示的なシナリオを示す。
【図３１Ｆ】図３１Ｄ−Ｆは、バージョンＸと既存のソフトウェアソースコードとの間の盗用率合致を図示する、例示的なシナリオを示す。
【図３２】図３２は、一実施形態における、ソフトウェアソースコード内の悪質ソフトウェア挙動を検出する時に使用される例示的なファイルを示す。
【図３３】図３３は、開発者によって図１の環境に提出された例示的なソフトウェアソースコードを示す。
【図３４】図３４は、増補ソースコードを形成するように図３３のソフトウェアソースコードを改正するための１つの例示的なプロセスを示す。
【図３５】図３５は、追跡ファイルを作成し、開くための１つの例示的なコード挿入を示す。
【図３６】図３６は、現在の日付および時間ならびに区分番号を追跡ファイルに添付するように関数を呼び出す、１つの例示的なコード挿入を示す。
【図３７】図３７は、追跡ファイルを閉じるための１つの例示的なコード挿入を示す。
【図３８Ａ】図３８Ａおよび３８Ｂは、図３３のソフトウェアソースコード内の例示的なコード挿入を示す。
【図３８Ｂ】図３８Ａおよび３８Ｂは、図３３のソフトウェアソースコード内の例示的なコード挿入を示す。
【図３９】図３９は、図３３のソフトウェアソースコード内の例示的なコメント挿入を示す。
【図４０Ａ】図４０Ａおよび４０Ｂは、実行時に変数の開始アドレスを判定するように、図３２の増補ソースコード内の可変アドレス検出コードの例示的な配置を示す。
【図４０Ｂ】図４０Ａおよび４０Ｂは、実行時に変数の開始アドレスを判定するように、図３２の増補ソースコード内の可変アドレス検出コードの例示的な配置を示す。
【図４１】図４１は、変数情報を記憶するための１つの例示的な追跡表を示す。
【図４２】図４２は、現在のアドレス検出関数の出力を図示する、１つの例示的な表を示す。
【図４３】図４３は、１つの例示的な割り付けられたリソースの表を示す。
【図４４Ａ】図４４Ａおよび４４Ｂは、図３２の増補ソースコードへの例示的な増補を示す。
【図４４Ｂ】図４４Ａおよび４４Ｂは、図３２の増補ソースコードへの例示的な増補を示す。
【図４５Ａ】図４５Ａおよび４５Ｂは、条件付き分岐強制を伴う図３２の増補ソースコードを示す。
【図４５Ｂ】図４５Ａおよび４５Ｂは、条件付き分岐強制を伴う図３２の増補ソースコードを示す。
【図４６】図４６は、１つの例示的な関数・構造図を示す。
【図４７Ａ】図４７Ａおよび４７Ｂは、返信された、以前に実行された区分番号を評価し、「ｇｏｔｏ」コマンドを条件付きで実行するタグおよびコードを含むための図３２の増補ソースコードの例示的な改正を示す。
【図４７Ｂ】図４７Ａおよび４７Ｂは、返信された、以前に実行された区分番号を評価し、「ｇｏｔｏ」コマンドを条件付きで実行するタグおよびコードを含むための図３２の増補ソースコードの例示的な改正を示す。
【図４８】図４８は、カーネルおよびアルゴリズムを示す、１つの例示的なアルゴリズムトレース表示を示す。
【図４９】図４９は、環境を利用する開発者、管理者、および組織に補助サービスを提供する、補助リソースサーバを伴う図１の環境を示す。
【図５０】図５０は、ソフトウェアコード文で見出されるコードの並べ替えられた複数のインスタンスを生成するための例示的な方法を示すフローチャートである。
【発明を実施するための形態】
【０００８】
図１は、１人以上の開発者が、処理ノード１１３のクラスタ１１２上で作動する並列処理ルーチンを作成し、管理することを可能にする、１つの例示的な並列処理計算開発環境１００を示す。並列処理ルーチンは、（ａ）１つ以上のカーネルおよび（ｂ）１つ以上のアルゴリズムのうちの一方または両方から成る。本明細書で使用されるように、「カーネル」は、クラスタ１１２の１つ以上の処理ノード１１３によって実行された時に、データを処理するように特定の機能を果たす、ソフトウェアモジュールである。
【０００９】
環境１００は、それを通して１人以上の開発者１５２が同時に環境１００にアクセスしてもよい、インターネット１５０へのインターフェースを提供する、グラフィカルプロセス制御サーバ１０４を含む。環境１００はまた、カーネル１２２、アルゴリズム１２４、組織１２６、ユーザ１２８、データベース１３０、および使用情報１３２用の１つ以上のデータベースも含む。環境１００の開発サーバ１０８は、グラフィカルプロセス制御サーバ１０４およびデータベース１０６と協働して、カーネル１２２およびアルゴリズム１２４の作成および維持を促進する。環境１００のプログラム管理サーバ１１０は、１つ以上のアルゴリズム１２４およびカーネル１２２を実行するように、環境１００のクラスタ１１２へのアクセスを促進する。
【００１０】
図１に図示されるように、開発者１５２は、これらの開発者によって作成されるカーネル１２２およびアルゴリズム１２４が、各組織１５４のために構成される制御に基づいて組織化され、アクセスされるように、組織１５４にグループ化されてもよい。各組織１５４はまた、組織１５４内の各作成されたカーネルおよびアルゴリズムへのアクセス、およびその費用を制御する、１人以上の管理者１５８を含んでもよい。例えば、開発者１５２（１）によって作成される各カーネルは、管理者１５８（１）によって試験され、承認され、次いで、組織１５４（２）内の開発者１５２（３）、１５２（４）による等、他の組織内の開発者による使用のために公開される。管理者１５８は、組織１５４内の開発者１５２によって作成される各カーネル１２２およびアルゴリズム１２４に対する認可料および使用費用を定義してもよい。
【００１１】
図１に示されるように、クラスタ１１２の処理ノード１１３は、並行して１つ以上の並列処理ルーチンを処理するためのハワードカスケードに形成されてもよい。
【００１２】
開発サーバ１０８は、開発者１５２が、グラフィカルプロセス制御サーバ１０４との相互作用を通して、環境１００内で試験するためにカーネルおよび／またはアルゴリズムを提出することを可能にする。開発サーバ１０８は、データベース１０６内で、開発者１５２および組織１５４と関連して受容したカーネルおよびアルゴリズムを記憶する。一実施形態では、データベース１０６は、関係型データベースおよびファイル記憶を表す。付加的な制御情報は、各カーネルおよびアルゴリズムのアクセスおよび費用を定義する、これらのカーネルおよびアルゴリズムと関連して、データベース１０６内で（例えば、示されていない別個のデータベース表内で）記憶される。
【００１３】
環境１００はまた、組織カーネルおよびアルゴリズムのうちのそれぞれに対して受容される認可料および使用料に基づいて、支払いを組織１５４、管理者１５８、および開発者１５２に提供する、財務サーバ１０２も含む。例えば、組織１５４（１）の開発者１５２（１）によって開発されたカーネル１２２は、組織１５４（２）の開発者１５２（３）によって開発されたアルゴリズム１２４に組み込まれてもよい。カーネル１２２に対する管理者１５８（１）によって定義される認可料は、組織１５４（２）によって支払われ、認可料の第１の部分は、開発者１５２（１）に分配され、認可料の第２の部分は、管理者１５８（１）に分配され、認可料の第３の部分は、組織１５４（１）に分配される。認可料の第４の部分は、環境１００の使用の支払いとして、財務サーバ１０２によって得られてもよい。つまり、環境１００は、各開発者および管理者に対する接続および使用時間を請求しなくてもよいが、代わりに、各カーネルおよびアルゴリズムと関連付けられる認可料および使用料の割合に基づいて、経済的補償を受容する。同様に、開発されたアルゴリズムは、環境１００を通して他の組織へ販売されてもよく、販売からの収益は、所有組織、その管理者、およびその開発者に分配されてもよく、環境１００は全体的な販売価格の割合を受容する。
【００１４】
データベース１０６内の各カーネル１２２およびアルゴリズム１２４は、環境１００内の各カーネルおよびアルゴリズムを分類する、定義されたカテゴリおよび一式のキーワードを有する。カテゴリは、「相互通信」、「画像処理」、「ｍｍｏゲーム用ツール」等を含んでもよい。付加的なキーワードが、必要なパラメータおよびデータ出力形式等のそれらの特徴を詳細に定義するように、各カーネルおよびアルゴリズムと関連付けられてもよい。データベース１０６内に記憶されたカーネルおよびアルゴリズムは、カテゴリおよび／または１つ以上のキーワードを入力する開発者によって選択されてもよい。
【００１５】
図２は、これらのカーネル２０４（１）、２０４（２）、および２０４（３）から開発者２５２（５）によって作成される１つの例示的なアルゴリズム２２２、および別のアルゴリズム２０２（１）を示す。カーネル２０４（１）は、開発者２５２（１）によって作成され、カーネル２０４（２）および２０４（３）は、開発者２５２（２）によって作成され、アルゴリズム２０２（１）は、開発者２５２（３）によって作成され、開発者２５２（４）によって作成されるカーネル２０４（４）を含む。
【００１６】
各カーネル（例えば、カーネル２０４）は、図１のクラスタ１１２上で作動し、１人以上の開発者１５２によって開発される、ソフトウェアルーチンを表す。アルゴリズム（例えば、アルゴリズム２０２（１））は、クラスタ１１２上で作動する時に所望の機能を提供するように組み合わせられる、１つ以上のカーネルおよび／または他のアルゴリズムを表す。カーネル２０４およびアルゴリズム２０２は、それぞれ、図１のカーネル１２２およびアルゴリズム１２４を表してもよい。各カーネル２０４およびアルゴリズム２０２は、カーネル／アルゴリズムが使用される度に支払われる、定義された使用費用２１０と、カーネル／アルゴリズムの定義された認可期間に支払われる、定義された認可費用２０８とを有する。
【００１７】
図２の実施例では、アルゴリズム２２２は、カーネル２０４（１）、２０４（２）、２０４（３）、およびアルゴリズム２０２（１）を組み合わせることによって作成される。アルゴリズム２２２は同様に、認可された時に他のアルゴリズム内に含まれてもよい。矢印２１２は、カーネル２０４とアルゴリズム２０２（１）との間のデータフローを表す。図２に示されるように、アルゴリズム２２２は、定義されたカテゴリ２０６と、認可費用２０８と、使用費用２１０とを有する。随意で、キーワードはまた、他の開発者によるアルゴリズム２２２の選択を促進するように、アルゴリズム２２２と関連付けられてもよい。アルゴリズム２２２が、カーネル２０４と、アルゴリズム２０２（１）とを含むため、認可費用２０８（６）は、認可費用２０８（１）、２０８（２）、２０８（３）、および２０８（４）の合計に等しい、またはそれよりも大きい。同様に、使用費用２１０（６）は、使用費用２１０（１）、２１０（２）、２１０（３）、および２１０（４）の合計に等しい、またはそれよりも大きい。同様に再度、使用費用２１０（４）は、カーネル２０４（４）の使用費用２１０（５）に等しく、またはそれよりも大きく、認可費用２０８（４）は、カーネル２０４（４）の認可費用２０８（５）に等しい、またはそれよりも大きい。
【００１８】
一実施形態では、環境１００は、新しいアルゴリズムの作成時に、使用費用および認可費用が、それぞれ、その中に含まれる構成要素の使用費用および構成要素費用の合計に等しい、またはそれよりも大きいことを確実にする。具体的には、アルゴリズム２２２が認可（または使用）された時に、環境１００は、その中に含まれる各カーネル２０４およびアルゴリズム２０２の開発者１５２が、アルゴリズム２２２に支払われる認可料２２０および／または使用料２３０の適切な部分を受容することを確実にする。
【００１９】
アルゴリズム２２２を作成する時に、開発者１５２は、その中で使用される各カーネル２０４およびアルゴリズム２０２に対する認可を必要とする。したがって、開発者１５２は、これらのカーネルおよびアルゴリズムのうちのそれぞれに対する認可が開発者１５２によってすでに保持されていない限り、各カーネル２０４および／またはアルゴリズム２０２の新しい認可を支払う。環境１００は、開発者１５２が新しいアルゴリズム内に任意の選択されたカーネル２０４および／またはアルゴリズム２０２を含むことを可能にする前に、開発者１５２が任意の必要な認可費用２０８を支払うことを確実にするように動作する。
【００２０】
いったん新しいカーネルまたはアルゴリズムが作成されると、作成組織内で使用するために非公開のままであってもよく、または他の組織内の開発者による使用のために公開されてもよい。一実施形態では、各クライアント１５６内の図１のユーザインターフェース１６０は、そのクライアントでログインした開発者１５２に利用可能なカーネル２０４およびアルゴリズム２０２のみを表示する。ユーザインターフェース１６０は、付属書Ａ内で詳細に説明される。
【００２１】
環境１００は、カーネル２０４およびアルゴリズム２０２、２２２の認可および使用を制御し、それらの実収使用および認可料を追跡し、それにより、開発者が開発されたルーチンおよびアルゴリズムからの収入を共有することを可能にする。さらに、開発されたソフトウェアの共有および再利用が、認可料および使用料の自動制御および支払いを通して、環境１００によって促され、報酬を受ける。
【００２２】
並列処理アルゴリズム（例えば、カーネルおよびアルゴリズム）を作成し、公開するように開発者を促すために、環境１００は、環境１００によって提供される施設の使用の代金を開発者に請求しない。むしろ、環境１００は、認可および使用される際に、各カーネルおよびアルゴリズムによって得られる、一定の割合の使用料および認可料を保持する。この料金は、要求された収入の流れが妨げられないままであるように、他の料金に追加される。
【００２３】
図３は、クラスタ１１２を使用してデータ３０６を処理するプログラム３０４を選択することによって、ユーザ３５２がタスク３０２を行うように環境１００のプログラム管理サーバ１１０にアクセスする、１つの例示的なシナリオ３００を示す。プログラム管理サーバ１１０は、例えば、開発者１５２によってクラスタ１１２上で作動するために開発される、複数の（例えば、データベース１０６内に）記憶された並列処理ルーチン（例えば、カーネルおよびアルゴリズム）からのプログラム３０４の選択を可能にするように、インターネット１５０を介してユーザ３５２と相互作用する、グラフィカルインターフェースを提供してもよい。プログラム管理サーバ１１０は、各プログラムについて、データベース１０６内に記憶され、ユーザ３５２が、費用および性能とともにデータ処理要件に基づいて、プログラム３０４の知識に基づく選択を行ってもよいように、詳細な費用および機能性情報をユーザ３５２に提供してもよい。ユーザ３５２は、インターネット１５０を介してデータ３０６を環境１００にアップロードし、またはデータ３０６をクラスタ１１２に提供するための他の手段を使用してもよい。
【００２４】
データ３０６を処理するようにクラスタ１１２上でプログラム３０４を実行すると、プログラム管理サーバ１１０は、プログラム３０４の使用費用に基づいてユーザ３５２によって支払い可能である、適切な使用料３２０、データ３０６のサイズおよび種類、プログラム３０４を実行するために選択されるクラスタ１１２の処理ノード１１３の数を判定する。プログラム管理サーバ１１０は、財務サーバ１０２が、プログラム３０４の構成要素に基づいて、開発者１５２に対する支払い３２２を判定してもよいように、使用料３２０について財務サーバ１０２に知らせてもよい。図２および３の実施例を使用して、プログラム３０４は、アルゴリズム２２２、したがって、カーネル２０４（１）、２０４（２）、２０４（３）、および２０４（４）の開発者１５２を含み、アルゴリズム２０２（１）およびアルゴリズム２２２の開発者は、それぞれ、各含まれた構成要素の定義された使用費用２１０に基づいて、使用料３２０の適切な部分（支払い３２２（１）−３２２（５）として示される）を受容する。財務サーバ１０２は、クラスタ１１２上で実行される各プログラム（例えば、プログラム３０４）の中の構成要素の使用に基づいて、各開発者１５２への支払いを得る。
【００２５】
財務サーバ１０２はまた、開発者１５２（１）−（５）がアルゴリズム２２２に貢献したため、これらの開発者による環境１００の使用の支払いとして、ある割合の使用料３２０を保留する。ユーザ３５２は、特定のタスクのために、より高い性能の処理を選択し、環境１００から、そのより高い性能に対する特別料金を支払ってもよい。より高い性能の処理のために選択されるタスクは、クラスタ１１２の付加的な処理ノードを利用してもよく、または優先順位の低いタスクノード要求に優先して、ノードがタスクに割り付けられることを確実にする、より高い優先順位を有してもよい。このより高い性能の処理に対する支払いは、環境１００の使用の代金を支払うためだけに使用され、開発者には支払われない。
【００２６】
環境１００内に記憶された並列処理ルーチン（例えば、カーネルおよびアルゴリズム）およびデータベース（例えば、図１のデータベース１３０）は、組織、その組織内のカテゴリ、および所与の名前によって分離される。動作の一実施例では、開発者１５２は、最初に、ユーザインターフェース１６０から組織を選択し、次いで、カテゴリを選択し、次いで、所望の並列処理ルーチンおよび／またはデータベースの名前を選択する。開発者１５２はまた、特定の組織およびカテゴリについてユーザインターフェース１６０内で表示される、並列処理ルーチンおよびデータベースの数を限定する、キーワードリストをユーザインターフェース１６０内で定義してもよい。
【００２７】
「Ｍａｓｓｉｖｅｌｙ  Ｐａｒａｌｌｅｌ  Ｔｅｃｈｎｏｌｏｇｉｅｓ」は、ユーザインターフェース１６０のボタンまたは制御上で「ＭＰＴ」と略称されてもよい、１つの例示的な組織名である。組織名がユーザインターフェース１６０内で略称される場合、開発者が略称上にマウスを「合わせる」と、完全な組織名が表示される。組織内で、例示的なカテゴリは、「相互通信」、「画像処理」、および「ｍｍｏゲーム用ツール」である。これらのカテゴリは、いったん組織が選択されると、ユーザインターフェース１６０内に現れる。例示的な並列処理ルーチン名は、「ＰＡＡＸ交換」、「ＦＡＡＸ交換」、および「ハワードカスケード」である。
【００２８】
動作の一実施例では、開発者１５２（５）は、最初に、組織１５４（３）の名前「ＭＰＴ」を選択し、次いで、カテゴリ相互通信を選択し、次いで、ハワードカスケードと呼ばれるカーネルを選択する。開発者１５２（５）は、次いで、試験データセットに基づいて特性を判定するように、新しいアルゴリズムまたはプロファイル内に選択されたカーネルを含んでもよい。
【００２９】
図４は、試験データ４０６を処理する第１のルーチン４０４（１）の性能を、試験データ４０６を処理する第２のルーチン４０４（２）の性能と比較するための開発サーバ１０８の例示的な使用を示す。試験データ４０６は、環境１００内に存在してもよく、または開発者１５２によってアップロードされてもよい。第１のルーチン４０４（１）および第２のルーチン４０４（２）は、図１および２のカーネル１２２、２０４および／またはアルゴリズム１２４、２０２、２２２のインスタンスを表してもよい。第１のルーチン４０４（１）および第２のルーチン４０４（２）は、両方とも同じ機能を果たし、同じ入力および出力パラメータを有するという点で同様であるが、異なるカーネルおよび／またはアルゴリズムを含んでもよい。ルーチン４０４は、同じカテゴリの範囲内に入り、同様のキーワード記述子を有してもよい。
【００３０】
開発サーバ１０８は、それぞれ、第１のルーチンプロファイル４０８（１）および第２のルーチンプロファイル４０８（２）を判定するように、第１のルーチン４０４（１）および第２のルーチン４０４（２）のうちのそれぞれのプロファイルを作成する。各ルーチンプロファイル４０８は、使用されるＲＡＭの量４１０、通信モデル４１２、第１および第２の処理速度４１４、およびアムダールスケーリング４１６のうちの１つ以上を含む。一実施形態では、１つのルーチンプロファイル４０８は、ルーチン４０４に選択された各通信モデル４１２のために作成される。特定の通信モデルの選択は、各利用可能な通信モデルを使用して、ルーチンのプロファイルを作成することに起因してもよく、またはユーザによって行われてもよい。
【００３１】
動作の一実施例では、開発サーバ１０８は、試験データ４０６を処理するようにクラスタ１１２の単一の処理ノード上で作動する、第１のルーチン４０４（１）のプロファイルを作成し、試験データを処理する第１のルーチンの実行時間に基づいて、使用されるＲＡＭ４１０（１）、通信モデル４１２（１）、および第１の処理速度４１４（１）を導出する。開発サーバ１０８は、次いで、試験データ４０６を処理するようにクラスタ１１２の１０個の処理ノード上で作動する、第１のルーチン４０４（１）のプロファイルを作成し、第２の処理速度４１４（３）を導出する。処理速度および実行時間は、処理ノードの計算能力ではなく、並列処理ルーチンの処理性能を表すために、本明細書で交換可能に使用される。例えば、第１の処理速度４１４（１）は、クラスタ１１２の単一の処理ノード上で第１のルーチン４０４（１）によって試験データ４０６を処理するための実行時間を表す。次いで、開発サーバ１０８は、以下の図５に関連して説明されるように、第１の処理速度４１４（１）、判定された第２の処理速度４１４（３）、および第２の処理速度４１４（３）を判定するために使用される処理ノードの数（Ｎ）に基づいて、アムダールスケーリング４１６（１）を判定する。次いで、開発サーバ１０８は、第２のルーチンプロファイル４０８（２）を判定するように、第２のルーチン４０４（２）についてこのシーケンスを繰り返す。
【００３２】
最も適切なカーネルおよびアルゴリズムの使用を促すため、および開発者が新たに作成されたカーネルおよび／またはアルゴリズムを評価することを可能にするために、特定のタスクに対する最良のカーネル／アルゴリズムが、識別され、そのタスクに組み込まれてもよいように、環境１００は、開発者またはユーザがカーネルおよびアルゴリズムを相互に対して比較することを可能にする。データセットのサイズ、カーネルおよび／またはアルゴリズムに入力されるパラメータ、カーネルおよび／またはアルゴリズムを処理するために選択される処理ノードの数、ならびにカーネルおよび／またはアルゴリズムのアムダールスケーリングを含むが、それらに限定されない、多くの要因が、特定のタスクに対するカーネルおよび／またはアルゴリズムの適合性を判定する。
【００３３】
一実施形態では、特に、各開発者が、処理仕様および要件に合わせられた独自の試験データを利用してルーチンを評価するため、並列処理ルーチンを評価するための条件が、典型的には変化するので、環境１００は、データベース１０６内にルーチンプロファイル４０８を保存しない。環境１００は、開発者がデータ要件に基づいて最適なカーネルおよびアルゴリズムを選択することを可能にするように、試験データおよび入力パラメータに対する新規および既存の並列処理ルーチンの自動評価を促進する。別の実施形態では、入力パラメータおよび試験データが変化していない時に、開発者が１回以上ルーチンのプロファイルを作成する必要がないように、環境は、試験データ４０６および評価開発者１５２に関するルーチンプロファイル４０８を記憶する。
【００３４】
図５は、例えば、カーネルおよびアルゴリズム等の並列処理ルーチンのアムダールスケーリングを自動的に判定するための１つの例示的な方法５００を示す。アムダールスケーリングは、図１のクラスタ１１２内の複数の処理ノード１１３によって実行された時等に、複数の処理ノード上で実行されるルーチンの性能が予測されることを可能にする。方法５００は、開発サーバ１０８および処理ノード１１３のうちの１つ以上によって実装される。
【００３５】
方法５００のステップ５０２では、ルーチンが、第１の実行時間を得るように単一の処理ノード上でプロファイル作成される。ステップ５０２の一実施例では、開発サーバ１０８は、第１の処理速度４１４（１）を判定するように、クラスタ１１２の単一の処理ノード内で試験データ４０６を処理する、第１のルーチン４０４（１）のプロファイルを作成する。ステップ５０４では、Ｎ個の処理ノード上のルーチンの予測実行時間が、第１の実行時間／Ｎとして計算され、Ｎは、プロファイリングに使用される処理ノードの数である。ステップ５０４の一実施例では、１０個の処理ノード１１３が、ステップ５０６でルーチン４０４（１）のプロファイルを作成するために使用され、したがって、Ｎは１０に等しく、１０で割った第１の処理速度４１４（１）として予測実行時間を求める。ステップ５０６では、ルーチンが、第２の実行時間を判定するようにＮ個の処理ノード上でプロファイル作成される。ステップ５０６の一実施例では、開発サーバ１０８は、第２の処理速度４１４（３）を判定するように、クラスタ１１２の１０個の処理ノード１１３上で試験データ４０６を処理する、ルーチン４０４（１）のプロファイルを作成する。ステップ５０８では、アムダールスケーリングが、予測実行時間／第２の実行時間として計算される。ステップ５０８の一実施例では、１０個の処理ノード１１３がステップ５０６で使用されたため、第１の処理速度４１４（１）は、１０で割られ、次いで、この結果を第２の処理速度４１４（３）で割る。第１の実行時間が１０秒であり、第２の実行時間が５秒である場合、アムダールスケーリング因数は０．５である。１というアムダールスケーリング因数が理想的であり、並列処理ルーチンは、より小さいアムダールスケーリング因数を伴うルーチンよりも効率的に１つの尺度に近い、アムダールスケーリング値を有する。
【００３６】
図６は、環境１００内に記憶された１つ以上の他の並列処理ルーチンに対して第１の並列処理ルーチンを自動的に評価するための１つの例示的な方法６００を図示する、フローチャートである。ステップ６０２では、第１の並列処理ルーチンが、一式の試験データを使用してプロファイル作成される。ステップ６０２の一実施例では、ルーチン４０４（１）は、開発者１５２（１）によって作成され、図５の方法５００および試験データ４０６を使用して開発サーバ１０８によってプロファイル作成される。ステップ６０４では、同様の並列処理ルーチンが、第１の並列処理ルーチンに対して定義されるカテゴリおよび／またはキーワードに基づいて選択される。ステップ６０４の一実施例では、開発サーバ１０８は、データベース１０６内の他の同様のカーネルおよびアルゴリズムを選択するために、ルーチン４０４（１）に対する定義されたカテゴリおよびキーワードを利用する。
【００３７】
ステップ６０６では、各選択された同様の並列処理ルーチンが、試験データを使用してプロファイル作成される。ステップ６０６の一実施例では、開発サーバ１０８は、試験データ４０６を処理する第２のルーチン４０４（４）のプロファイルを作成するために方法５００を利用し、ルーチンプロファイル４０８（２）を生成する。ステップ６０８では、選択された同様の並列処理ルーチンに対して第１の並列処理ルーチンをランク付けするように、第１の並列処理ルーチンのプロファイルデータが、選択された同様の並列処理ルーチンのうちのそれぞれのプロファイルデータと比較される。並行スケーリングの効率が非常に重要である、ステップ６０８の一実施例では、開発サーバ１０８は、第２のルーチンプロファイル４０８（２）に対して第１のルーチンプロファイル４０８（１）を比較し、各ルーチンプロファイル４０８内のアムダールスケーリング４１６に基づいて、第２のルーチン４０４（２）に対して第１のルーチン４０４（１）をランク付けする。ステップ６１０では、次いで、選択された既存のルーチンの通信モデルが判定される。
【００３８】
随意で、開発者１５２は、ステップ６０８のランキングに影響を及ぼすように、ルーチンプロファイル４０８の要素に優先順位を付けてもよい。例えば、使用される最大量のＲＡＭが、処理されているデータのサイズに基づく、特定の用途について、より少ないＲＡＭを利用するアルゴリズムは、最高速の処理速度を伴うアルゴリズムよりも貴重であってもよい。したがって、開発サーバ１０８が、方法６００のステップ６０８で、他のプロファイル作成された特性を上回る、使用される最低ＲＡＭ４１０の値を伴うカーネルをランク付けするように、開発者１５２は、ルーチンプロファイル４０８内の最高優先順位の要素として、使用されるＲＡＭ４１０を定義してもよい。
【００３９】
動作の一実施例では、開発者１５２は、試験データ４０６を使用して、環境１００内の同様の機能性を伴う既存のカーネルに対して新しいカーネルを評価するために、環境１００を使用する。開発サーバ１０８は、新しいカーネルに対して開発者１５２によって定義されるカテゴリおよび定義されたキーワードのうちの一方または両方に基づいて、データベース１０６からカーネルを選択する。開発サーバ１０８は、図６の方法６００を使用して、新しいカーネル、および試験データ４０６を使用するこれらの選択されたカーネルのうちのそれぞれのプロファイルを作成する。次いで、開発サーバ１０８は、判定されたルーチンプロファイル（例えば、ルーチンプロファイル４０８）を開発者１５２に提示する。開発者１５２が、選択されたカーネルと同様の機能を果たすために、より効率的な内部アルゴリズムを利用する、改良型カーネルを作成した場合、開発者１５２は、既存のカーネルに対して新しいカーネルの性能を比較し、それにより、新しいカーネルを評価してもよい。
【００４０】
（ソフトウェア盗用検出）
悪徳ソフトウェア開発者は、別の開発者によって開発されたコンピュータコードおよびアイディアをコピーし（またはその近い模造品を使用し）、この複製コードを独創的な作品として提示する場合がある。ソフトウェアは、容易に複製され、したがって、その価値を容易に傷つけることができる。ソースコードは、その機能性を変えることなく、全体的な発見および置換方法を使用して、および／またはソースコード内の関数の順序を再編成することによって、容易に修正される。これらの修正を組み合わせることによって、初心者がソフトウェア盗用を認識することは困難である。
【００４１】
以下の実施例では、「Ｃ」ソフトウェア言語が使用されるが、その範囲から逸脱することなく、他のソフトウェア言語が、「Ｃ」ソフトウェア言語の代わりに使用されてもよい。さらに、ソフトウェアソースコードのコンパイラによって無視される書式設定の量は、ソフトウェア言語の間で変化し、コンパイルされたコードに影響を及ぼさない書式設定のみが、以下の方法論で除去される。
【００４２】
図７Ａおよび７Ｂは、第１の並列処理ルーチンの一部として、第１の開発者によって図１の環境１００に提出された例示的な第１のソフトウェアソースコード７００を示す。図８Ａおよび８Ｂは、第２の並列処理ルーチンの一部として、第２の開発者によって図１の環境１００に提出された例示的な第２のソフトウェアソースコード８００を示す。この実施例では、第２の開発者は、第１のソフトウェアソースコード７００を盗用し、変数名に変更を行い、第２のソフトウェアソースコード８００を形成するように関数の順序を再編成している。図８Ａおよび８Ｂ内で、変更は、図示を明確にするために太字フォントで示されている。
【００４３】
機能的に、第１のソフトウェアソースコード７００と第２のソフトウェアソースコード８００との間に違いはないが、これは、第２のソフトウェアソースコード８００を第１のソフトウェアソースコード７００と比較する時に、即時に明白ではない。さらに、第１のソフトウェアソースコード７００内の関数の順序と比較して、第２のソフトウェアソースコード８００内の関数の順序が並べ替えられるため、第２のソフトウェアソースコード８００のコンパイルされたコードは、第１のソフトウェアソースコード７００のコンパイルされたコードとは異なり、コンパイルされたコードは、盗用を識別するように直接比較することができない。これらの実施例では、「Ｃ」言語は、大文字と小文字を区別し、これは、大文字と小文字の違いが合致することを要求する。他のソフトウェア言語は、大文字と小文字を区別せず、そのような言語をサポートする実施形態では、大文字と小文字の違いを無視するように、全て小文字（または全て大文字）に変換されてもよい。
【００４４】
環境１００は、提出された並列処理ルーチン（例えば、カーネル１１２およびアルゴリズム１２４）内の盗用を識別するための盗用検出モジュール（ＰＤＭ）１０９を含む。ＰＤＭ１０９は、開発サーバ１０８内で例証的に示されているが、ＰＤＭ１０９は、その範囲から逸脱することなく、他のサーバ（例えば、プログラム管理サーバ１１０および財務サーバ１０２）内で実装されてもよい。ＰＤＭ１０９はまた、環境１００の外部のソフトウェア盗用を識別するための別個のツールとして実装されてもよい。
【００４５】
さらなる実施例では、悪徳開発者は、盗用を隠そうとして、ソフトウェアソースコード内の独立文の順序を変更する。図３０は、コードブロック３００２、３００４、および３００６、独立文３０１０、３０１２、および３０１４、ならびに従属文３０３０、３０３２、および３０３４を図示するように、例示的なソフトウェアソースコード３０００の断片を示す。
【００４６】
図５０は、ソフトウェアコード文で見られるコードの並べ替えられた複数のインスタンスを生成するための例示的な方法を示すフローチャートである。図５０に示されるように、ステップ５００５では、ソフトウェアコード文のグループが、それらを分離するルーピングまたは分岐文を伴わずに、２つ以上のコード文を含むブロックにグループ化される。「Ｃ」言語では、分岐の実施例は、「ｇｏｔｏ．．．ｌａｂｅｌ」、「ｉｆ．．．ｔｈｅｎ．．．ｅｌｓｅ．．．」、「ｓｗｉｔｃｈ．．．ｃａｓｅ．．．ｄｅｆａｕｌｔ．．．」、「ｂｒｅａｋ」、および「ｃｏｎｔｉｎｕｅ」である。「Ｃ」言語では、ルーピングの実施例は、「ｆｏｒ．．．」、「ｗｈｉｌｅ．．．」、および「ｄｏ．．．ｗｈｉｌｅ．．．」である。
【００４７】
ステップ５０１０では、どの代入文がブロック内で従属しているか、およびどれが独立しているかを判定するように、ブロック内の代入文が分析される。「Ｃ」言語の中には、片面および両面といった２種類の代入文がある。片面代入文は、変数に関連して、それぞれ、インクリメントおよびデクリメント演算子「＋＋」および「-−」を利用する。例えば、「ａ＋＋；」は、「ａ＝ａ＋１；」と同等の代入文である。両面代入文は、「＝」、「／＝」、「＊＝」、「＋＝」、「-＝」、「＆＝」、「｜＝」、「＾＝」、「＜＜＝」、および「＞＞＝」といった演算子のうちの１つを含む。例えば、「ａ＝ａ＋１」は、両面代入文である。上記の片面代入文で示される変数は、代入文の左および右側の両方で生じるものとして見なされる。コードブロック内の代入文の右側で見られる変数が、同じブロック内の任意の先行代入文（実際または暗示）の左側でも見られる場合に、その文は従属していると見なされる（例えば、従属文３０３０、３０３２、および３０３４）。同じブロック内で、代入後の任意の非代入文は、その代入文と関連付けられると見なされる（例えば、独立文３０１０および３０１２）。
【００４８】
次いで、ステップ５０１５では、以下の規則に従って、元のソフトウェアソースコードと同じ機能性を維持しながら、ソフトウェアソースコードの複数のインスタンス２９１０＊（「＊」が特定のインスタンスを示すワイルドカードである、図２９に示される）が作成される。
【００４９】
ブロック内で従属しているものとして判定されない文は、独立文と見なされ、そのような配置が、独立文を従属文に変化させない、または従属文の従属関係を変化させないならば（すなわち、配置がブロック内のいずれの文の従属関係にも影響を及ぼさない限り）、任意の関連文とともに、所与のコードブロック内のどこかに配置される。文の従属関係は、その左側に変数を含有する独立文（実際または暗示）が、その左側の変数に依存する文と交換される場合に変化する。従属文は、独立文を定義した後に生じなければならない。従属文には、関連文がない。各ソフトウェアソースコードインスタンスは、それぞれのコードブロック内の独立文の１つの順列を表す。
【００５０】
コードブロック３００６、および独立コード文を位置付けるための上記の規則を見ると、含まれた文の１つだけの他の順列がある。つまり、独立文３０１０および３０１２が位置を交換してもよいが、文の「＋＋ｉ」部分が、独立文３０１０または３０１２をそこから従属させるため、独立文３０１４は移動することができない。独立文３０１４は、それらの従属関係が違反されるため、従属文３０３０、３０３２、および３０３４のうちのいずれかと交換することができない。
【００５１】
一実施形態では、ステップ５０２０では、「＃」がインスタンス番号を表す、ソースファイル名＋「＿＃」＋「．ｃ（ｃｐｐ）」というファイル名形式を使用して、可動独立文の順列から生成される各新しいコードインスタンス２９１０＊が、別個のファイルとして記憶される。例えば、元のソフトウェアソースコードファイルが「ａ．ｃ」と名付けられた場合、第１の新しいソフトウェアソースコードインスタンスファイル名は「ａ＿１．ｃ」として生成される。
【００５２】
図２９は、ソフトウェアソースコード２９０２から生成された例示的なデータを示す。ソフトウェアソースコード２９０２は、図１のカーネル１２２、アルゴリズム１２４、図２のカーネル２０４、アルゴリズム２０２、図４の並列処理ルーチン４０４、図７Ａおよび７Ｂのソフトウェアソースコード７００、ならびに図８Ａおよび８Ｂのソフトウェアソースコード８００に対するソースコードのうちの１つ以上を表してもよい。
【００５３】
図９は、ソフトウェアソースコードの中の盗用の割合を判定するための１つの例示的な方法９００を示す。例えば、開発者は、図１のカーネル１２２およびアルゴリズム１２４等の新しい並列処理ルーチンを環境１００に提出してもよい。環境１００内で使用するために公開する前に、この新しいアルゴリズムは、新しいルーチンの独創性を確保するように、環境１００内の既存の並列処理ルーチンに対して評価される。一意的であると考えられるようにソフトウェアソースコードが改変され得る容易性を考慮して、既存のルーチンへの類似性の量を判定するように、変数名、ファイル名、およびコメントを除外して、提出されたソフトウェアソースコードが比較される。
【００５４】
図１０は、編集済み機能的構成要素へのソフトウェアソースコードの編集のための１つの例示的な編集プロセス１０００を示す。図９、１０、および２９は、以下の説明と併せて、ともに最も良く検討される。
【００５５】
図９のステップ９０２では、図２９に示されるように、ソフトウェアソースコード２９０２が、「ｍａｉｎ」ルーチン用の関数名表２９０７および変数表２９０４、ならびに関数名表内に記載された各付加的な関数用の変数表（例えば、２９０６、２９０８）を構築するように解析される。関数名表２９０７および変数表２９０４、２９０６、２９０８等は、以下で説明されるように、構成要素編集ファイルを生成する目的で関数を識別するために、後に使用される。システムは、関数名表および変数表から関数名および変数名を検索する。盗用について試験されるコードのテキスト内で見つかった時に、それらは、試験する前にコードから除去（編集）される。ステップ９０２の一実施例では、ＰＤＭ１０９は、図１１の関数表１１００を生成するように、かつソフトウェアソースコードの「ｍａｉｎ」関数用の図１２の変数表１２００、関数「ｐｏｗｅｒ」用の図１３の変数表１３００、および関数「ｐｏｗｅｒ１」用の図１４の変数表１４００を生成するように、ソフトウェアソースコード８００を解析する。
【００５６】
ステップ９０４では、ソフトウェアソースコードが、図５０に関して上記で説明されるように、独立文の各順列に対する１つのソースコードを生成するように解析される。ステップ９０４の一実施例では、ＰＤＭ１０９は、ソフトウェアソースコードインスタンス２９１０（１）、２９１０（２）、および２９１０（３）を生成するように、ソフトウェアソースコード２９０２を解析する。ステップ９０６では、プロセス１０００（図１０に関して以下で詳細に説明される）が、各ソースコードインスタンスを編集して、比較ファイルおよび構成要素編集ファイルを作成するように呼び出される。ステップ９０６の一実施例では、ＰＤＭ１０９は、ソフトウェアソースコードインスタンス２９１０（１）を処理して、ソースコード比較ファイル２９２０（１）、構成要素編集ファイル「ｍａｉｎ」２９２２（１）、構成要素編集ファイル「ｆｕｎｃｔｉｏｎ１」２９２２（２）、および構成要素編集ファイル「ｆｕｎｃｔｉｏｎ２」２９２２（３）を生成するように、過程１０００を実装する。同様に、ＰＤＭ１０９は、それぞれ、比較ファイル２９２０（２）、構成要素編集ファイル「ｍａｉｎ」２９２２（４）、構成要素編集ファイル「ｆｕｎｃｔｉｏｎ１」２９２２（５）、および構成要素編集ファイル「ｆｕｎｃｔｉｏｎ２」２９２２（６）、ならびに比較ファイル２９２０（３）、構成要素編集ファイル「ｍａｉｎ」２９２２（７）、構成要素編集ファイル「ｆｕｎｃｔｉｏｎ１」２９２２（８）、および構成要素編集ファイル「ｆｕｎｃｔｉｏｎ２」２９２２（９）を生成するように、ソフトウェアソースコードインスタンス２９１０（２）および２９１０（３）を処理する。
【００５７】
ここで、図１０の過程１０００が詳細に説明される。ステップ１００２では、ソース比較ファイルを形成するように、非命令文字、変数名、およびファイル名が、ソフトウェアソースコードから除去される。非命令文字は、言語コンパイラによって無視され、スペース、タブ、および改行／キャリッジリターン等の書式設定文字、およびコメントを含んでもよい。ステップ１００２の一実施例では、ＰＤＭ１０９は、図１５のソース比較ファイル１５００を形成するように、ソフトウェアソースコード８００から書式設定、コメント、変数名、およびファイル名を除去する。機能的構成要素の図示を明確にするために、あるキャリッジリターン／改行がソース比較ファイル１５００の中に残されていることに留意されたい。
【００５８】
ステップ１００４では、ソース比較ファイル内の関数が、文字で表した長さに従って、昇順で配置される。ステップ１００４の一実施例では、ＰＤＭ１０９は、ソース比較ファイル１５００内の各関数の文字で表した長さを判定し、図１６のソース比較ファイル１６００として示される、サイズの昇順で、これらの関数を配置する。
【００５９】
ステップ１００６では、構成要素編集ファイル２９２２（＊）が、ソース比較ファイル内の各関数に対して生成される。ステップ１００６の一実施例では、ＰＤＭ１０９は、第１の関数「ｐｏｗｅｒ」用の図１７の構成要素編集ファイル１７００、第２の関数「ｐｏｗｅｒ１」用の図１８の構成要素編集ファイル１８００、および第３の関数「ｍａｉｎ」用の図１９の第３の構成要素編集ファイル１９００を作成する。
【００６０】
図９の方法９００を参照すると、ステップ９０８では、同様の既存並列処理ルーチンが、データベース内で識別される。ステップ９０８の一実施例では、ＰＤＭ１０９は、ソフトウェアソースコード８００のカテゴリ（例えば、カテゴリ２０６、図２）および／または関連キーワードに基づいて、ソフトウェアソースコード８００と同様であるカーネル（例えば、カーネル１２２）およびアルゴリズム（例えば、アルゴリズム１２４）を識別するようにデータベース１０６を検索し、図７Ａおよび７Ｂのソフトウェアソースコード７００を識別する。
【００６１】
ステップ９１０から９１６は、ステップ９０８の各識別された並列処理ルーチンについて繰り返される。
【００６２】
ステップ９１０では、識別されたソフトウェアソースコードが、「ｍａｉｎ」ルーチン用の関数表および変数表、ならびに関数表内に記載された各付加的な関数用の変数表を構築するように分析される。ステップ９１０の一実施例では、ＰＤＭ１０９は、それぞれ、図２１、２２、および２３に示されるように、図２０の第２の関数表２０００、第１の関数「ｍａｉｎ」用の第２の変数表２１００、第２の関数「ｐｏｗｅｒ」用の２２００、および第３の関数「ｐｏｗｅｒ１」用の２３００を生成するようにソフトウェアソースコード７００を解析する。
【００６３】
ステップ９１２では、ステップ９０８の識別されたソフトウェアソースコードに編集を行い、第２の比較ファイルおよびゼロ以上の第２の構成要素編集ファイルを形成するように、プロセス１０００が呼び出される。ステップ９１２の一実施例では、ＰＤＭ１０９は、ソフトウェアソースコード７００から書式設定、コメント、変数名、およびファイル名を除去することによって、ソフトウェアソースコード７００を処理し、図２４のソース比較ファイル２４００を生成するようにプロセス１０００を実装する。次いで、ＰＤＭ１０９は、図２４のソース比較ファイル２４００内の関数を順序付けて、図２５のソース比較ファイル２５００を形成するために、プロセス１０００を利用する。次いで、ＰＤＭ１０９は、ソースコード７００の関数「ｐｏｗｅｒ」用の図２６のソース比較ファイル２６００、ソースコード７００の関数「ｐｏｗｅｒ１」用の図２７のソース比較ファイル２７００、およびソースコード７００の関数「ｍａｉｎ」用の図２８のソース比較ファイル２８００を生成するように、プロセス１０００を続ける。
【００６４】
ステップ９１４では、第１のソース比較ファイルのコード文と第２のソース比較ファイルのコード文との間の盗用の割合を判定するように、第１の比較ファイルが第２の比較ファイルと比較される。ステップ９１４の一実施例では、ＰＤＭ１０９は、（ａ）比較ファイル１６００と比較ファイル２５００、（ｂ）それぞれ、比較ファイル１７００、１８００、１９００と比較ファイル２６００、２７００、および２８００との間のある割合の盗用を判定するために、Ｎｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ分析を利用する。具体的には、盗用率は、比較ファイル２５００、２６００、２７００、および２８００に対してソフトウェアソースコード８００から導出される各インスタンス２９１０（１）、２９１０（２）、および２９１０（３）について判定される。ソースコード整合および盗用率の判定は、図３１Ａを参照して、以下で詳細に説明される。
【００６５】
ステップ９１６では、判定された盗用率が許容限度よりも大きい場合に、第１のソースコードファイルが拒絶される。ステップ９１６の一実施例では、ＰＤＭ１０９は、６０％の定義された限度を有し、判定された盗用率が６０％よりも大きいため、拒絶のためにソフトウェアソースコード８００にフラグを付ける。ＰＤＭ１０９はまた、ソフトウェアソースコード８００に対する拒絶通知を関連開発者１５２に送信してもよい。
【００６６】
ステップ９１８は決定である。もし、ステップ９１８で、第１のソースコードファイルが、データベース１０６内の任意の識別された並列処理ルーチンについてステップ９１６で拒絶されたことを、方法９００が判定する場合、方法９００は、ステップ９２０を続け、そうでなければ、方法９００は終了する。ステップ９２０では、第１のソースコードファイルが容認される。ステップ９２０の一実施例では、ソフトウェアソースコード２９０２は、盗用されていないものとして容認される。
【００６７】
方法９００を利用することによって、各関数は、盗用率を判定するように、データベース１０６に記憶された他の関数に対して評価されてもよい。ソフトウェアソースコード内で、関数は、完全な機能的着想と見なされてもよく、したがって、盗用について個別にチェックされる。上記で示されるように、各関数用の編集済みコードは、ファイル拡張子「．ＣＲＥ」を有してもよい、構成要素編集ファイルと呼ばれる独自のファイルの中に入れられる。各構成要素編集ファイルは、（例えば、データベース１０６内に記憶されるような）環境１００内の選択された構成要素編集ファイルに対して比較される。このプロセスは、図９で説明されるプロセスと同様であり、各識別された関数用の構成要素編集ファイルのみが、データベース１０６に記憶された他の関数用の構成要素編集ファイルに対して比較される。
【００６８】
（盗用・整合ステップ）
ソフトウェアは、典型的には、複数バージョンで作成され、１つのバージョンが以前のバージョンの特徴の多くを含む。つまり、コードのバージョン間に進化的関係があってもよい。この進化的関係に基づいて、新たに提出されたソフトウェアソースコードにとって最も近いバージョンの試験コードを判定するために、生物情報数学的ツールが使用されてもよい。Ｎｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ動的プログラミングモデルを使用して、２つの編集済みファイル（例えば、構成要素編集ファイル２９２２（１）および構成要素編集ファイル２９２２（４）−２９２２（９））の間で全ての最適な全体的整合を得ることが可能である。Ｎｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ方程式は、以下の通りである。
Ｍｉ，ｊ＝Ｍｉ，ｊ＋ｍａｘ（Ｍｋ，ｊ＋１，Ｍｉ＋１，ｌ）
式中、
Ｍｉ，ｊ＝比較される完成した編集済みファイル
ｉ＝第１のファイルの長さ
ｊ＝第２のファイルの長さ
ｋ＝任意の整数＞ｉ
ｌ＝任意の整数＞ｊ
図３１Ａは、図１６のソース比較ファイル１６００および図２５のソース比較ファイル２５００のうちのそれぞれの最初の１９文字の間の合致を図示する、１つの例示的な表３１００を示す。示された技法は、各編集済みファイル全体に直接適用可能である。表３１００内で、一番上の行は、ソース比較ファイル１６００を表し、左の列は、ソース比較ファイル２５００の文字を表す。文字がファイル１６００および２５００の間で合致する、図３１Ａに示されるように、１は、対応する四角内に配置される。図３１Ｂは、図３１Ａの表３１００へのＮｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ方程式の適用に起因する、例示的な表３１１０を示す。具体的には、Ｎｅｅｄｌｅｍａｎ−Ｗｕｎｓｃｈ方程式は、表３１１０を形成するように繰り返し適用される。１９の連続合致文字の一次最適トレース３１１２が見出され、二次最適トレース３１１４も識別される。
【００６９】
Ｓｍｉｔｈ−Ｗａｔｅｒｍａｎ動的プログラミングモデルを使用して、２つのソース比較ファイル（例えば、比較ファイル１６００および２５００）の間で全ての最適な局所的整合を得ることが可能である。本明細書で説明されるようなＳｍｉｔｈ−Ｗａｔｅｒｍａｎ動的プログラミングモデルは、比較されたシーケンスの中の間隙の効果が加重されることを可能にするため、好ましい整合方法と見なされる。以下の方程式は、Ｓｍｉｔｈ−Ｗａｔｅｒｍａｎ動的プログラミングモデルを示す。
【００７０】
【化１】
2013536535.tif 000003
式中、
ａ，ｂ＝アルファベットΣ上の文字列
ｍ＝長さ（ａ）
ｎ＝長さ（ｂ）
Ｈ（ｉ，ｊ）＝ａ［１．．．ｉ］という接尾辞とｂ［１．．．ｊ］という接尾辞との間の最大類似性スコア
ｗ（ｃ，ｄ），ｃ，ｄ∈Σ∪｛’-’｝，’-’は、間隙採点スキームである
実施例
シーケンス１＝コード断片Ａの最初の１９文字
シーケンス２＝コード断片Ｂの最初の１９文字
ｗ（ｍａｔｃｈ）＝＋２
ｗ（ａ，-）＝ｗ（-，ｂ）＝ｗ（ｍｉｓｍａｔｃｈ）＝-１
図３１Ｃは、表内の「-」文字によって識別される間隙検出の規定を図示する、例示的なＳｍｉｔｈ−Ｗａｔｅｒｍａｎドット表３１２０を示す。また、このステップで必要とされる最適トレースを作成するために、ＢＬＡＳＴまたは任意の他の局所的整合方法が使用されてもよいことにも留意されたい。
【００７１】
（盗用・比較ステップ）
フィルタにかけられ、最適に整合させられたトレースを生成するために使用される２つのコードの中で、より多くの数の合致文字が見出されるほど、これらのコードが無関係である確率が低くなる。比較されたコードが、２５％を上回る、フィルタにかけられ、最適に整合させられたトレースに沿った合致を生成する場合、相同性が仮定されてもよく、つまり、コードは進化的に関係する。したがって、いずれか２つのコード（ＡおよびＢと呼ばれ、Ａ＝盗用について試験されているコード）による、任意のフィルタにかけられ、最適に整合させられたトレースに沿った２５％の文字合致が、Ｂに対するＡの盗用を構成する。
【００７２】
（コード系統を判定する）
ソフトウェアソースコードは、概して、複数バージョンで作成され、１つのバージョンが以前のバージョンの特徴の多くを保持するため、複数のバージョンのコードがある場合、次いで、いくつかのバージョンのコードは、系統の中で最も近い別のバージョンに対して、フィルタにかけられた整合トレースにより高い割合の合致を有する。例えば、未知のソフトウェアソースコード（バージョンＸ）が、進化的に関係するソフトウェアソースコードバージョンに対して比較された場合に、以下のシナリオが起こってもよい。
【００７３】
図３１Ｄは、バージョン１、２、２．１、２．２、３、３．１、および４のうちのそれぞれに対するバージョンＸの盗用率が、表３１３２に示されるように判定される、第１の例示的なシナリオ３１３０を示す。バージョン２．２に対するバージョンＸの１００％合致は、矢印３１３４によって示されるように、バージョンＸがバージョン２．２であることを示す。
【００７４】
図３１Ｅは、バージョン１、２、２．１、２．２、３、３．１、および４のうちのそれぞれに対するバージョンＸの盗用率が、表３１４２に示されるように判定される、第２の例示的なシナリオ３１４０を示す。バージョン２．１に対するバージョンＸの７５％合致は、矢印３１４４によって示されるように、バージョンＸが、おそらくバージョン２．１に由来するが、バージョン２．２と同じではないことを示す。
【００７５】
図３１Ｆは、バージョン１、２、２．１、２．２、３、３．１、および４のうちのそれぞれに対するバージョンＸの盗用率が、表３１５２に示されるように判定される、第２の例示的なシナリオ３１５０を示す。表３１５２内の盗用率は、バージョンＸとバージョン１、２、２．１、２．２、３、３．１、および４との間に進化がない、したがって、盗用がないことを示す。
【００７６】
コード作成タイムスタンプもまた、バージョンＸ等の何らかの未知のコードの関連を示すために、バージョン番号の代わりに使用されてもよい。
【００７７】
（悪質ソフトウェア挙動検出）
環境１００内で、並列処理ルーチン（例えば、カーネル１２２およびアルゴリズム１２４）は、他の並列処理ルーチンに問題を引き起こすべきではない。他のソフトウェアに問題を引き起こすソフトウェアは、悪質ソフトウェアと呼ばれ、不要なソフトウェア活動は、悪質ソフトウェア挙動と呼ばれる。悪質ソフトウェア挙動は、偶発的に起こる場合があり、または意図的となり得る。いずれにしても、悪質ソフトウェア挙動は、環境１００内で望ましくない。好ましくは、悪質ソフトウェアは、環境１００内でそのソフトウェア（例えば、並列処理ルーチン）を公開する前に検出される。
【００７８】
１つの例示的な悪質ソフトウェア挙動は、メモリの中の変数（例えば、アレイ型構造またはポインタ）が溢れ、保護されたメモリがアクセスされるときである。ハッカー（すなわち、悪質ソフトウェアを意図的に作成する個人）が、システムの保護されたメモリへの不正アクセスを獲得し、次いで、そのアクセスを活用しようとする。
【００７９】
環境１００内の悪質ソフトウェア挙動を防止するために、開発サーバ１０８は、悪質挙動検出器（ＭＢＤ）１１１を含む。具体的には、ＭＢＤ１１１は、環境１００内での公開のために提出された並列処理ルーチン内の悪質挙動を検出するように機能する。ＭＢＤ１１１は、提出された並列処理ルーチンの中の悪質ソフトウェア挙動を検出し、並列処理ルーチンがその変数を溢れさせている時を検出する。
【００８０】
図３２は、ソフトウェアソースコード３２０２内の悪質ソフトウェア挙動を検出する時にＭＤＢ１１１によって使用される例示的なファイルを示す。第１のステップでは、ＭＢＤ１１１は、元のソフトウェアソースコードと同じファイル名を伴い、かつ「．ＡＵＧ」拡張子を伴う、ソフトウェアソースコード３２０２のコピーである、増補ソースコード３２０４を作成する。同様に、ＭＢＤ１１１はまた、ソフトウェソースコードと同じファイル名を伴い、かつ「．ＭＡＰ」拡張子を伴う、ソフトウェアソースコードのコピーである、マップされたソースコード３２０６も作成する。増補ソースコード３２０４およびマップされたソースコード３２０６は、各識別された線形ソース区分の区分番号を示す、コメントを含むように改正される。ソフトウェアソースコードが完全に試験されていることを確実にするために、ソフトウェアソースコード内の全ての識別された線形コード区分が、試験中に起動されなければならない。ソフトウェアソースコード３２０２内のある分岐が、１つ以上のエラー条件時に起動されるのみであってもよいため、これらの分岐の選択が強制されてもよい。マップされたソースコード３２０６は、アクセスされていない区分が試験中に報告される時の参照として、ソフトウェアソースコード３２０２の開発者（または提出者）に返信されてもよい。マップされたソースコード３２０６は、図３９で例示されている。
【００８１】
ソフトウェアソースコード内の線形ソースコード区分を識別することは、全ての線形コード区分を単一の実行で試験することができるわけではない時に、ソフトウェアが反復して試験されることを可能にする。ＭＢＤ１１１は、各線形コード区分からの追跡情報を、ソフトウェアソースコードと同じファイル名および「．ＴＲＫ」拡張子を伴う追跡ファイル３２０８の中へ出力するように、増補ソースコード３２０４をさらに修正する。ソフトウェアソースコード３２０２と関連付けられる並列処理ルーチンは、追跡ファイル３２０８内の追跡情報によって示されるように、全ての分岐およびループコード区分が試験されるまで、本システムによる使用のために公開されない。
【００８２】
図３３は、開発者１５２によって環境１００に提出されるような例示的なソフトウェアソースコード３３００を示す。ソフトウェアソースコード３３００は、図３２のソフトウェアソースコード３２０２を表してもよい。
【００８３】
図３４は、増補ソースコード３２０４を形成するようにソフトウェアソースコード３２０２を改正するための１つの例示的なプロセス３４００を示す。プロセス３４００は、例えば、ＭＢＤ１１１内の機械可読命令として実装される。図３５は、追跡ファイル３２０８を作成して開くための１つの例示的なコード挿入３５００を示す。図３６は、現在の日付および時間ならびに区分番号を追跡ファイル３２０８に添付するように関数「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」を呼び出す、１つの例示的なコード挿入３６００を示す。図３７は、追跡ファイル３２０８を閉じるための１つの例示的なコード挿入３７００を示す。図３８Ａおよび３８Ｂは、ソフトウェアソースコード３３００内の例示的なコード挿入を示す。図３４、３５、３６、３７、および３８は、以下の説明を用いて、ともに最も良く検討される。
【００８４】
ステップ３４０２では、プロセス３４００が、定義ファイルを含むコードを増補ソースコードに挿入する。ステップ３４０２の一実施例では、ＭＢＤ１１１は、増補ソースコード３２０４にも挿入される追跡コードをサポートする定義を含むように、ソフトウェアソースコード３３００の点３３０２で「＃ｉｎｃｌｕｄｅ＜ｍｐｔｔｒａｃｅ．ｈ＞」を挿入する。ステップ３４０４では、プロセス３４００は、追跡ファイルを開くコードを、増補ソースコードの第１の線形コード区分に挿入する。ステップ３４０４の一実施例では、ＭＢＤ１１１は、ソフトウェアソースコード３３００の第１の実行された関数（「ｍａｉｎ」）の第１の線形コード区分の冒頭にある点３３０４で、図３５のコード挿入３５００をソフトウェアソースコード３３００に挿入する。ステップ３４０６では、プロセス３４００が、識別されたループおよび分岐点に基づいて、ソフトウェアソースコード内の線形コード区分を識別する。ステップ３４０６の一実施例では、ＭＢＤ１１１は、ソフトウェアソースコード３３００を分析し、その中の線形コード区分３３５２、３３５４、３３５６、３３５８、３３６０、および３３６２を識別するように、分岐点３３０６、３３０８、３３１４、および３３１６、ならびにループ点３３１２を識別する。
【００８５】
ステップ３４０８では、プロセスが、ブロックマーカーがない単一の文であれば、識別された線形コード区分を包囲するようにブロックマーカーを追加する。ステップ３４０８の一実施例では、ＭＢＤ１１１は、線形コード区分３３５６の周囲に区切り文字「｛“ａｎｄ”｝」を追加する。ステップ３４１０では、プロセス３４００が、タイムスタンプ付き区分識別子を各線形コード区分内の追跡ファイルに添付するように、ソースコードを挿入する。ステップ３４１０の一実施例では、ＭＢＤ１１１は、関数「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（ｔｒｋＦｉｌｅ，“Ｘ”）」を呼び出すコードを追加し、Ｘは、各識別された線形コード区分３３５２、３３５４、３３５６、３３５８、３３６０、および３３６２内の第１の文としての区分番号である。関数「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ」は、すでに開かれた追跡ファイル「ｔｒｋＦｉｌｅ」の終わりに、現在の時間および日付ならびに区分番号Ｘを書く。ステップ３４１２では、プロセス３４００が、各プログラム終了点前に追跡ファイルを閉じるようにソースコードを挿入する。ステップ３４１２の一実施例では、ＭＢＤ１１１は、挿入３８１２および３８２６によって示されるように、各「ｅｘｉｔ」、「＿ｅｘｉｔ」、および「ｒｅｔｕｒｎ」文の前に図３７のコード挿入３７００を追加する。
【００８６】
加えて、「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ」関数は、以前の区分の実行時間および／または全実行時間が定義された最大時間を超えるかどうかを判定する。定義された最大時間制限に達した場合、「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」関数は１を返信し、そうでなければ、０を返信する。図３６のコード挿入３６００に示されるように、「ｉｆ」文は、「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」関数からの返信値を評価し、並列処理ルーチンを時期尚早に終了させてもよい。
【００８７】
図３９は、ソフトウェアソースコード３３００に基づく、マップされたソースコード３２０６内の例示的なコメント挿入（太字で示される）を示す。
【００８８】
（カーネルデータ使用を追跡する-レベル２増補）
コンピュータ言語は、異なる静的および動的メモリ割付モデルを有してもよい。ＣおよびＣ＋＋言語では、「ｍａｌｌｏｃ（）」、「ｃａｌｌｏｃ（）」、「ｒｅａｌｌｏｃ（）」、および「ｎｅｗ  ｔｙｐｅ（）」コマンドを使用して、動的メモリが割り付けられる。アレイもまた、実行時に動的に割り付けられてもよい。割り付けられたメモリは、ヒープ空間を利用する。割付が静的でない限り、それは各スレッドの中の各ルーチンに作成される。Ｃ言語は、可変アドレスを判定し、そのアドレスから始まる任意の値を書く能力を含む。（例えば、標準的なハッカー技法である、変数が保持するように定義されているよりも多くの値をその変数に書くことによって）ルーチンに割り付けられたメモリの外側のメモリがアクセスされないことを確実にするために、静的および動的である全ての変数が位置付けられ、それらのアドレスは、オーバーフロー条件について実行時にチェックされる。
【００８９】
変数の定義された範囲を超えてメモリにアクセスするコードを識別するために、各変数の開始および終了アドレスが実行時に判定される。図４０Ａおよび４０Ｂは、実行時に変数の開始アドレスを判定するように、増補ソースコード３２０４内の可変アドレス検出コード４００２の例示的な配置を示す。変数アドレス検出コード４００２は、各変数定義後に増補ソースコード３２０４に追加される。図４０Ａおよび４０Ｂでは、図示を明確にするために、追加されたコードが太字で示されている。図４０Ａの実施例では、可変アドレス検出コード４００２は、変数名文字列４００６および可変アドレス４００８といった２つの入力パラメータを伴う関数４００４「ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」として実装される。変数名文字列は、変数または引用符によって取り囲まれた構成変数の名前である。アドレスパラメータは、変数のアドレスである。図４０ＡのＣ言語実施例では、位置４０１０における変数「ｉｎｄｅｘ」の公表後に、「ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（“ｉｎｄｅｘ”，＆ｉｎｄｅｘ）；」が増補ソースコード３２０４に追加される。
【００９０】
図４０Ｂの位置４０１２で示されるように、ポインタが公表された場合、典型的には、代入文を伴う値（すなわち、メモリ領域のアドレス）が割り当てられる。Ｃ言語では、例えば、「ａｌｌｏｃ」、「ｃａｌｌｏｃ」、「ｍａｌｌｏｃ」、および「ｎｅｗ」といった関数が、メモリをポインタに割り付けるために使用される。記憶割付関数が代入文の右側にある場合に、代入文の左側のポインタは、図３８Ｂの位置３８４０で示されるように、文内でメモリが割り付けられている。「ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」関数は、位置４０１４で示されるように、ポインタに割り当てられた開始アドレスを捕捉するために使用される。Ｃ言語では、＝、＋＝、-＝、＊＝、／＝、％＝、＜＜＝、＞＞＝、＆＝、＾＝、および｜＝が、代入演算子である。
【００９１】
必要とされる時に、ポインタへのメモリの割付は、位置３８４０で示されるような「ｉｆ」文内等から隔離される。可変アドレス検出コード４００２（例えば、関数「ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」）が開始アドレスを記録することを可能にするように、メモリの割当および割付に起因するポインタの評価は、位置４０１４で示されるように分離され、割り付けられたポインタの試験は、示されるように別個の「ｉｆ」文内で行われる。
【００９２】
開始アドレスは、以下のように取得される。
非構成変数の全ての型定義が位置付けられる。
見出された時に、ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）関数を使用して、これらの変数のアドレスを取得する。
記憶割付関数を使用してポインタ定義が生じた場合に、その代入文を隔離し、ｍｐｔＳｔａｒｔｉｎｇＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）関数を使用して新しいアドレスを取得する。
記憶割付関数を用いることなく、代入演算子に遭遇した時はいつでも、変数のアドレスがアドレスを計算するために使用される時に、または変数のアドレスが変更された時に、「ｃｕｒｒｅｎｔＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」関数を使用して、代入演算子（実際または暗示）の左側の変数の現在のアドレスが捕捉される。例えば、以下のＣ言語文は、ポインタ値を増分する。
＋＋ｂｕｆｆｅｒｉｎｆｏ；
実行時にポインタ値を評価するために、以下のように、文がポインタ値を変更した後に関数が挿入される。
＋＋ｂｕｆｆｅｒｉｎｆｏ；
ｍｐｔＣｕｒｒｅｎｔ  ＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（“ｂｕｆｆｅｒｉｎｆｏ”，  ｂｕｆｆｅｒｉｎｆｏ）；
この実施例では、関数「ｍｐｔＣｕｒｒｅｎｔＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」は、「ｍｐｔＳｔａｒｔＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」関数によって以前に判定され、図４１の変数追跡表内４１００に記憶されたような、判定された開始および終了アドレスに対して、修正されたポインタ値を比較した。具体的には、「ｍｐｔＣｕｒｒｅｎｔＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」関数によって判定されるようなポインタ値は、その変数の有効アドレス範囲に対して比較され、その比較の結果は、追跡ファイル３２０８に書かれる。図４２は、「ｍｐｔＣｕｒｒｅｎｔＡｄｄｒｅｓｓＤｅｔｅｃｔｏｒ（）」関数の出力を図示する、１つの例示的な表４２００を示す。
【００９３】
（メモリ割付および割付解除を追跡する）
上述のように、メモリは、典型的には、言語内の割付関数を使用してポインタに割り付けられる。Ｃ言語では、ｍａｌｌｏｃ、ｃａｌｌｏｃ、ｒｅａｌｌｏｃ、または新しいシステム関数呼び出しを使用して割り付けられる。これらのメモリ割付を記録するために、メモリ割付代入文の左側の変数の名前を、割り付けられたリソースの表に書き込むように、割付追跡関数が、ポインタへの割当に近接して増補ソースコード３２０４に追加される。
【００９４】
図４３は、割り付けられたポインタの変数名、それが割り付けられた関数の名前、および割付フラグを含有する、１つの例示的な割り付けられたリソースの表４３００を示す。割付フラグは、関連変数がそれに割り付けられたメモリを有する時に、１に設定され、いずれのメモリも変数に割り付けられていない時に（例えば、割り付けられたメモリが解放されている時に）、０に設定される。メモリの割付および割付解除を追跡するための関数の一実施例が、以下で示される。
ｍｐｔＡｌｌｏｃａｔｉｏｎＴａｂｌｅＣｈａｎｇｅ（“ｖａｒｉａｂｌｅ  ｎａｍｅ”，  “ｆｕｎｃｔｉｏｎ  ｎａｍｅ”，  ａｌｌｏｃａｔｉｏｎ  ｆｌａｇ）；
増補ソースコード３２０４内のポインタ変数への各メモリ割付および割当に近接して、第３のパラメータとして１を伴う「ｍｐｔＡｌｌｏｃａｔｉｏｎＴａｂｌｅＣｈａｎｇｅ（）」関数の呼び出しが、割り付けられたリソースの表４３００を更新して、メモリがそのポインタ変数に割り付けられたことを示す。同様に、増補ソースコード３２０４の各メモリ割付解除文について、文のポインタ変数へのメモリ割付解除を記録するように、第３のパラメータとして０を伴って、「ｍｐｔＡｌｌｏｃａｔｉｏｎＴａｂｌｅＣｈａｎｇｅ（）」関数の呼び出しが挿入される。メモリが割り付けられたリソースの表４３００内にすでに記載されているポインタに割り付けられる（例えば、メモリがポインタ変数に１回以上割り付けられる）場合、同じ変数名を伴う付加的な入力が、割り付けられたリソースの表４３００に追加される。
【００９５】
メモリがポインタ変数から割付解除された時に、変数名および関数名に合致し、１に設定された割付フラグを有する、割り付けられたリソースの表４３００の中の第１の入力は、０に設定された割付フラグを有するように修正される。それにより、割り付けられたリソースの表４３００は、割り付けられたメモリの異常な使用（例えば、第１のメモリが割付解除されることなく、メモリがポインタ変数に２回割り付けられた場合）を判定することができるように、メモリの割付および割付解除を追跡する。同様に、割り付けられたメモリの誤用を防止するように、アドレス割当（例えば、第２のポインタ変数に割り当てられた１つのポインタ変数内に記憶されたメモリアドレス）が追跡される。
【００９６】
プログラム終了点（例えば、Ｃ言語内のｒｅｔｕｒｎまたはｅｘｉｔ関数呼び出し）毎に、割付リソース表の値が追跡ファイル３２０８に記憶される。以下は、割付リソース表の値の追跡増補を行うために必要とされる関数を示す。
ｍｐｔＴｒａｃｅＲｅｓｏｕｒｃｅＶａｌｕｅ（ｓｏｕｒｃｅＦｉｌｅＮａｍｅ．ＴＲＣ  ｆｉｌｅ  ｈａｎｄｌｅｒ）；
図４４Ａおよび４４Ｂは、増補ソースコード３２０４へのｍｐｔＴｒａｃｅＲｅｓｏｕｒｃｅＶａｌｕｅ（）関数の例示的な追加４４０２および４４０４を示す。
【００９７】
（強制コード区分入力-レベル３増補）
ソフトウェアソースコード３２０２内のあるコード区分にアクセスすることは、典型的には、あるエラー条件時のみにアクセスされるという点で、問題があり得る。コード区分が通常動作を通してアクセスされない場合、強制区分ファイル３２１０（図３２参照）は、これらのコード区分へのアクセスを強制するように定義されてもよい。強制区分ファイル３２１０は、強制されるコード区分のコード区分番号を含有し、形式「ｓｏｕｒｃｅＦｉｌｅＮａｍｅ．ＦＲＣ」のファイル名を有する。強制区分ファイル３２１０内で、強制されるコード区分が記載される（例えば、空白によって分離される区分番号のリストとして）。例えば、区分３および区分５および区分７が、強制入力を有するものである場合に、強制区分ファイル３２１０は、「３  ５  ７」を含有する。
【００９８】
図４５Ａおよび４５Ｂは、条件付き分岐強制を伴う増補ソースコード３２０４を示す。具体的には、増補ソースコード３２０４は、位置４５０２および４５０４で強制区分ファイル３２１０へのファイルハンドルを含むように修正される。一次元強制アレイ（例えば、「ｍｐｔＦｏｒｃｅＡｒｒａｙ」）が、位置４５０６で公表され、位置４５０８で０に初期化される。強制アレイは、ソフトウェアソースコード３２０２内にコード区分があるのと同じ数の要素を伴って公表される。増補ソースコード３２０４内の位置４５１０で、強制区分ファイル３２１０が読み取られ、強制区分ファイル３２１０からロードされた区分番号に対応する強制アレイの要素が１に設定される。次いで、強制区分ファイル３２１０が閉じられる。
【００９９】
増補ソースコード３２０４内で、各分岐点４５１２、４５１４、および４５１６は、強制アレイの適切な要素を評価するように修正される。例えば、区分６の入力点における条件文は、強制アレイの要素６を評価した。したがって、強制区分ファイル３２１０内に区分番号を含むことによって、そのコード区分と関連付けられる強制アレイ要素は、ファイルが実行時に読み取られる時に０に設定され、分岐文に対する条件が評価された時に、そのコード区分が入力される。
【０１００】
増補ソースコード３２０４内で、Ｃ言語について、デフォルトｃａｓｅラベルの前に、ｃａｓｅ文（例えば、ｓｗｉｔｃｈ）に追加ｃａｓｅが追加され、それは、強制ファイルを介したデフォルトの起動を可能にする。さらに、強制されるコード区分が別のコード区分に埋め込まれる場合（例えば、ネスト化、ｉｆ文）、次いで、標的コード区分が実際に起動されていることを確実にするために、全てのネスティング分岐点の全起動が必要とされる。
【０１０１】
（全ての区分にアクセスするための複数プログラム実行の使用）
増補ソースコード３２０４は、コンパイルされ、次いで、可変アドレスアクセス、コード区分アクセス、および時間／日付を含有する追跡ファイル３２０８を生成するように実行される。次いで、ＭＢＤ１１１は、ソフトウェアソースコード３２０２内の全ての区分がアクセスされているかどうかを判定するように、追跡ファイル３２０８を処理する。ソフトウェアソースコード３２０２内の全てのコード区分がアクセスされているわけではない場合、ＭＢＤ１１１は、アクセスされていないコード区分のリストを含有する、欠落区分ファイル３２１２を生成する。欠落区分ファイル３２１２のファイル名形式は、「ｓｏｕｒｃｅＦｉｌｅＮａｍｅ．ＭＩＳ」である。
【０１０２】
ユーザは、識別された欠落コード区分を起動するために、修正された強制区分ファイル３２１０を用いて付加的な実行が必要であるかどうかを判定するように、欠落区分ファイル３２１２を検討してもよい。追跡ファイル３２０８は、増補ソースコード３２０４の付加的な実行からの出力がファイルに添付されるという点で累積的である。欠落区分ファイル３２１２は、どの区分がプロファイリングを必要とするかをユーザが知るように、増補ソースコード３２０４の各実行によって再生される。ソフトウェアソースコード３２０２の全てのコード区分がアクセスされている時、次いで、欠落区分ファイル３２１２は作成されず、それにより、全ての区分が分析されていることを示す。新しいソフトウェアソースファイルがユーザによって提供された場合に、同じソースファイル名を伴う任意の追跡ファイルがシステムから消去され、それにより、分析を要求するために全ての区分を必要とする。
【０１０３】
（双方向カーネル追跡）
ソフトウェアソースコード３２０２を試験することが、増補ソースコード３２０４の数回の実行を必要とし得るため、ＭＢＤ１１１は、提出されたカーネルの実行を双方向に辿るように、ユーザ（例えば、開発者１５２）がクライアント１５６内のユーザインターフェース１６０と相互作用することを可能にする。ＭＢＤ１１１は、提出（または選択）されたカーネル（例えば、図２のカーネル２０４（１）、および図３２のソフトウェアソースコード３２０２）の視覚表現を作成し、ユーザインターフェース１６０上に関数・構造図を表示する。図４６は、マップされたソースコードファイル（例えば、図３２のマップされたソースコード３２０６）内でも示されるような関連区分番号とともにそれぞれ表された、１１のコード区分を図示する、１つの例示的な関数・構造図４６００を示す。
【０１０４】
ユーザインターフェース１６０内で「トレース」オプションを選択することによって、実行時間「双方向フラグ」が設定され、それは、書き込み区分関数（例えば、「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」）に、各コード区分におけるカーネルの実行を停止させ、カーネルの実行を続ける前に、ユーザが双方向に強制アレイ（例えば、「ｍｐｔＦｏｒｃｅＡｒｒａｙ［］」）を設定することを可能にする。
【０１０５】
動作の一実施例では、増補ソースコード３２０４が実行される際に、実行されているコード区分は、関数・構造図４６００内で強調表示される。ＭＢＤ１１１は、各分岐点（例えば、図４５の分岐点４５１２、４５１４、および４５１６）で増補ソースコード３２０４の実行を停止し、関数・構造図４６００の現在のコード区分から発する適切な矢印の上で左のマウスボタンをクリックすることによって、ユーザが実行経路を選択することを可能にする。経路（例えば、矢印）がユーザによって選択された時に、選択された矢印の色が変化し、ユーザが「続ける」ボタンを選択した時に、どの経路が取られるかを示す。「続ける」ボタンの選択時に、選択された経路に基づいて実行が続く。
【０１０６】
ユーザは、右のマウスボタンを使用してコード区分を選択し、実行がその区分において中断するべきではないことを示してもよい。（例えば、分岐点、ｅｘｉｔ、およびｒｅｔｕｒｎのうちの１つにおいて）増補ソースコード３２０４の実行が中断させられた時はいつでも、ユーザは、随意で、変数名、それらの開始、終了、および現在のアドレス、ならびにポップアップウィンドウ内のそれらの現在の場所の値を表示してもよい。例えば、ユーザは、ユーザインターフェース１６０内の「変数を表示・変更する」ボタンをクリックして、これらの変数を表示してもよい。ポップアップウィンドウ内の任意の変数の現在の値のフィールドを選択することは、ユーザが変数のデータを変更することを可能にする。変数がアレイである場合に、アレイ指標値はまた、そのアレイ要素の値を表示するようにユーザによって変更されてもよい。ユーザが変数の値を変更する場合、変更後に実行されるコード区分は、アクセスされた区分経路として追跡されない。一実施形態では、アレイ（例えば、「ｍｐｔＶａｒｉａｂｌｅＡｒｒａｙ［］」）が、ポップアップウィンドウ内で表示するために、この変数情報を記憶するために使用される。
【０１０７】
さらに、（例えば、分岐点、ｅｘｉｔ、およびｒｅｔｕｒｎのうちの１つにおいて）増補ソースコード３２０４の実行が中断させられた時はいつでも、ユーザは、随意で、ユーザインターフェース１６０内の「コードを表示する」ボタンを選択することによって、ポップアップウィンドウ内にマッピングファイル（例えば、マップされたソースコード３２０６）のコンテンツを表示してもよい。このポップアップウィンドウ内で、例えば、増補ソースコード３２０４に追加された「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」関数の実行から判定されるように、現在のコード区分がハイライトされる。さらに再度、ＭＢＤ１１１は、増補ソースコード３２０４内で実行されたコード区分を記録し、１つ以上の異なる色で、より古いコード区分実行を表示する。コード区分実行が欠落区分ファイル３２１２内のデータに基づくため、新しいバージョンのソフトウェアソースコード３２０２が環境１００にロードされる時に、全ての区分起動履歴がリセットされる。
【０１０８】
（コード区分ロールバック）
（例えば、分岐点、ｅｘｉｔ、およびｒｅｔｕｒｎのうちの１つにおいて）増補ソースコード３２０４の実行が中断させられた時はいつでも、ユーザは、随意で、ユーザインターフェース１６０内のロールバックボタン（例えば、「ロールバックコード」ボタン）を選択して、最後に実行されたコード区分において実行を再開してもよい。これは、一実施形態では、「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ」関数によって返信される、最後に実行されたコード区分を利用し、それにより、ＭＢＤ１１１が、制御を返信されたコード区分へ移転するためにその情報を使用することを可能にすることによって、実装される。図４７Ａおよび４７Ｂは、関数「ｍｐｔＷｒｉｔｅＳｅｇｍｅｎｔ（）」からの、返信された、以前に実行された区分番号（変数「ｍｐｔＦｌａｇ」内に記憶されている）を評価し、その後すぐに「ｇｏｔｏ」コマンドを条件付きで実行するコードタグ４７０２（例えば、区分ラベル）およびコードを含むための増補ソースコード３２０４の例示的な改正を示す。
【０１０９】
（共同カーネルレベルデバッギング）
上記の機能性およびツールが、例えば、ユーザの機器上ではなく、開発サーバ１０８内で実装されるため、双方向活動もまた、他の開発者と共有されてもよい。例えば、組織内の複数のユーザがそれぞれ、同じカーネルに対してトレースモードを起動し、次いで、上記のツールに同時にアクセスしてもよい。一実施形態では、カーネルのトレースを開始する第１の個人が、仲裁者になり、双方向セッションを検討し、随意で制御するための他のユーザアクセスを選択的に許可してもよい。
【０１１０】
一実施形態では、各共同ユーザの名前が、ユーザインターフェース１６０内で表示され、強調表示および／または色を通して、どのユーザが現在実行されている区分を制御しているかが示される。例えば、現在制御しているユーザは、別のユーザの名前を選択して、それに双方向セッションの制御を渡してもよい。区分制御を伴うユーザのみが、区分を選択し、コードを表示し、変数を表示し、および／または変数を変更してもよい。仲裁者のみが、「続ける」および「ロールバックコード」ボタンを選択してもよい。仲裁者は、中断された実行中のいつでも、区分制御ユーザを変更してもよい。
【０１１１】
（共同アルゴリズムトレーシング）
アルゴリズムは、複数のカーネルから成ってもよく、他のアルゴリズムを含んでもよい。ユーザインターフェース１６０内で、ユーザ（例えば、開発者１５２または管理者１５８）は、ＭＢＤ１１１によるトレーシングのためのアルゴリズムを選択してもよい。図４８は、カーネル４８０２（１）−（３）およびアルゴリズム４８０４を示す、１つの例示的なアルゴリズムトレース表示４８００を示す。いったん組織／カテゴリ／アルゴリズム／トレースボタンが選択されると（アルゴリズムが現在の組織によって作成されたとすれば）、アルゴリズムのＭＰＴトレース画面が表示される。表示４８００内で、ユーザは、カーネルまたはアルゴリズムのうちのいずれかを選択してもよい（例えば、マウスでクリックする）。一実施形態では、カーネルおよびアルゴリズムへのアクセスは、ユーザの組織によって作成されたものに限定される。
【０１１２】
例えば、カーネルを選択することは、図４６の関数・構造図４６００を、そのカーネルに対して表示させる。トレースモードでアルゴリズムにアクセスする第１の管理者レベルユーザ（例えば、管理者１５８）は、ユーザリスト４８０６内で示される４８０８ように、そのアルゴリズムの仲裁者になる。現在の仲裁者は、例えば、ユーザインターフェース１６０内で「解放」ボタンを選択することによって、仲裁者の地位を放棄してもよい。仲裁者は、他のユーザを、追跡されているアルゴリズム内のカーネルに割り当ててもよく、ユーザ名２が示され４８１０、カーネル６を仲裁する４８０２（２）。一実施形態では、仲裁者がリスト４８０６からユーザ名を選択し、次いで、そのユーザに割り当てられるカーネルを選択した時に、割当が起こり、そうするとすぐに、選択されたカーネル名が、ユーザの名前によって表示される４８１０。カーネル４８０２がユーザによってダブルクリックされた場合、選択されたカーネルがポップアップカーネルトレースウィンドウ内で表示される。現在のアルゴリズム内の別のアルゴリズム（例えば、アルゴリズム４８０４）が選択された（およびユーザの組織によって所有される）場合に、そのアルゴリズムのカーネル／アルゴリズムが表示される。最上アルゴリズムの仲裁者は、全てのアルゴリズムの仲裁者である。
【０１１３】
一実施形態では、各カーネル４８０２に割り当てられたユーザが、そのカーネルの仲裁者になり、上記で説明されるように、続けてＭＢＤ１１１内でそのカーネルを辿る（例えば、図４６および関連説明を参照）。カーネルに対する全ての区分が適性にアクセスされ、エラーがなく、必要な正解が得られており、そのカーネルが安全と見なされる時に、次いで、カーネルを表す記号は、カーネルが承認されていることを示す（図４８内のように太字で示される、または緑色で表示される）。ユーザによるカーネルのトレース中に、そのカーネルは、鎖線輪郭で表示される（カーネル４８０２（２）参照）。全ての仲裁者が作成した割当は、仲裁者によって変更されるまで実施中のままである。
【０１１４】
仲裁者は、出力値を、辿っている各カーネル／アルゴリズムに割り当てることができる。これは、必要なカーネルまたはアルゴリズムの上でダブル右クリックする（選択する）ことによって達成される。カーネル／アルゴリズムの仲裁者選択は、入力／出力選択ポップアップメニューを表示させる。「入力」ボタンが入力／出力選択ポップアップメニュー上で選択された後に、ファイルまたは変数選択ポップアップメニューが表示される。変数ファイルのＵＲＬが入力され、その後に「続く」ボタンの選択が続く場合に、以下の形式を伴うファイルが、全ての入力変数を定義するために使用される。
（ｖａｒｉａｂｌｅ  ｎａｍｅ  １，  ｉｎｐｕｔ  ｖａｌｕｅ  １），．．．．（ｖａｒｉａｂｌｅ  ｎａｍｅ  ｎ，  ｉｎｐｕｔ  ｖａｌｕｅ  ｎ）；
空白および改行／キャリッジリターン文字は無視される。変数がアレイである場合に、影響を受けるアレイ要素が選択される。例えば、（ｔｅｓｔ［３］，１０）は、試験と名付けられたアレイの第４の要素が、値１０を受容することを意味する。あらゆる未定義要素は「Ｎ／Ａ」と指定される。「Ｎ／Ａ」指定を伴ういずれの変数も定義されない。
【０１１５】
ユーザインターフェース１６０内の「変数を表示する」ボタンの選択は、現在のカーネル／アルゴリズムに対する全ての変数を表示させる。次いで、仲裁者は、各変数の現在の値のフィールドに値を入れ、または「Ｎ／Ａ」を入力してもよく、「Ｎ／Ａ」は、この値が重要ではないことを意味する。アレイの中の各要素は、別々に定義されなければならない。値が与えられていない任意の変数は、「Ｎ／Ａ」として定義されると仮定される。
【０１１６】
「入力／出力」ポップアップメニュー内の「出力」ボタンの選択は、「ファイルまたは変数を出力する」ポップアップメニューを表示させる。「出力」ファイルおよび変数は、「入力」ファイルまたは変数と類似した方式で記入される。
【０１１７】
全ての入力および出力変数が定義された後に、仲裁者は、起動のために開始カーネル／アルゴリズムを選択する。一実施形態では、仲裁者は、開始カーネル／アルゴリズムを左クリックし、その後にユーザインターフェース１６０内の「開始」ボタンを左クリックする。次いで、アルゴリズムは、開発サーバ１０８によって処理され、いったん完了すると、出力データは、入力された出力変数値と比較される。仲裁されたアルゴリズムは、あり得る全てのアルゴリズム経路が選択された時、および必要な値が各経路について取得された時に、辿られると考えられる。アルゴリズムは、そのアルゴリズム内で定義された全てのカーネルおよびアルゴリズムが成功裏に辿られ、安全と見なされる時に、辿られてもよい。
【０１１８】
（危険コード判定）
ＭＢＤ１１１は、試験されたソフトウェアソースコード３２０２が安全と見なされるかどうかを判定するように、追跡ファイル３２０８および欠落区分ファイル３２１２を分析する。欠落区分ファイル３２１２が、任意のコード区分を試験されていないものとして識別する場合、ソフトウェアソースコードは、安全と見なされない。追跡ファイル３２０８内で、任意の変数の現在のアドレスが、プログラム実行中に、その変数の割り当てられたアドレス範囲の外側にある場合に、ソフトウェアソースコード３２０２は、安全と見なされない。追跡ファイル３２０８内で、コード区分が、定義された最大時間を上回る全実行時間を有するものとして示される場合、ソフトウェアソースコード３２０２は、安全と見なされない。
【０１１９】
追跡ファイル３２０８内で、（ルーピング区分を終了することなく）ルーピング区分の全実行時間の合計が、定義された最大時間を上回る場合に、ソフトウェアソースコードは、安全と見なされない。追跡ファイル３２０８内で、ソフトウェアソースコード３２０２の全実行時間が定義された最大時間を超える場合に、ソフトウェアコードは、安全と見なされない。追跡ファイル３２０８内で、それらに割り付けられたメモリを決して持たない、任意の割り付けられた変数がある場合に、ソフトウェアソースコード３２０２は、安全と見なされない。追跡ファイル３２０８内で、１つよりも多くのメモリ割付が、関数あたりの変数につき行われる場合に、ソフトウェアソースコード３２０２は、安全と見なされない。
【０１２０】
（補助サービス）
図４９は、開発者１５２、管理者１５８、および環境１００を利用する組織１５４に補助サービスを提供する、随意的な補助リソースサーバ４９０２を伴う図１の環境１００を示す。補助サービスは、司法サービス、技術文書サービス、言語翻訳サービス、会計サービス、グラフィックアートサービス、試験／デバッギングサービス、マーケティングサービス、ユーザ命令サービス等を含んでもよい。補助リソースサーバ４９０２はまた、開発者１５２と、環境１００を利用する組織１５４との間に求人サービスを提供してもよい。補助リソースサーバ４９０２は、プログラム管理サーバ１１０、財務サーバ１０２、開発サーバ１０８、クラスタ１１２、およびデータベース１０６のうちの１つ以上と協働してもよく、かつ既存のサーバ内で実装されてもよく、または１つ以上の他のコンピュータサーバを利用してもよい。それにより、環境１００は、補助リソースサーバ４９０２の包含を通して、ソーシャルネットワーキング機能を組織１５４、管理者１５８、および開発者１５２に提供してもよい。
【０１２１】
図４９の実施例では、補助リソースサーバ４９０２は、組織１５４（６）（またはより具体的には、組織１５４（６）の管理者１５８）からサービス情報４９０４を受容するように、データベース１０６およびグラフィカルプロセス制御サーバ１０４と協働する。補助リソースサーバ４９０２は、組織１５４（６）に対する組織１２６の入力に関連して、データベース１０６の中のサービス情報表４９０６内にサービス情報４９０４を記憶する。サービス情報４９０４は、組織１５４（６）によって提供されるサービスを分類するキーワードを含んでもよい。実施例を続けると、別の組織１５４（４）は、グラフィカルプロセス制御サーバ１０４を介して、サービス要求４９０８を提出し、他の組織によって提供されるサービスを検索するように補助リソースサーバ４９０２に指図してもよい。サービス要求４９０８は、組織１５４（４）によって要求されたサービスと関連付けられる１つ以上のキーワードおよび／または１つ以上のカテゴリを特定してもよい。
【０１２２】
補助リソースサーバ４９０２は、サービス要求４９０８に基づいて、データベース１０６からサービス情報および関連組織情報を受容し、要求されたサービスを組織１５４（４）に提供する組織のリストを提示する。一実施形態では、サービス情報４９０４は、カーネル（例えば、図２のカーネル２０４）と同様のグラフィックとして提示されてもよい。図４９の実施例を続けると、サービス要求４９０８が組織１５４（６）のキーワードまたは他のサービス情報４９０４に合致する場合、補助リソースサーバ４９０２は、合致サービスを提供する組織のリスト内に組織１５４（６）の情報を含む。次いで、組織１５４（４）（より具体的には、組織１５４（４）の管理者１５８）は、そのリストから１つ以上の組織を選択してもよく、そこから要求されたサービスの見積もりが求められる。次いで、補助リソースサーバ４９０２は、グラフィカルプロセス制御サーバ１０４を介して、サービス要求情報を提示し、および／または選択された組織（この実施例では組織１５４（６））に送信する。選択された組織は、サービス要求を評価し、応答することを拒否または容認してもよい。
【０１２３】
図４９の別の実施例では、組織１５４（４）および１５４（５）は、グラフィカルプロセス制御サーバ１０４を介して、それぞれ、任務の説明４９２０（１）および４９２０（２）を補助リソースサーバ４９０２に送信する。任務の説明４９２０は、提出組織１５４内に仕事の要件および／または地位を含む。補助リソースサーバ４９０２は、データベース１０６の任務説明表４９２２内に任務の説明４９２０を記憶する。
【０１２４】
環境１００と関連する仕事を見つけることに関心がある開発者（例えば、開発者１５２（６）および１５２（７））は、グラフィカルプロセス制御サーバ１０４を介して、履歴書（例えば、それぞれ、履歴書４９３０（１）および４９３０（２））を補助リソースサーバ４９０２に提出してもよい。補助リソースサーバ４９０２は、データベース１０６の開発者情報表４９３２内に履歴書４９３０（１）および４９３０（２）を記憶する。次いで、各開発者１５２は、入力カテゴリおよび／または１つ以上のキーワードに基づいて任務の説明４９２２内で任務を検索するように、グラフィカルプロセス制御サーバ１０４を介して、補助リソースサーバ４９０２と相互作用してもよい。それに応じて、補助リソースサーバ４９０２は、グラフィカルプロセス制御サーバ１０４を介して、仕事を開発者に提供する組織（例えば、組織１５４（４）および１５４（５））のリスト４９３４を表示してもよい。リスト４９３４上のこれらの組織のうちの１つ以上の開発者（例えば、開発者１５２（６））による選択は、補助リソースサーバ４９０２によって受容され、開発者１５２（６）および任務の説明４９２２と関連してデータベース１０６内に記憶される。
【０１２５】
組織１５４（４）および１５４（５）の管理者１５８はそれぞれ、グラフィカルプロセス制御サーバ１０４を介して、組織リスト４９３４から組織を選択した開発者１５２の履歴書４９３０を評価するように、補助リソースサーバ４９０２と相互作用してもよい。図４９の実施例では、開発者１５２（６）が組織リスト４９３４から組織１５４（４）を選択する場合、組織１５４（４）は、補助リソースサーバ４９０２から任務の説明４９２０（１）への関心の通知を受容してもよい。組織１５４（４）は、任務の説明５０２（１）に応答した開発者１５２のリストを検討するように、グラフィカルプロセス制御サーバ１０４を介して補助リソースサーバ４９０２と相互作用してもよい。各記載された開発者の履歴書情報（例えば、履歴書４９３０（１））が検討されてもよく、０人、１人、またはそれ以上の開発者が、組織の管理者によって選択されてもよく、そうするとすぐに、関連開発者情報がデータベース１０６内のその組織と関連付けられる。例えば、組織１５４（４）の管理者１５８によって容認されると、開発者１５２（６）の情報は、組織１５４（４）と関連付けられ、開発者は、その組織の一員となる。
【０１２６】
その範囲から逸脱することなく、上記の方法およびシステムに変更が行われてもよい。したがって、上記の説明に含有される、または添付図面に示される事項は、限定的な意味ではなく例証的として解釈されるべきであることに留意されたい。以下の請求項は、本明細書で説明される全ての一般的および具体的特徴、ならびに、言語上、その間にあると考えられ得る、本方法およびシステムの範囲の全ての記述を対象とすることを目的とする。
【図７Ａ】
2013536535.tif 000004
【図７Ｂ】
2013536535.tif 000005
【図８Ａ】
2013536535.tif 000006
【図８Ｂ】
2013536535.tif 000007
【図１５】
2013536535.tif 000008
【図１６】
2013536535.tif 000009
【図１７】
2013536535.tif 000010
【図１８】
2013536535.tif 000011
【図１９】
2013536535.tif 000012
【図２４】
2013536535.tif 000013
【図２５】
2013536535.tif 000014
【図２６】
2013536535.tif 000015
【図２７】
2013536535.tif 000016
【図２８】
2013536535.tif 000017
【図３０】
2013536535.tif 000018
【図３１Ａ】
2013536535.tif 000019
【図３１Ｂ】
2013536535.tif 000020
【図３１Ｃ】
2013536535.tif 000021
【図３３】
2013536535.tif 000022
【図３５】
2013536535.tif 000023
【図３６】
2013536535.tif 000024
【図３７】
2013536535.tif 000025
【図３８Ａ】
2013536535.tif 000026
【図３８Ｂ】
2013536535.tif 000027
【図３９】
2013536535.tif 000028
【図４０Ａ】
2013536535.tif 000029
【図４０Ｂ】
2013536535.tif 000030
【図４４Ａ】
2013536535.tif 000031
【図４４Ｂ】
2013536535.tif 000032
【図４５Ａ】
2013536535.tif 000033
【図４５Ｂ】
2013536535.tif 000034
【図４６】
2013536535.tif 000035
【図４７Ａ】
2013536535.tif 000036
【図４７Ｂ】
2013536535.tif 000037
【図１】
2013536535.tif 000038
【図２】
2013536535.tif 000039
【図３】
2013536535.tif 000040
【図４】
2013536535.tif 000041
【図５】
2013536535.tif 000042
【図６】
2013536535.tif 000043
【図９】
2013536535.tif 000044
【図１０】
2013536535.tif 000045
【図１１】
2013536535.tif 000046
【図１２】
2013536535.tif 000047
【図１３】
2013536535.tif 000048
【図１４】
2013536535.tif 000049
【図２０】
2013536535.tif 000050
【図２１】
2013536535.tif 000051
【図２２】
2013536535.tif 000052
【図２３】
2013536535.tif 000053
【図２９】
2013536535.tif 000054
【図３１Ｄ】
2013536535.tif 000055
【図３１Ｅ】
2013536535.tif 000056
【図３１Ｆ】
2013536535.tif 000057
【図３２】
2013536535.tif 000058
【図３４】
2013536535.tif 000059
【図４１】
2013536535.tif 000060
【図４２】
2013536535.tif 000061
【図４３】
2013536535.tif 000062
【図４８】
2013536535.tif 000063
【図４９】
2013536535.tif 000064
【図５０】
2013536535.tif 000065
【国際調査報告】
2013536535.tif 000066
2013536535.tif 000067