(57)【特許請求の範囲】
【請求項１】
分散コンピューティングシステムであって、
ジョブを実行する２以上のワーカノードであって、前記ジョブの中に検証されるべきコードの一部が指示される、ワーカノードと、
メモリに結合されるプロセッサを有するスケジューラノードと、前記メモリは、コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、それぞれのジョブが検証されるべきコードの一部を示す、ワーカノードにより実行される１以上のジョブを示すジョブのキューとを含み、
前記リソースのキューと前記ジョブのキューの両者がエントリを含むかを判定するスケジューラノードとを備え、
前記スケジューラノードは、前記リソースのキューと前記ジョブのキューとがエントリを含む場合に、スケジューリングポリシーを適用して、第一のジョブを選択し、前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択し、前記第一のジョブを前記第一のワーカノードに割り当て、前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当て、前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てる、
ことを特徴とするシステム。
【請求項２】
前記コードを検証することは、コードに記号的実行を施すことを含む、
請求項１記載のシステム。
【請求項３】
前記スケジューラノードは、
ジョブを実行するために利用可能な初期の数のワーカノードを決定し、
前記ジョブを実行するために利用可能なワーカノードの初期の数よりも多いか又は前記ジョブを実行するために利用可能なワーカノードの初期の数に等しい、初期の数のジョブを作成し、
前記初期の数のワーカノードのそれぞれを、実行すべきジョブに割り当てる、
請求項１記載のシステム。
【請求項４】
前記スケジューラノードは、
前記ジョブのキューが空であって、全てのワーカノードが使用されていないかを判定し、
前記ジョブのキューが空であって、全てのワーカノードが使用されていない場合、全てのジョブの実行の結果を記憶する、
請求項１記載のシステム。
【請求項５】
前記スケジューラノードは、
前記ジョブのキューが所定の最小値未満であるか、前記リソースのキューが所定の最大値を超えるかを判定し、
前記ジョブのキューが所定の最小値未満であって、前記リソースのキューが所定の最大値を超える場合、ジョブの作成を増加するように１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項６】
前記スケジューラノードは、
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定し、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、所与のリソースの実行を増加するように、１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項７】
前記スケジューラノードは、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定し、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、ジョブの作成を減少するように、１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項８】
前記スケジューラノードは、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定し、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、所与のリソースの実行を減少するように、１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項９】
前記スケジューラノードは、
前記ジョブのキューの状態を評価し、
前記ジョブのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項１０】
前記スケジューラノードは、
前記リソースのキューの状態を評価し、
前記リソースのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節する、
請求項１記載のシステム。
【請求項１１】
ソフトウェアを検証する方法であって、
コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、それぞれのジョブが検証されるべきコードの一部を示す、ワーカノードにより実行される１以上のジョブを示すジョブのキューとをモニタするステップと、前記ジョブは、検証されるべきコードの一部を示し、
前記リソースのキューと前記ジョブのキューとがエントリを含むかを判定するステップと、
前記リソースのキューと前記ジョブのキューの両者がエントリを含む場合に、
スケジューリングポリシーを適用して、第一のジョブを選択するステップと、
前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択するステップと、
前記第一のジョブを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
を含むことを特徴とする方法。
【請求項１２】
ジョブを実行するために利用可能な初期の数のワーカノードを決定するステップと、
前記ジョブを実行するために利用可能なワーカノードの初期の数よりも多いか又は該初期の数に等しい、初期の数のジョブを作成するステップと、
前記初期の数のワーカノードのそれぞれを、実行すべきジョブに割り当てるステップと、
を更に含む請求項１１記載の方法。
【請求項１３】
前記ジョブのキューが空であって、全てのワーカノードが使用されていないかを判定するステップと、
前記ジョブのキューが空であって、全てのワーカノードが使用されていない場合、全てのジョブの実行の結果を記憶するステップと、
を更に含む請求項１１記載の方法。
【請求項１４】
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定するステップと、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、ジョブの作成を増加するように１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項１５】
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定するステップと、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、所与のリソースの実行を増加するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項１６】
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定するステップと、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、ジョブの作成を減少するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項１７】
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定するステップと、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、所与のリソースの実行を減少するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項１８】
前記ジョブのキューの状態を評価するステップと、
前記ジョブのキューの状態に基づいて、当該方法を実行するシステムの１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項１９】
前記リソースのキューの状態を評価するステップと、
前記リソースのキューの状態に基づいて、当該方法を実行するシステムの１以上のポリシーのパラメータを調節するステップと、
を更に含む請求項１１記載の方法。
【請求項２０】
コンピュータに、ソフトウェアを検証する方法を実行させるための命令を含むプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記方法は、
コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、ワーカノードにより実行される１以上のジョブを示すジョブのキューとをモニタするステップと、前記ジョブは、検証されるべきコードの一部を示し、
前記リソースのキューと前記ジョブのキューとがエントリを含むかを判定するステップと、
前記リソースのキューと前記ジョブのキューの両者がエントリを含む場合に、
スケジューリングポリシーを適用して、第一のジョブを選択するステップと、
前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択するステップと、
前記第一のジョブを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
を含むことを特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの検証に関し、より詳細には、知的なロードバランシングによる、ソフトウェアの検証の問題の効率的な並列化に関する。  
本出願は、“METHOD  AND  SYSTEM  FOR  EFFICIENT  PARALLELIZATION  OF  A  SOFTWARE  VERIFICATION  PROBLEM  THROUGH  INTELLIGENT  LOAD  BALANCING”と題された2010年10月29日に提出された米国特許仮出願61/408167の35U.S.C§119(e)の下での利益を特許請求するものである。
【背景技術】
【０００２】
従来のソフトウェアの検査の方法は、困難な滅多に発生しない厄介なバグ（hard,  corner-case  bugs）を発見する能力に欠けている。ソフトウェアの検証の正式な方法は、困難な、滅多に発生しない厄介なバグを発見する保証を提供する。記号的実行は、誤りのある振る舞いを発見することができる検証技術である。複数のコンピュータ間で記号的実行のようなソフトウェアの検証を並列化することは、リニアな速度に近づくためのロードバランシングを必要とする。
【発明の概要】
【課題を解決するための手段】
【０００３】
本発明の１実施の形態では、分散コンピューティングシステムは、２以上のワーカノードと、メモリに結合されるプロセッサを含むスケジューラノードとを含む。ワーカノードは、検証されるべきコードの一部を含むジョブを実行する。メモリは、コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、ワーカノードにより実行されるべき１以上のジョブを示すジョブのキューを含む。それぞれのジョブは、検証されるべきコードの一部を示す。スケジューラノードは、リソースのキューとジョブのキューがエントリを含むかを判定する。リソースのキューとジョブのキューの両者がエントリを含む場合、スケジューラノードは、スケジューリングポリシーを適用して、第一のジョブを選択し、リソースのキューのエントリのうちから、第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択し、第一のジョブを第一のワーカノードに割り当て、第一のジョブを実行する間にジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを第一のワーカノードに割り当て、第一のジョブの実行を停止する終了ポリシーのパラメータを第一のワーカノードに割り当てる。
【０００４】
本発明の別の実施の形態では、ソフトウェアを検証する方法は、リソースのキューとジョブのキューとをモニタすること、リソースのキューとジョブのキュートがエントリを含むかを判定すること、リソースのキューとジョブのキューの両者がエントリを含む場合、スケジューリングポリシーを適用して第一のジョブを選択すること、リソースのキューのエントリのうちで第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択すること、第一のジョブを第一のワーカノードに割り当てること、第一のジョブを実行している間にジョブのキューにおいて新たなジョブを作成するジョブ作成ポリシーのパラメータを第一のワーカノードに割り当てること、第一のジョブの実行を停止する終了のポリシーのパラメータを第一のワーカノードに割り当てることを含む。リソースのキューは、コードの一部を検証するために利用可能な複数のワーカノードを示す。ジョブのキューは、ワーカノードにより実行されるべき１以上のジョブを示す。ジョブは、検証されるべきコードの一部を含む。
【０００５】
更に別の実施の形態では、コンピュータ読み取り可能な記録媒体、コンピュータ読み取り可能な記録媒体に記録されるコンピュータ実行可能な命令を含む。命令は、プロセッサにより読取り可能である。命令は、読み取られて実行されたときに、プロセッサに、リソースのキューとジョブのキューとをモニタさせ、リソースのキューとジョブのキューとがエントリを含むかを判定させ、リソースのキューとジョブのキューの両者がエントリを含む場合、スケジューリングポリシーを適用して第一のジョブを選択させ、リソースのキューのエントリのうちで第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択させ、第一のジョブを実行している間にジョブのキューにおいて新たなジョブを作成するためにジョブ作成ポリシーのパラメータを第一のワーカノードに割り当て、第一のジョブの実行の停止のためのパラメータを第一のワーカノードに割り当てさせる。リソースのキューは、コードの一部を検証するために利用可能な複数のワーカノードを示す。ジョブのキューは、ワーカノードにより実行されるべき１以上のジョブを示す。ジョブは、検証されるべきコードの一部を含む。
【図面の簡単な説明】
【０００６】
本発明、本発明の特徴及び利点の完全な理解のため、添付図面と共に、以下の説明が参照される。
【図１】ソフトウェアの検証の効率的な並列化を提供する疎結合の分散コンピューティングシステムの例示的な実施の形態を示す図である。
【図２】スケジューラノード（scheduler  node）及びワーカノード（worker  node）のようなコンピューティングノードの例示的な実施の形態である。
【図３】条件文に遭遇し、式が評価され、新たなジョブが作成され、バグが決定されたときの、検査下にあるコードのようなソフトウェアを検証する分散コンピューティングシステムの動作を例示する図である。
【図４】記号的実行が行われるべきコードを知的且つ動的に分割する分散コンピューティングシステムの動作を例示する図である。
【図５】知的且つ動的なロードバランシングを通して、ソフトウェアの解析を効率的に並列化するため、分散コンピューティングシステムの動作を調整する方法の例示的な実施の形態を示す図である。
【図６】分散コンピューティング環境におけるソフトウェアの解析の問題の並列化のための効率的な部分的な計算手法の例示的な実施の形態を示す図である。
【図７】分散コンピューティング環境でのソフトウェアの解析の問題の効率的な並列化のための動的且つ知的な計算管理方法の例示的な実施の形態を示す図である。
【図８】例示的な初期化の経路の状態（initialization  path  condition）及び終了の経路及び状態（termination  path  condition）に関する完全な再生方法、並びに、引き返し及び再生（backtrack-and-replay）方法の動作を示す図である。
【図９】分散コンピューティング環境におけるソフトウェアの解析の問題の効率的な並列化のためのノードの計算の初期化手法の例示的な実施の形態を示す図である。
【図１０】分散コンピューティング環境におけるソフトウェアの解析の問題の効率的な並列化のためのスケジューリングポリシーを実現する方法の例示的な実施の形態を示す図である。
【発明を実施するための形態】
【０００７】
図１は、ソフトウェアの検証の効率的な並列化を提供する疎結合された分散コンピューティングシステム１００の例示的な実施の形態を示す。係る技術は、分散コンピューティングリソース間での効率的なロードバランシングにより提供される。
【０００８】
分散コンピューティングシステム１００は、複数のネットワーク化された、潜在的なコンピューティングリソースを含む分散コンピューティング環境を含む場合がある。係るコンピューティングリソースは、異なる種類である場合がある。様々な実施の形態では、分散コンピューティングシステム１００で実施されるソフトウェアの検証サービスが、近い将来に計算タスクを実行するために特定のトポロジーを利用することができないように、コンピューティングリソースのコネクショントポロジーは、未知であるか又は不規則である。
【０００９】
１実施の形態では、分散コンピューティングシステム１００は、クラウドコンピューティングのフレームワーク又は環境で実現される場合がある。分散コンピューティングシステム１００は、１以上のコンピューティングノードにより実現される。１つの係るコンピューティングノードは、スケジューラノード１０４として設計及び実現される場合があり、このスケジューラノードは、メインのコンピューティングノードとして機能する。他のコンピューティングノードは、ワーカノード１０６として設計及び実現される場合がある。コンピューティングノードは、適切なコンピューティングリソース又は電子装置で実現され、限定されるものではないがサーバ、コンピュータ又はそれらの任意の組み合わせを含む。スケジューラノード１０４は、ワーカノード１０６に通信可能に結合される。コンピューティングノードは、ネットワーク１０２を通して通信可能に結合される。ネットワーク１０２は、コンピューティングノードを通信可能に結合する適切なネットワークアレンジメント、又はワイドエリアネットワーク、ローカルエリアネットワーク、イントラネット、インターネット、又はこれらのエレメントの任意の組み合わせのような適切なネットワークで実現される。
【００１０】
分散コンピューティングシステム１００は、スケジューラノード１０４、又は他の適切なサーバ、ノード、又はマシン、或いはその組み合わせから検証のウェブサービス１０８を実行することで、ソフトウェアの検証の問題の効率的な並列化のサービスを提供する。検証のウェブサービス１０８のユーザは、検証のウェブサービス１０８により検査されるべきコード、プログラム、又は他のソフトウェアをロード又はアップロードすることができる。以下では、検査されるべき係るコード、プログラム、又は他のソフトウェアは、「検査下にあるコード“code  under  test”」と呼ばれる。検証のウェブサービス１０８のユーザは、検証の結果を取得するために検証のウェブサービス１０８にアクセスすることができる。結果は、以下に記載されるように、分散コンピューティングシステム１００で検証のウェブサービス１０８の動作の出力を含む。
【００１１】
コンピューティングノードは、並列に達成されるべきタスクに関連される計算の負荷を共有する。たとえば、検査下にあるコードのようなソフトウェアプログラムの有効性及び動作を検査するために並列して機能する場合がある。係る例では、スケジューラノード１０４は、検査下にあるコードに通信可能に結合され、検査下にあるコードを検査するためにワーカノード１０６の動作を編成する。
【００１２】
図２は、スケジューラノード１０４及びワーカノード１０６のようなコンピューティングノードの例示的な実施の形態を示す。スケジューラノード１０４は、検査下にあるコード２２６を動的に試験するため、ワーカノード１０６に通信可能に結合される場合がある。より多くのワーカノード１０６がスケジューラノード１０４に結合される場合があるが、図示されていない。ワーカノード１０６は、スケジューラノード１０４からの指示の下で、他のワーカノードと並列して検査下のコード２２６のようなソフトウェアを検証する。
【００１３】
スケジューラノード１０４は、メモリ２１８に結合されるプロセッサ２２０を含む。スケジューラノード１０４は、スケジューラアプリケーション２０８を含む。スケジューラアプリケーション２０８は、プロセッサ２２０により実行され、メモリ２１８に記憶されている。スケジューラアプリケーション２０８は、本実施の形態で記載されるように、スケジューラノード１０４の動作を実現する。スケジューラノード１０４は、ジョブのキュー２１０を含む。ジョブのキュー２１０は、検証されるべき検査下にあるコード２２６の一部を表す、１以上のジョブのリストを含む。ジョブのキュー２１０は、あるキュー又は他の適切なデータ構造で実現される。ジョブキュー２１０は、メモリ２１８に記憶されている。スケジューラノード１０４は、利用可能なリソースのリスト２１２を含む。利用可能なリソースのリスト２１２は、検査下にあるコード２２６の一部を検証するために利用可能な、ワーカノード１０６のような１以上の計算リソースの一覧を含む。利用可能なリソースのリスト２１２は、ある表、キュー、又は他の適切なデータ構造で実現される。利用可能なリソースのリスト２１２は、メモリ２１８に記憶されている。
【００１４】
ワーカノード１０６は、メモリ２２２に結合されるプロセッサ２２４を含む。ノードのプロセッサ２２０，２２４は、たとえばマイクロプロセッサ、マイクロコントローラ、デジタルシグナルプロセッサ（DSP）、特定用途向け集積回路（ASIC）、又は、プログラム命令を解釈及び／又は実行し、及び／又はデータを処理する他のデジタル又はアナログ回路を含む。プロセッサ２２０，２２４は、プログラム命令を解釈及び／又は実行し、及び／又は、ノードのそれぞれのメモリ２１８，２２２に記憶されるデータを処理する。メモリ２１８，２２２は、（たとえばコンピュータ読み取り可能な記録媒体といった）ある期間についてプログラム命令及び／又はデータを保持する任意のシステム、デバイス、又は装置を含む場合がある。
【００１５】
ワーカノード１０６は、ワーカソフトウェアの検証アプリケーション２１４を含む。ワーカソフトウェアの検証アプリケーション２１４は、プロセッサ２２４により実行され、メモリ２２２に記憶されている。ワーカノード１０６は、１以上のポリシー２１６を含み、１以上のポリシーは、検査下にあるコード２２６の一部の検証における判定を行うために、ワーカノードにより使用される。ワーカノード１０６は、スケジューラノード１０４から１以上のポリシー２１６を受信する。ポリシー２１６は、限定されるものではないが、ジョブの可用性のポリシー、リソースの可能性のポリシー、及びスケジューリングポリシーを含む。
【００１６】
スケジューラアプリケーション２０８及びワーカソフトウェア検証アプリケーション２１４は、検査下にあるコード２２６を検証するような計算のタスクの並列化を可能にするミドルウェアを互いに構成する。ワーカノード１０６とスケジューラノード１０４との間の通信は、時間、ネットワーク及び／又は処理リソースの観点で非常に高価である場合がある。分散コンピューティングシステム１００は、ワーカノード１０６とスケジューラノード１０４との間の通信を最小にする。従って、検査下にあるコード２２６を検証するタスクは、スケジューラアプリケーション２０８とワーカソフトウェア検証アプリケーション２１４を通して、スケジューラノード１０４とワーカノード１０６との間で分割される。スケジューラアプリケーション２０８は、検査下にあるコード２２６を検証する作業をタスクに分割し、分割されたタスクを並列の検証のためにワーカノード１０６に供給し、ポリシー及び他の動作パラメータをワーカノード１０６及び他のワーカノードに供給し、係る並列な検証の結果を得る。ワーカソフトウェアアプリケーション２１４は、ポリシー２１６の下でスケジューラノード１０４により指定されたように、検査下にあるコード２２６の一部を検査するか、スケージューラノード１０４により供給される他のパラメータを検査し、その結果を報告する。
【００１７】
ノードのプロセッサ２２０，２２４は、たとえばマイクロプロセッサ、マイクロコントローラ、デジタルシグナルプロセッサ（DSP）、特定用途向け集積回路（ASIC）、又はプログラム命令を解釈及び／又は実行し、及び／又はデータを処理する他のデジタル又はアナログ回路を含む。プロセッサ２２０，２２４は、ノードのそれぞれのメモリ２１８，２２２に記憶されている、プログラム命令を解釈及び／又は実行し、及び／又はデータを処理する場合がある。メモリ２１８，２２２は、１以上のメモリモジュールを保持及び／又は収容するシステム、デバイス又は装置を含む。それぞれのメモリモジュールは、（たとえばコンピュータ読み取り可能な記録媒体といった）ある期間についてプログラム命令及び／又はデータを保持するシステム、デバイス又は装置を含む場合がある。
【００１８】
図１を参照して、分散コンピューティングシステム１００は、分散コンピューティングシステム１００でのサービスとして、ソフトウェアの検証１０８を提供する。ソフトウェアの検証は、分散コンピューティングシステム１００の並列の計算能力をてこ入れすることで更に効率的に達成される。１実施の形態では、分散コンピュータシステム１００は、記号的実行（symbolic  execution）を使用することで、検査下にあるコード２２６のようなソフトウェアを検証する。記号的実行は、実行における記号の使用により、ソフトウェアの動作を検証するため、適切なやり方で達成される。係る記号的実行がどのように達成されるかに関する１つの例は、米国特許出願12/271651の“Using  Symbolic  Execution  to  Check  Global  Temporal  Requirement  in  an  Applications”のコピーにおいて発見され、この特許出願の内容は、引用により本明細書に盛り込まれる。記号的実行は、要件をチェックするためにソフトウェアの振る舞いの一部を形式化するために使用される。たとえば、検査下にあるコードの所与の部分の動作は、記号により表現され、プロパティ（property）により定義される。コードの可能性のある結果が判定される場合があり、係るプロパティは、可能性のある許容可能な値の範囲を示す場合がある。記号的実行は、係るプロパティを無効にする条件が存在するかを判定するために使用される。たとえば、以下のソフトウェアコードを考える。
【００１９】
【表１】
0005845809.tif 000002
係るコードについて、記号は、コードの様々なエレメントを表現するために使用される。たとえばａ＝ｘ，ｂ＝ｙ，ｃ＝ｚであり、Φは、値及び条件を含めて、結果として得られるセットに等しい。セットΦは、ｃ＝ａ＋ｂを必要とするコードにおける指示のため、最初にΦ＝｛ｚ＝ｘ＋ｙ｝として評価される。次いで、条件文（if  c>0）がコードに現れ、可能性が分割されることを要求する。係る条件文から、ｚがゼロよりも大きいか否かに依存して、２つの可能性が存在する。従って、セットΦは、Φ＝｛（ｚ＝ｘ＋ｙ）＆（ｚ＞０）又はΦ＝｛（ｚ＝ｘ＋ｙ）＆（ｚ≦０）｝の何れかとして定義される。２つの係る選択のうちの第一の選択は、ｚがインクリメントされ、Φ＝｛（ｚ＝ｘ＋ｙ＋１）＆（ｚ＞１）｝となることを要求する更なるコードをトリガする。従って、Φ＝｛（ｚ＝ｘ＋ｙ＋１）＆（ｚ＞１）｝及びΦ＝｛（ｚ＝ｘ＋ｙ）＆（ｚ≦０）｝は、先のソフトウェアコードのフラグメントでの記号的実行を通して計算される、結果として得られるシンボルの経路である。
【００２０】
係るコードについて、ａ＞１及びｂ＞０の場合に、ｃが２よりも大きくなければならないことを要求するプロパティが確立される。係るプロパティは、プロパティを否定し、否定されたプロパティの解が記号的表現に存在するかを判定することで、評価すべき記号的表現に対してチェックされる。たとえば、Φ＝｛（ｚ＝ｘ＋ｙ）＆（ｚ≦０）｝について、ｘは、（プロパティにより定義されるように）１よりも大きく、ｙは、（プロパティにより定義されるように）ゼロよりも大きく、ｚは、（式により必要とされるように）ｘ＋ｙに等しく、ｚは、（式により必要とされるように）０以下となる必要があり、ｚは、（プロパティを否定することで定義されるように）２以下となる必要がある。適切な制約ソルバ（constraint  solver）又は判定手順（decision  procedure）を使用してこれらの式を解くことで、分散コンピューティングシステム１００上のワーカノード１０６は、解が存在しないことを判定し、従ってコードセグメントは、プロパティにより確立される基準をパスする。同様に、Φ＝｛（ｚ＝ｘ＋ｙ＋１）＆（ｚ＞０）｝について、ｘは、（プロパティにより定義されるように）１よりも大きく、ｙは、（プロパティにより定義されるように）０よりも大きく、ｚは、（式により要求されるように）ｘ＋ｙ＋１に等しく、ｚは、（式により要求されるように）０よりも大きい必要があり、ｚは、（プロパティを否定することで定義されるように）２以下である必要がある。適切な制約ソルバ又は判定手順を使用してこれらの式を解くことで、分散コンピューティングシステム１００におけるワーカノード１０６は、解が存在しないことを判定し、従ってコードセグメントは、プロパティにより確立される基準をパスする。係る解が存在する場合、従ってプロパティに違反する場合、係る違反は、バグとして識別される場合がある。係るバグは、分散コンピューティングシステムによりスケジューラノード１０４に報告され、ログとして記録され、又は最終的にユーザに報告される。コード、特性及びツリーにおけるポイントのような、バグが判定された文脈（context）が報告される場合がある。
【００２１】
このように、分散コンピューティングシステムは、コードにより実現されるソフトウェアを検証するために検査下にあるコードに記号的実行を行う。検査下にあるコードの記号的実行を行うことで、分散コンピューティングシステムは、自動的な検査を行う。その自動的な検査の間、分散コンピューティングシステムは、検査下にあるコードのそれぞれの条件付き演算で、検査下にあるコードにおける条件付き分岐で使用されるべきデータの可能性のあるセットを表す可能性の範囲を、処理すべき記号的実行のツリーの個別の分岐に分割する。１実施の形態では、係る分岐、分割及び記号的実行は、再帰的に実行される場合がある。
【００２２】
図３は、条件に遭遇し、式が評価され、新たなジョブが作成され、バグが決定されたときの、検査下にあるコード２２６のようなソフトウェアを検証する分散コンピューティングシステム１００の動作を例示する。スケジューラノード１０４は、ジョブをワーカノード１０６に割り当て、このワーカノードは、STARTノード３００で開始する。ワーカノード１０６は、コードにおける条件文に到達するまで、コードに記号的実行を行う。ある条件文での検査下にあるコード２２６の記号的実行は、その条件文の後の異なる実行のオプションに関連するコードの記号的実行を必要とする。たとえば、先の例から、“if  (c>0)”に関連する条件は、記号的実行が行われるコードの２つの部分を生じる場合がある。あるケースでは、係る２つの部分は、更なる条件を含むコードの大きなセクションを含む。係る２つの部分は、サブツリー３０２で表現される。記号的実行が行われ且つ検査されるソフトウェア内で遭遇する条件文は、経路の選択ポイント３０４により表現される。経路の選択ポイント３０４は、ある条件文の動作を表し、これに対して、複数の後続する経路が可能である。前の例を使用して、ある経路の選択ポイント３０４のノードは、少なくとも２つの可能なｚの範囲を生成し、これに対して、１よりも大きいｚ、及び０以下のｚといった、それぞれの範囲が記号的に実行される。それぞれの係る判定ポイント３０４は、行われる必要がある更なる条件的な判定を生成する。従って、図３に示されるグラフは、検査下にあるコードの一部の要求される記号的実行の成長を表す。記号的実行の成長により作成されるそれぞれの新たなサブツリー３０２は、更なる記号的実行を要求するものであり、スケジューラノード１０４が同じ又は別のワーカノード１０６に続いて割り当てるジョブとして、ワーカノード１０６により定義される。結果として、それぞれのジョブは、記号的実行を行うコードのグラフのサブツリー３０２を表す。
【００２３】
図３の例では、４つの条件文が記号的に実行され、ジョブJ1，J2，J3及びJ4として割り当てられている４つのサブツリー３０２を生成している。スケジューラノード１０４は、N1，N2，N3及びN4として識別される、１以上のワーカノード１０６にジョブを割り当てる。ワーカノード１０６は、検査下にあるコードの記号的実行の間に遭遇されるとき、経路の選択ポイント３０４の分岐から新たなジョブを定義する。また、ワーカノード１０６は、検査下にあるコードの記号的実行の間に遭遇されるとき、経路の選択ポイント３０４の分岐の実行を終了する。たとえば、ジョブJ3の実行の間、ワーカノードN1は、経路の選択ポイントＤに遭遇するが、結果として得られる両方の分岐の記号的実行を継続する。対照的に、ワーカノード１０６は、経路の選択ポイントＥに関連する条件文に遭遇し、実行の分岐のうちの１つに関連する少なくとも１つの新たなジョブを作成し、条件文の分岐は、ジョブJ2及びJ4に含まれ、ワーカノードN3及びN2により記号的実行が行われる。新たなジョブを作成、分割及び割り当てたポリシーが以下に説明される。分散コンピューティングシステム１００が任意の数のワーカノード１０６を含むとき、スケジューラノード１０４によるジョブの割り当てのために任意の数のワーカノード１０６が利用可能である。スケジューラノード１０４は、ジョブのキュー２１０におけるワーカノード１０６からジョブが作成されたとき、ジョブを記憶する。
【００２４】
ワーカノード１０６は、スケジューラノード１０４により割り当てられるジョブを記号的に実行する。ワーカノード１０６は、記号的に実行しているコードにおける更なる条件文に到達する場合がある。以下に記載されるポリシーに依存して、ワーカノード１０６は、条件文の分岐を処理し続けるか、又は新たなジョブとして条件文の分岐を指定し、新たなジョブをスケジューラノード１０４にリターンし、この新たなジョブは、以下に記載される基準に従って、スケジューラノード１０４によりワーカノード１０６のうちの１つに割り当てられる。ワーカノード１０６は、以下に記載されるポリシーに依存して、あるジョブの記号的実行を終了する。サブツリー３０２におけるコードの一部を記号的に実行するワーカノード１０６は、ある結果に到達し、この結果は、記号的実行により判定されたプロパティに従ってサブツリー３０２におけるコードの有効性を検証すること、記号的実行により決定されるプロパティの違反としてバグ３０６を発見すること、或いは、時間、深さ又は別のパラメータの観点で計算の幾つかの境界に到達することを含む。ワーカノード１０６は、ジョブの終了に応じて、スケジューラノード１０４に、そのステータス及び記号的実行の結果を伝達する。
【００２５】
スケジューラノード１０４は、ジョブの実行のバランスを取る。作成されたジョブの何れかを実行するために必要とされる作業は、他のジョブに比較して著しく異なる。たとえば、ジョブJ3のサブツリー３０２は、評価されるべき幾つかのエレメントを含むが、係るエレメントは、ジョブJ2のサブツリー３０２のエレメントよりもスコープ（scope）に関してシンプルである。にもかかわらず、１実現では、Xのワーカノード１０６が利用可能である場合に、所定の数Xのコードのトレースが生成されるまで、スケジューラノード１０４は、コードのツリーの調査に記号的実行が行われるのを可能にする。従って、深さ（Y-1）のトレースが多数のワーカノード１０６に送出され、多数のワーカノード１０６は、X未満であるか、又はXに等しい。それぞれのワーカノード１０６がその割り当てられたジョブを終了したとき、その出力データは、スケジューラノード１０４に供給され、スケジューラノードは、最後のワーカノード１０６が終了した後に出力データを収集する。別の実現では、スケジューラノード１０４は、Xのワーカノード１０６がコードの一部に記号的実行を行うために利用可能である場合に、少なくともXのトレースが生成されるまで、深さYに記号的実行が行われるように、コードのツリーを調査する。次いで、スケジューラノード１０４は、ワーカノード１０６があるジョブを終了するかを判定するため、総当り的なやり方に基づいてワーカノードをポーリングする。所与のワーカノード１０６が終了した場合、スケジューラノード１４は、ジョブの出力を収集し、丁度終了したワーカノード１０６に、ジョブのキュー２１０からの新たなジョブを送出する。しかし、係る実現は、他のジョブよりも大きいジョブを考慮していない場合があるか、幾つかのワーカノード１０６は、他のワーカノード１０６が大きなジョブで作業している間に使用されていない場合がある。係る実現は、あるジョブを動的に分割し、係る分割されたジョブを使用されていないワーカノードに割り当てるように構成されていない。
【００２６】
動作において、１実施の形態では、スケジュールノード１０４は、ジョブが作成されたとき、及び記号的実行が行われたときに、ジョブを知的且つ動的に釣り合いを取る。図４は、記号的実行が行われるコードを知的且つ動的に区分する分散コンピューティングシステム１００の動作を例示する。グラフ４０２は、コードに記号的実行が行われ、新たなジョブが作成され、終了の状態に到達したとき、検査下にあるコードの実行ツリーを例示するものであり、スケジューラノード１０４の指示の下でワーカノード１０６によりバグが発見される。スケジューラノード１０４は、以下に記載されるポリシー及び方法を使用して、あるジョブをワーカノード１０６に割り当てる。グラフ４０２は、ワーカノード１０６によりジョブの記号コードの実行を表す。ワーカノードがジョブの記号的実行を開始する最初の実行ポイント４０４は、初期化の経路の状態に対応する。初期化の経路の状態は、最初の実行ポイント４０４に導かれる条件文の一連の決定又は値を含む。初期化の経路の状態は、ジョブがワーカノード１０６に割り当てられたとき、スケジューラノード１０４により設定される。ワーカノード１０６は、初期化の経路の状態において記録される決定の再生を通して初期化される。初期化の経路の状態は、最初の実行ポイント４０４に導かれる検査下にあるコードにおける実行のツリーまでの条件付き判定のレコードである。
【００２７】
ワーカノード１０６は、幾つかの条件のうちの１つに到達するまで、コードに記号的実行を行う。はじめに、ワーカノード１０６は、その分岐が検証されるまでツリーの分岐に記号的実行を行い、記号的実行は、バグ又はエラーを検出することなしに、その分岐について終了する。係る条件は、検証されたポイント４１４により表現される。検証されたポイント４１４は、検証されたプログラムの振る舞いのトレースを表す。第二に、ワーカノード１０６は、ある条件文でツリーの分岐に記号的実行を行い、このツリーは、１以上のサブツリーに処理される。それぞれのサブツリーは、後になって記号的実行の新たなジョブとして記号的に実行されるか又はマークされる。係るポイントは、実行されたポイント４０８により表現される。第三に、上述されたように、ワーカノード１０６は、１以上の新たなジョブが記号的実行の結果として作成されるまで、ツリーの分岐に記号的実行を行う。割り当てのためにスケジューラノードに送出される、新たなジョブとしてのサブツリーの係る部分の指定は、以下に記載されるポリシー及び方法に従って、ワーカノード１０６により行われる。係る条件は、新たなジョブ４１０により表される。第四に、グラフの一部は、記号的実行が施され、記号的実行により判定されたときに、バグ、矛盾、又は他のエラーを含むことが判定される。係るバグは、スケジューラノード１０４に送出される。バグは、グラフ４０２上のバグ４１４として表現される。
【００２８】
あるジョブの終了に応じて、ワーカノード１０６は、終了の経路の状態を記憶する。終了の経路の状態は、ジョブが終了されたとき、ワーカノード１０６が実行していた状態を反映する。終了の経路の状態は、その状態に到達するために必要なプレディケートステップ（predicate  step）のレコードを含む場合がある。終了の経路の状態は、ワーカノード１０６が将来において所与のジョブについて良好なフィットであるかを判定するために使用される。
【００２９】
図１及び図２を参照して、分散コンピューティングシステム１００は、コードを効率的に解析するため、ワーカノードの間で処理ジョブの負荷を知的且つ動的に釣り合いを取るために知的な判定（intelligent  decision）を行うために、１以上のポリシーを使用する。スケジューラノード１０４は、割り当てられるジョブと共に係るポリシーをワーカノード１０６に割り当てるか、スケジューラノード１０４の動作においてポリシーを実現する。ワーカノード１０６は、スケジューラノード１０４と更なる通信を行うことなしに、ポリシーを実行する。
【００３０】
１実施の形態では、分散コンピューティングシステム１００は、現在のジョブ内でサブツリーに記号的実行を行い続けるワーカノード１０６とは対照的に、ワーカノード１０６が、コードのサブツリーに記号的実行を行っている間に、将来の処理のために係る新たなジョブを何時生成すべきかを判定するため、ジョブの可用性のポリシー２１６ａを使用する。別の実施の形態では、分散コンピューティングシステム１００は、あるジョブに記号的実行を行っている所与のワーカノード１０６が、そのジョブに記号的実行を行い続けるのではなく、そのジョブの記号的実行を何時終了すべきか、新たなジョブの割り当てのために何時利用可能となるかを判定するために、リソースの可用性のポリシー２１６ｂを使用する。更に別の実施の形態では、分散されたコンピューティングシステム１００は、スケジュールノード１０４により、ジョブのキュー１０４におけるどのジョブが、利用可能なリソースのリスト２１２において指定されたどのワーカノード１０６に割り当てられるべきかを判定するため、スケジューリングのポリシー２１６ｃを使用する。
【００３１】
上述されたように、スケジュールノード１０４は、知的且つ動的なロードバランスを通してソフトウェアの解析を効率的に並列化するため、分散コンピューティングシステム１００の動作を調整する。スケジューラノード１０４は、検査下にあるコードの記号的実行を初期化し、ワーカノード１０６をジョブに割り当て、ワーカノード１０６からの結果及び新たなジョブの戻りをモニタし、ワーカノード１０６をジョブキュー２１０からの更なるジョブに割り当て直し、ワーカノード１０６の実行及び終了を調整し、検査下にあるコードの記号的実行が何時終了するかを判定する。スケジューラノード１０４は、結果、新たに識別されたジョブ、ステータス及びパラメータをやり取りするためにワーカノード１０６と通信する。１実施の形態では、スケジュールノード１０４は、ワーカノード１０６がコードに記号的実行を行っている間に、ワーカノード１０６のパラメータを更新する。係る更新は、ワーカノード１０６から受信された、実行の統計量を含む状態に基づいており、ワーカノード１０６は、スケジューラノード１０４に、ジョブの実行が期待されたよりも長く要するか又は短く要するか、所定数の新たなジョブが生成されているか又は所定の割合で生成されているか、実行が所定の時間長について生じているか、或いは他の適切な情報を通知する。スケジューラノード１０４は、そのワーカノードから受信された情報に基づいて、個々のワーカノード１０６についてジョブの可用性のパラメータ又はリソースの可用性のパラメータを調節する。スケジューラノード１０４は、ワーカノード１０６からの集合の状態の報告に基づいて、或いは、ジョブキュー２１０又は利用可能なリソースのリスト２１２の状態に基づいて、ある範囲のワーカノード１０６についてジョブの可用性のパラメータ又はリソースの可用性のパラメータを調整する。
【００３２】
図５は、知的且つ動的なロードバランシングを通してソフトウェアの解析を効率的に並列化するため、分散コンピューティングシステムの動作を調整する方法５００の例示的な実施の形態である。１実施の形態では、本方法５００は、スケジュールノード１０４により実現される。他の実施の形態では、本方法５００は、ワーカノード１０６により部分的に実現される。
【００３３】
ステップ５０５で、最初の記号的実行の段階が達成される。適切な初期化が使用される場合がある。１実施の形態では、検査下にあるコードのXの初期化シーケンスが発見及び作成される。初期化シーケンスは、検査下にあるコードの実行ツリーにおける最初の実行ポイントを反映する。それぞれが異なるワーカノードに対応するX個の異なる最初の実行ポイントを十分に作成するため、幾つかの記号的実行が行われる場合がある。X個の最初の実行ポイントの数は、利用可能なワーカノードの数よりも多くあるべきである。利用可能なリソースリストは、利用可能なワーカノードの数を決定するために調べられる。ステップ５０７で、それぞれの初期化シーケンスのジョブは、ジョブのキューに追加される。
【００３４】
ステップ５１０で、N個のワーカのどの動作が開始される。N個のワーカノードの動作を開始する適切な方法が使用される場合がある。１実施の形態では、スケジューリングポリシーは、ジョブのキューからの未解決のジョブをワーカノードに割り当てるために調べられる。別の実施の形態では、ワーカノードの数（N）は、未解決のジョブの数（X）よりも少ない。それぞれのワーカノードについて、ステップ５１５で、入力パラメータは、ワーカノードに供給される。係る入力パラメータは、ジョブの可用性のポリシー又はリソースの可用性のポリシーのようなポリシーから導出される。係るポリシーは、どのような条件下で新たなジョブが作成されるべきか、及び記号的実行が何時終了されるべきかに関するワーカノードの情報を供給する。
【００３５】
ステップ５２０で、ジョブのキューと利用可能なリソースのリストがモニタされる。ステップ５２５で、ジョブ及び利用可能なリソースの両者はジョブのキューと利用可能なリソースリストにおいて未解決であるかが判定される。未解決である場合、ステップ５３０で、あるジョブが利用可能なワーカノードに割り当てられる。そのようにするため、スケジューリングポリシーは、どのジョブをどのワーカノードに割り当てるべきかを判定するために使用される。ステップ５３５では、入力パラメータは、ワーカノードに供給される場合がある。係る入力パラメータは、ジョブの可用性のポリシー又はリソースの可用性のポリシーのようなポリシーから導出される。係るポリシーは、どのような条件下で新たなジョブが作成されるべきか、及び記号的実行が何時終了されるべきかに関するワーカノードの情報を提供する。
【００３６】
ステップ５３７で、余りに多くのジョブ、十分ではないジョブ、余りに多くのリソース又は十分ではないリソースが未解決である場合、ジョブの作成又はリソースの可用性を統括するポリシーが評価し直される場合がある。利用可能なリソースなしでジョブが未解決である場合、リソースの使用を良好に最大にするため、ポリシーは調べられ、調節される。たとえば、ジョブの可用性のポリシーは、記号的実行の間により少ない新たなジョブを作成するために調整される場合がある。リソースの可用性のポリシーは、ワーカノードにより記号的実行をすみやかに終了するために調整される。同様に、利用可能なワーカノードがジョブなしで未解決である場合、ポリシーが調べられ、調整される。たとえば、ジョブの可用性のポリシーは、記号的実行の間の更なる新たなジョブを作成するために調節される。リソースの可用性のポリシーは、ワーカノードによる記号的実行を延長するために調節される。
【００３７】
ステップ５４０で、記号的実行が終了されるべきかが判定される。係る判定は、適切なやり方で行われる。１実施の形態では、ジョブのキューが空であるか、そして全てのワーカノードが使用されていないかが判定される。ジョブのキューが空であって、全てのワーカノードが使用されていない場合、この条件は、検査下のあるコードの記号的実行が終了されていることを示す。記号的実行が終了している場合、ステップ５４５で、ワーカノードによる記号的実行からの全ての結果が収集され、結果が記憶され、ワーカノードが終了される。
【００３８】
ステップ５５０で、検査下にあるコードの記号的実行が終了されていない場合、何れかのワーカノードが、それらの割り当てられたジョブを実行することから回復しているかが判定される。係る判定は、適切なやり方で行われる。１実施の形態では、あるジョブで終了したワーカノードは、そのジョブの終了に関する通知を提供する。ステップ５５５では、ワーカノードにより前のジョブの実行の間に作成された新たなジョブは、ジョブのキューに追加される。ステップ５６０で、ワーカノードは、分散コンピューティングシステムにおいてソフトウェアを検証し続ける場合に、利用可能なリソースのリストに戻される。幾つかのワーカノードは、分散コンピューティングシステムの一部として、記号的実行のためにもはや利用可能ではなく、従って利用可能なリソースのリストに戻されない。
【００３９】
ステップ５６５では、検査下のあるコードの記号的実行が終了されていない場合、コードの記号的実行が終了するまで、ステップ５２５における未解決のエントリについてジョブのキュー及び利用可能なリソースのリストをモニタするステップが繰り返される。
【００４０】
図４を参照して、ワーカノード１０６は、スケジューラノード１０４により、あるジョブが割り当てられる。ワーカノード１０６は、永続的なやり方で又は新たに割り当てジョブに関連して、スケジューラノード１０４から、１以上の動作パラメータを受信する。動作パラメータは、ワーカノードにより記憶される、１以上のポリシーに基づいている。ワーカノード１０６は、終了の状態に到達するまで、ジョブに関連されるソフトウェアを解析する。ワーカノード１０６は、適切なやり方でソフトウェアを解析する。１実施の形態では、ワーカノード１０６は、ソフトウェアに記号的実行を行う。終了の状態は、リソースの可用性のポリシーに基づいている。解析の間、ワーカノード１０６は、コードを解析している間に発見された検査下にあるコードにおいて発見された分岐から新たなジョブを作成する。ワーカノード１０６が新たなジョブを作成する条件は、検査下にあるコードの一部を解析し続けるのとは対照的に、ジョブの可用性のポリシーに基づいている。ワーカノード１０６は、新たなジョブを含めて、検査下にあるコードを解析した結果をスケジューラノードに送出する。ワーカノード１０６は、利用可能なリソースのリスト２１２に戻り、更なる割り当てられたジョブを待つか、又は、ソフトウェアを解析する分散ネットワークシステム１００に参加することができない場合に、利用可能なリソースのリスト２１２に戻らない。
【００４１】
ワーカノード１０６による計算の終了に応じて、ワーカノード１０６は、その最後の既知の状態を保持する。係る最後の既知の状態は、計算が終了したときに記号的実行を行っていた経路を含む。係る経路は、終了の経路の状態として知られている。終了の経路の状態は、新たなジョブ及び新たなノードの初期化を新たに終了したワーカノード１０６に割り当てるため、スケジュールノード１０４のスケジューリングポリシーの一部として使用される場合がある。
【００４２】
図６は、分散コンピューティング環境におけるソフトウェアの解析の問題の並列化のための効率的な部分的計算の方法６００の例示的な実施の形態である。１実施の形態では、本方法６００は、１以上のワーカノード１０６により実現される。本方法６００は、任意の数のワーカノード１０６により並列に行われる。別の実施の形態では、本方法６００は、スケジューラノード１０４により全体的又は部分的に実現される場合がある。本方法６００は、図５のステップ５１０及び５３０の実行に応じて開始される。
【００４３】
ステップ６０５では、利用可能なリソースのリストが結合される。係るリストを結合することは、ソフトウェアの一部を解析する新たなリソースの可用性に関して直接的又は間接的な通知をスケジューラノードに提供する。ステップ６１０では、解析されるべきソフトウェアの一部に対応するジョブが受信される。同時に、解析の動作に関するパラメータが受信される。係るパラメータは、割り当てられたジョブの一部として提供される。係るパラメータは、初期化の経路、初期化の経路の状態、サーチストラテジ、ジョブの可用性のポリシー、リソースの可用性のポリシー、又は他の適切な動作パラメータを含む。１実施の形態では、ポリシーは、予め受信される場合がある。
【００４４】
ステップ６１５では、初期化のシーケンスが再生される。初期化のシーケンスを再生することは、初期化の経路に対応する動作のセットを行うことを含む。初期化のシーケンスを再生した結果、検査下のあるコードの解析の開始ノードに到達する。ステップ６１５で、検査下のあるコードの最初の解析の適切なやり方が使用される。１実施の形態では、最初の再生は、計算及び解析について初期化するために使用される。別の実施の形態では、計算及び解析を初期化するため、部分的な引き返し（backtracking）及び再生（replay）が使用される。初期化の再生は、実行及び再生のツリーの開始で、検査下にあるコードの記号的実行の間に行われたそれぞれの条件文の判定を開始することを含む。部分的な引き返し及び再生は、前のワーカノードの終了の経路の状態を決定すること、コードにおける条件付き分岐に関連するサブツリーにおいて高い幾つかの判定を取り消すこと（undoing）を含む。係る終了の経路の状態は、割り当てられたジョブがパラメータとして提供される。１以上の前の実行が取り消される場合があり、従って実行の経路は、更なる条件付き判定が再生されるツリーにおける前の高いポイントに部分的に引き返される。
【００４５】
ステップ６２０で、検査下にあるコードは、記号的実行が行われるか、さもなければ解析される。解析されるコードは、初期化の経路の状態に最初に対応する。本方法６００の動作の間、ステップ６２０は、ジョブに対応する検査下にあるコードの実行ツリーの複数の部分について行われる。１実施の形態では、ステップ６２０は、検査下にあるコードにおける分岐点に到達するまで継続する。係る分岐点は、検査下にあるコードにおける条件文を含み、これに対して、子の実行ツリーが生成され、続いて記号的実行が行われ又はさもなければ解析される。
【００４６】
どの分岐を実行すべきか及び記憶すべきかに関する判定は、選択されたサーチストラテジに依存する。適切なサーチストラテジが選択される。１実施の形態では、深さ優先のストラテジが使用され、実行ツリーにおけるより深い進出が好まれ、従ってより深い進出につながる分岐が選択される。別の実施の形態では、分岐優先のストラテジが使用され、実行ツリーのより広い拡大がより深い進出よりも好まれる。更に別の実施の形態では、最良優先のストラテジが使用され、幾つかの特定の動作パラメータを使用して分岐が選択される。たとえば、分岐のタイプは、好まれる所与の重要度、実行の速度又は他の基準である。
【００４７】
分岐点に到達しない場合、実行ツリーにおける葉のノードに到達するまでステップ６２０は継続し、検査下にあるコードのサブツリーが完全に解析される。係る解析されたサブツリーは、矛盾又は他のエラーのインジケータが発見された場合に、サブツリーはバグを含むという結論に繋がる。別の場合、係る矛盾又は他のインジケータが発見されない場合、サブツリーが検証されたと判断される。
【００４８】
ステップ６２５で、分岐点に到達する。１実施の形態では、１つの分岐は、更なる記号的実行により調査され、他の分岐は、調査されていない分岐として記憶される。別の実施の形態では、全ての分岐は、調査されていない分岐として記憶される。調査されていない分岐を記憶するため、初期化のシーケンス、又は分岐につながるステップが記録される。
【００４９】
１実施の形態では、調査されていない分岐に関連する新たなジョブは、検査下にあるコードの記号的実行の間に作成される。係るケースでは、本方法６００は、ステップ６３０、続いてステップ６４０に進み、調査されていない分岐から新たなジョブが作成される必要があるか、終了の閾値に到達したかを判定するためにポリシーが評価される。別の実施の形態では、調査されていない分岐に関連する新たなジョブが記号的実行の終了でのみ作成される。係るケースでは、調査されていない分岐から新たなジョブを作成し、作成された新たなジョブをジョブのキューに追加するステップは、ステップ６５０に関連してのみ行われる。
【００５０】
ステップ６３０では、ジョブの可用性のポリシーは、調査されていない分岐が解析のための新たなジョブとして指定されるべきか、又は本方法６００の現在のインスタンス（instance）内の調査のために保持されるべきかを判定するために評価される。ジョブの可用性のポリシーは、最近判定された調査されていない分岐について、及び前に判定された調査されていない分岐について評価される。適切なジョブの可用性のポリシーが使用される場合がある。ジョブの可用性のポリシーは、現在のジョブについて実行がどの位長く実行が続いているかに関する判定を含む。新たなジョブを作成する判定により、記号的実行のサブツリーへの分割が引き起こされ、検査下にあるコードにおける条件付き判定に関連する分岐が、分離され、新たなジョブが形成される。ジョブの可用性のポリシーの更なる実施の形態は、以下に説明される。
【００５１】
ステップ６３２で、解析のための新たなジョブとして調査されていない分岐を指定するような動作について、ジョブの可用性のポリシーにより動作が要求される場合、ステップ６３５で、調査されていない分岐は、新たなジョブとしてジョブのキューに配置される。１実施の形態では、新たなジョブのジョブのキューへの実際の配置は、即座に開始される。係るケースでは、新たなジョブは、スケジューラノードに転送される。別の実施の形態では、新たなジョブのジョブのキューへの実際の配置が遅延される。係る遅延は、スケジューラノードによる要求に応じて、又はリソースの可用性のポリシーに従って現在のジョブの早期の終了に応じて、クリティカルな数の新たなジョブが作成されるまで、ある時間の間隔を含む。さらに、ステップ６３５で、新たなジョブを生成したサーチストラテジの文脈を示す部分的なサーチパラメータが記憶される。
【００５２】
ステップ６４０で、リソースの可用性のポリシーは、ジョブが未だ完全に解析されていないとしても、ジョブの解析が終了すべきかを判定するために評価される。適切なリソースの可用性のポリシーが使用される場合がある。可能性のあるリソースの可用性のポリシーが以下に説明される。ステップ６４５で、ジョブの計算及び解析が終了すべき場合、ステップ６５０で、新たなジョブが残りの調査されていない分岐についてジョブのキューで作成され、ステップ６５２で、部分的なサーチパラメータが記憶される。ステップ６５０は、ステップ６３５に類似したやり方で実現される。ステップ６５５で、ジョブが終了される。最後の解析の状態及び位置が記憶される。係る状態及び位置は、将来の初期化のポイントの基準としての役割を果たす。解析の結果、新たなジョブ、及び他の収集された情報は、スケジューラノードに供給される。使用されていないこと及び更なるジョブの要求を示す利用可能なリソースのリストが結合される。
【００５３】
ジョブの計算及び解析がジョブの可用性のポリシーにより終了することが判定されていない場合、ステップ６００で、実行のツリーが評価される。実行ツリーは、適切なやり方で評価される場合がある。１実施の形態では、実行ツリーは、上述されたサーチ問合せに従って評価される。実行ツリーが使い尽くされた場合、ステップ６７０で、ジョブが完了され、本方法はステップ６５２に進む。実行ツリーが使い尽くされていない場合、本方法は、ステップ６２０に進み、コードの記号的実行を継続する。ステップ６２０が記号的実行を開始する実行ツリーにおける位置は、上述されたサーチストラテジに従って決定される。
【００５４】
本方法６００の実行の間、実行の長さ、作成される新たなジョブ、調査される分岐、使用されるサーチパラメータ、又は他の情報に関するステータスのアップデートがスケジューラノードに送信される。
【００５５】
本方法６００の実行の間、動作パラメータがスケジューラノードから受信される。１実施の形態では、係るパラメータは、たとえばステップ６１０で記載されるように、１度だけ受信される。別の実施の形態では、動作パラメータは、スケジューラノードから間欠的に受信される。係る実施の形態では、係るパラメータは、本方法６００の動作を変更するために組み込まれる。
【００５６】
図４を参照して、ワーカノード１０６は、分散コンピューティング環境でソフトウェアの解析の問題の効率的な並列化のための動的且つ知的な部分的な計算の管理を提供する。ワーカノード１０６は、解析、記号的実行、又は知的且つ動的に境界が付けられる計算により係るタスクを達成する。１実施の形態では、ワーカノード１０６は、解析の文脈におけるファクタに基づいて、境界付けされた解析の閾値を適用する。先に示されたように、所与のワーカノード１０６による解析は、たとえばジョブの可用性のポリシーとリソースの可用性のポリシーに関連されるパラメータにより制御される。係るパラメータは、スケジューラノード１０４により伝達される。ジョブの可用性及びリソースの可用性の両者は、新たなジョブを作成するために条件付き分岐に基づいて所与のワーカノード１０６が所与のジョブを何時分割すべきかを判定するために使用されているとき、及び／又は所与のワーカノード１０６がそのジョブを計算するのを何時終了したかを判定するために使用されているとき、といった様々な要素を考慮する。係る要素は、境界関数で評価される。
【００５７】
１実施の形態では、係る要素は、限定されるものではないが、以下を含む。
【００５８】
（１）現在行われている実行のツリーの深さ−ｘ；
（２）所与のサブツリーの実行に費やされる時間−ｙ；
（３）所与のサブツリーで調査される判定ノードの数−ｚ；
（４）利用可能なリソースのリストにおいて使用されていないフリーのリソースの数−ｗ；及び
（５）(ａ)ある経路上の平均時間−ｕ及び(ｂ)終了された経路−ｖの平均の深さ、のようなグローバルなレベルでの計算の履歴及び／又は統計量。
【００５９】
境界関数におけるこれらのエレメントの組み合わせは、ある閾値に比較される。ワーカノード１０６は、閾値を超えるか又はさもなければ閾値に合致する境界関数の結果により閾値がトリガされているかを判定する。係るケースでは、新たなジョブが作成されるか、又はそのケースでは、ワーカノードは、その計算を終了する。係る閾値は、上述されたパラメータの適切な組み合わせにより決定される。使用される閾値は、ジョブの可用性のポリシーとリソースの可用性のポリシーとの間で異なる。閾値は、それぞれの係るポリシーについて、検査されるべきコードの特定のタイプ、及び検査されるべき特定のコードのセットについて実験的に決定される場合がある。閾値は、新たなジョブの作成及びワーカノードの計算との釣り合いを取るために、実験的に決定される場合がある。上述されたパラメータのそれぞれには、対応する定数又はａ，ｂ，ｃ，ｄ，ｅ又はｆのような重み付け値が割り当てられる。従って、係る閾値Ｔを超えているかに関する判定は、以下の境界関数の例となる式により形式化される。  
ａ*ｘ＋ｂ*ｙ＋ｃ*ｚ＋ｄ*ｗ＋ｅ*ｕ＋ｆ*ｖ＞Ｔ
境界関数は、たとえば１以上の上述されたパラメータを使用して閾値を超えているかを判定するため、適切な計算又は判定を使用する。たとえば、複雑な論理式、２変数関数、非線形関数、又はファジー計算が境界関数として使用される。たとえば、待機しているワーカノードの数が１０を超えた場合、ジョブの可用性の閾値は、他の要素に係らず、自動的に超えられる。別の例では、ジョブは、シンプルに終了され、全ての発見された新たなジョブを解放する。更に別の例では、待機しているワーカノードに対応する要素の重み付け値が増加される。係る例は、ジョブのキュー又は利用可能なリソースのリストがある最大値を超えたか、又はある最小量よりも下回ったかを調べることでトリガされる。
【００６０】
係る制約は、閾値Ｔについて記載された実験に類似した実験により決定される。より大きな重み又はより小さな重みは、それらの影響が特定の状況において決定されたとき、所与のパラメータに配置される場合がある。たとえば、スケジュールノード１０４は、制約を調節し、従って、ワーカノード１０６からのステータスのアップデートに基づいて、利用可能なリソースのリスト２１２におけるリソースの可用性に基づいて、又はジョブのキュー２１０における新たなジョブに基づいて、関連されるポリシーを調節する。スケジュールノード１０４は、ジョブのキュー２１０における未解決のジョブに関連してワーカノード２１０の使用を最適化するため、係る制約を調節する。同様に、スケジュールノード１０４は、リソースの可用性のポリシー又はジョブの可用性のポリシーの何れかに関連する閾値を調節する。
【００６１】
ジョブの可用性のポリシーの閾値は、リソースの可用性の閾値よりも低い。係るケースでは、ワーカノードが終了されていない間に、ジョブが生じる。さもなければ、閾値が等しい場合、現在のジョブの実行の終了と同時に新たなジョブが生じる。
【００６２】
１つの例では、新たなジョブを作成する閾値関数は、以下の式となるように決定される。
【００６３】
−５*ｘ＋０．０２*ｙ＋０．００５*ｚ＋１０*ｗ−０．０１*ｕ−１*ｖ＞５０
この閾値関数を超えて、ワーカノード１０６により遭遇される調査されていない分岐は、新たなジョブとして作成される。制約の値は、唯一の例を反映しており、特定のソフトウェアの解析で遭遇される特定の状況に依存して変化する。相対的な重み及びそれぞれの極性の議論は、例について以下に与えられる。
【００６４】
「−５*ｘ」
“ｘ”は、実行が行われている計算ツリーの深さである。深さは、それぞれの記号による分岐のレベルで１だけ増加する。従って、計算が行われているツリーの深さが増加するときに、再生の非常に高いコストが、閾値に到達して新たなジョブを開始することが困難となることを意味するとき、定数“ａ”は、負である可能性がある。
【００６５】
「０．０２*ｙ」
“ｙ”は、ワーカノード１０６が現在のジョブに関して計算している時間（秒）である。係る解析により費やされる時間が多くなると、解析を終了して、新たなジョブを生じる傾向が高くなることを意味する。従って、定数“ｂ”は、典型的に正の値である。
【００６６】
「０．００５*ｚ」
“ｚ”は、サブツリーで既に遭遇された判定ノードの数である。判定のサブツリーが余りに大きくなり過ぎた場合、ジョブを終了し及び／又は新たなジョブを生じる傾向が増加する。従って、定数“ｃ”は、典型的に正である。サブツリーにおいて既に遭遇した非常に多くの判定ノードが、動的にバランスを取る必要がある作業負荷の程度に関して重要ではないとき、“ｃ”の値は、比較的低い。
【００６７】
「１０*ｗ」
“ｗ”は、利用可能なリソースのキューにおける使用されていないワーカノード１０６の数である。使用されていないワーカノードは、有すべき非常に悪い問題であり、係るように、定数“ｄ”は、正であって且つ大きい。大きな数は、既存のジョブをすぐに終了すると同様に、より積極的に新たなジョブに広がる。新たなジョブは、現在実行しているジョブの終了までジョブのキューに追加されないリソースの可用性のポリシーの文脈では、係る定数は、ジョブのキューへの追加のために新たなジョブを解放するように非常に高い。係る状況では、ワーカノード１０６により発見される未解決の新たなジョブの数は、この要素を考慮する。
【００６８】
「−０．０１*ｕ」
“ｕ”は、ある経路に関する平均時間（秒）である。これは、現在のジョブ内の経路の平均時間であるか、又はスケジューラノード１０４により集められた全てのジョブにわたる平均時間である。この要素は、幾つかの有効な作業を完了するための最少の時間量を確定するか、又は、新たなジョブの頻繁な非生産的な発生を防止するために使用される。係るように、定数“ｅ”は、負であり、分散ネットワークシステム１００の速度に従って比較的小さい。この要素は、ジョブをワーカノード１０６に割り当てるオーバヘッド、及びワーカノード１０６とスケジュールノード１０４との間の通信のために性能が低下する、リソースの過剰なチャーニング（churning）、又は過剰な小さく且つ実体のないジョブの過剰な発生を防止するために使用される。
【００６９】
「−１*ｖ」
“ｖ”は、ワーカノード１０６によりこれまでの遭遇した解析及び実行の経路の平均の深さである。これは、現在のジョブ内の経路の平均、又はスケジューラノード１０４により集められる全てのジョブの平均である。この要素は、所定の深さに到達したかを判定するために使用され、所定に深さに到達した場合に、新たなジョブを生じる。幾つかのケースでは、この要素は、深い実行のレベルを促進するために使用される。従って、定数“ｆ”は、正又は負である。
【００７０】
「＞５０」
上述されたように、ジョブの可用性及びリソースの可用性の閾値は、それぞれ、個別に又は一緒に決定される。スケジューラノード１０４は、ワーカノード１０６の使用を比較的最適にする要件に依存して、ワーカノード１０６について何れかの閾値を調節する。ジョブの可用性及びリソースの可用性の閾値は、互いに関して調節される。
【００７１】
図７は、分散コンピューティング環境でのソフトウェアの解析の問題の効率的な並列化のための動的且つ知的な部分的な計算の管理の方法７００の例となる実施の形態である。１実施の形態では、本方法７００は、１以上のワーカノード１０６及び／又はスケジューラノード１０４により実現される。
【００７２】
ステップ７０５では、ソフトウェアの解析の範囲の境界をつけるパラメータが設定される。１実施の形態では、係るパラメータは、スケジューラノードから受信される。別の実施の形態では、係るパラメータは、ワーカノードに送出される。最適なパラメータは、適切な動作パラメータを含む場合がある。１実施の形態では、パラメータは、閾値を含む。別の実施の形態では、パラメータは、重み付けされた値を含む。動作パラメータは、ソフトウェアの解析の適切な態様に関する。動作パラメータは、１実施の形態では、動作パラメータは、ジョブの可用性のポリシーに関する。別の実施の形態では、動作パラメータは、リソースの可用性のポリシーに関する。パラメータは、適切な形式を有する場合がある。１実施の形態では、パラメータは、式ａｘ＋ｂｙ＋ｃｚ＋ｄｗ＋ｅｕ＋ｆｖ＞Ｔを有する。
【００７３】
ステップ７１０で、動作の要素が決定され、これらの要素は、ソフトウェアの記号的実行に関連する。係る動作の要素は、計算が行われているツリーの１以上の深さ、サブツリーにおける計算で費やされる時間、サブツリーで調査される判定ノードの数、リソースのキューにおいて使用されていないフリーのリソースの数、実行の経路で費やされる平均時間、及び／又は完了された実行経路の平均の深さを含む。
【００７４】
ステップ７１５で、記号的実行に関連する動作のポリシーが評価される。係る評価は、たとえば、検査下にあるコードにおける調査されていない分岐の発見、ジョブの終了、又はサブツリーの完了に応じてトリガされる。ステップ７１５は、たとえばステップ６３０及び６４０で実現される。動作のポリシーは、たとえばジョブの可用性のポリシー又はリソースの可用性のポリシーを含む。
【００７５】
ステップ７２０で、ステップ７１５に関連して、動作ポリシーに関連する閾値を超えたかが判定される。係る閾値は、ステップ７０５において境界付けるパラメータのセットに従って設定され、境界付けるパラメータ及びステップ７１０で決定された動作の要素に従って判定される。閾値を超えている場合、ステップ７２５で、動作が行われる。係る動作は、現在のジョブの記号的実行を終了すること、又は新たなジョブを生じることを含む。
【００７６】
ステップ７３０で、ワーカノードのような使用されていないリソースの数、及び実行されるべき未解決のジョブの数が評価される。ステップ７３５で、未解決のジョブが僅かであるか又は全くない一方で、多くのワーカノードが使用されていない場合、ステップ７４０で、境界付けパラメータは、新たなジョブの発生を増加するために調節される。同様に、境界付けパラメータは、既存のジョブの記号的実行の終了を減少するために調節される。
【００７７】
ステップ７４５で、使用されていない状態のワーカノードが僅かであるか又は全くない一方で、多くのジョブが未解決である場合、ステップ７５０で、境界付けパラメータは、既存のジョブの記号的実行の終了を増加するために調節される。同様に、境界付けパラメータは、新たなジョブの発生を減少するために調節される。
【００７８】
本方法は、現在実行されているジョブが終了されるまで、ステップ７１０で繰り返される。
【００７９】
図４を参照して、ワーカノード１０６は、分散コンピューティング環境におけるソフトウェアの解析の問題の効率的な並列化のためのノードの計算の初期化技法を適用する。同様に、スケジューラノード１０４は、スケジューリングポリシーを評価するとき、係るノードの計算の初期化技法を適用する。
【００８０】
ひとたびワーカノード１０６が特定のジョブが割り当てられるために選択されると、ワーカノード１０６は、記号的実行のためにその計算を初期化する。係る初期化は、実行のために初期状態４０４を設定するための１以上の初期化のオプションの間で選択することを含む。特定の初期化のオプションを選択することは、初期化の間に記号的実行を迅速化する。異なる初期化のオプションの可用性は、特定のジョブについて様々な利用可能なワーカノード１０６の初期化の要件を考慮するとき、スケジューラノード１０４のスケジューリングのポリシーに影響を及ぼす。
【００８１】
ノードの計算の初期化を記述する注記は、指示のプレディケート（denoting  predicates）を含む。検査下にあるコードは、任意の数のプレディケート又はプログラム変数を含む。たとえば、プレディケートは、（ν１＜５）ＯＲ（ν２＝Ｔｒｕｅ）であり、ν１及びν２はコードにおける変数である。係るプレディケートは、Ｐ１，Ｐ２等として示される。経路の条件は、記号的実行の状態を表現するために使用される、プログラムのプレディケートの順序付けされたシーケンス、又はそれらの否定を含む。たとえば、（Ｐ１，¬Ｐ２，Ｐ４，¬Ｐ７，Ｐ９）は、それぞれの判定ポイントでこれら５つのプレディケート（又はそれらの否定）を選択することで到達されるプログラムの記号的実行のツリーにおけるあるポイントを表す。
【００８２】
初期化の経路の状態（“IPC”）は、特定の記号の実行経路に関連され、ジョブが初期化される必要がある経路の状態を表す。ワーカノード１０６は、IPCから記号的実行を始める。IPCの例は、初期化のポイント４０４に到達するために記号的実行の間に行われる判定のシーケンスである。終了の経路の状態（“TPC”）は、特定のワーカノード１０６と関連付けされ、ワーカノード１０６での記号的実行が終了される最後の経路の状態を表す。TPCは、ワーカノード１０６が処理した前のジョブからのワーカノード１０６での記号的実行の最後の状態を表す。TPCの例は、終了の経路の状態４１２である。ワーカノード１０６は、あるジョブの終了に応じてそのTPCを記憶する。スケジューラノード１０４は、初期化コストの計算の一部として、ジョブをワーカノード１０６に割り当てるとき、ワーカノード１０６のTPCを考慮する。
【００８３】
１つの係る初期化のオプションは、完全な再生であり、ワーカノードの計算は、ジョブに関連する条件文の全ての判定を再生することで初期化される。係るオプションは、記号の経路に沿ったプログラムの前方向の計算を含む。係るオプションは、検査下にあるコード内の条件文に関する前の判定を再生する余分のリソースを必要とする。ワーカノードの計算の初期化のための別のオプションは、引き返し及び再生であり、終了の経路の状態における条件文に関連する前の判定が取り消される。共通のプレディケートのセットに到達するために必須の数の前の判定が引き返された後、ジョブの初期化の経路の状態に従ってノードが初期化されるまで、他のプレディケートの判定が再生される。TPCから開始して、プレディケートは、経路の条件が所望のIPCのプレフィックスと同じになるまで、一度に引き返された１つのプレディケートである。次いで、所望のIPCが達成されるまで、IPCの残りのステップは、前方向に再生される。
【００８４】
図８は、例となる初期化の経路の状態及び終了の経路の状態に関する完全な再生、並びに、引き返し及び再生の動作を示す。たとえば、利用可能なリソースに割り当てられるべきジョブのキュー２１０における特定のジョブは、｛P1，¬P2，P4，¬P7，P9｝の初期化の経路の状態を有する。係るジョブは、前のジョブを実行することからの、その終了の経路の状態が｛P1，¬P2，P4，¬P7，P11，¬P14｝である利用可能なリソースのリスト２１２におけるワーカノード１０６について評価される。従って、ジョブの初期化の経路の状態とワーカノード１０６の終了の経路の状態の最初の４つのエレメントは、同じである。完全な再生の初期化のオプションを利用して、候補となるワーカのノード１０６は、｛P1，¬P2，P4，¬P7，P9｝のプレディケートの判定を行うことで、ジョブの初期化の経路の状態の全てのエレメントの実行を再生することが必要とされ、そのようにするために５つのステップを要する。引き返し及び再生のオプションを利用して、候補となるワーカノード１０６は、｛¬P14，P11｝のプレディケートの動作をはじめに引き返し、次いで、未解決のジョブの初期化の経路の状態に整合するようにP９の動作を再生し、全体として３つのステップを必要とする。この特定の例では、バックトラックアンドリプレイのオプションは、未解決のジョブの初期化の経路の状態でワーカノードを初期化する完全な再生方法よりも効率的であることがわかる。しかし、係る結論は、全てのステップが等しいコストを有することを前提としている。
【００８５】
図４を参照して、ワーカノード１０６又はスケジューラノード１０４は、後方向のトラッキングステップの数、前方向のトラッキングステップの数を決定し、それらを、分散コンピューティングシステム１００のソフトウェアの記号的実行を評価することで決定されるコストと結合することで、初期コストを定量化する。コストは、スケジューラノード１０４又は他の適切なエンティティにより決定される。コストは、分散コンピューティングシステム１００及び検査下にあるプログラムにより使用される特定の記号的実行のエンジンの関数である。また、幾つかのプレディケートが非常に複雑であるとき、コストは、あるステップから別のステップに変化する。
【００８６】
次の記号のプレディケートに記号の経路に沿って前方向に計算する平均コストを表す、平均の前方向の計算コスト（ｃf）が決定されるか又は発見される。前の記号のプレディケートに現在の記号の経路に沿って計算を引き返す（取り消す）平均のコストを表す平均のバックトラックの計算コスト（ｃb）が決定されるか又は発見される。係るコストは、バックトラッキング及びリプレイステップの時間の要件を記録するワーカノード１０６、及び、ワーカノード１０６から係る情報を収集し、情報を平均し、或いは、引き返し又は再生される必要がある実際のプレディケートについてワーカノード１０６に記憶されるコスト情報を使用したスケジューラノード１０４により発見される。１実施の形態では、前方向及び後方向の計算コストは、互いに関して設定される。
【００８７】
従って、所与のジョブの完全な再生のオプションの初期化コストは、IPCにおけるステップの数に、前方向のプレディケートステップのコストを乗じたものとして記載される。所与のワーカノード１０６の引き返し及び再生の初期化コストは、引き返しのプレディケートのステップの数と引き返しのプレディケートのステップのコストとの積に、前方向のプレディケートのステップの数と前方向のプレディケートのステップのコストとの積を加えた合計として記載される。
【００８８】
スケジューラノード１０４は、IPCの完全な再生のコストと、IPCに整合するためにワーカノード１０６のTPCの引き返し及び再生のコストとの間の最少値を決定することで、あるジョブが割り当てられているワーカノード１０６の初期化コストを決定する。従って、初期化コストは、ジョブと、ジョブが割り当てられたリソースとの関数である。
【００８９】
図９は、分散コンピューティング環境におけるソフトウェアの解析の問題の効率的な並列化のためのノードの計算の初期化技法の方法９００の例示的な実施の形態である。１実施の形態では、本方法９００は、スケジュールノード１０４又はワーカノード１０６により実現される。
【００９０】
ステップ９０５で、あるリソースに割り当てられるべきジョブが選択される。ジョブは、このジョブに関連されるIPCを有する。ジョブを選択する適切な方法が使用される場合がある。ステップ９１０で、ジョブを割り当てる候補となるリソースが選択される。候補となるリソースを選択する適切な方法が使用される場合がある。
【００９１】
ステップ９１５で、ジョブのIPCにおけるプレディケートの数が決定される。ステップ９２０で、完全な再生の初期化のコストが決定される。完全な再生の初期化のコストは、IPCにおけるステップ数に前方向ステップのコストを乗じることで発見される。１実施の形態では、前方向ステップのコストは、グローバルに決定される。別の実施の形態では、前方向ステップのコストは、前方向ステップを実行するのに要する時間を評価することで決定される。
【００９２】
ステップ９２５で、IPCと候補となるリソースのTPCとの間の共通のプレフィックスが決定される。共通のプレフィックスは、第一のプレディケートのエレメントで始まる、IPCとTPCとの間で共通する最も長いプレディケートのエレメントのシーケンスである。
【００９３】
ステップ９３０で、共通のプレフィックスに到達するまで、引き返すべきTPCのプレディケートのステップの数が決定される。ステップ９３５で、引き返しのコストが決定される。引き返しのコストは、ステップ９３５からの引き返すステップの数に、引き返すステップのコストを乗じることで発見される。１実施の形態では、引き返すステップのコストは、グローバルに決定される。別の実施の形態では、引き返すステップのコストは、引き返すステップを実行するのに要する時間を評価することで決定される。
【００９４】
ステップ９４０で、IPCが完了するまでの、再生されるべき共通のプレフィックス後のIPCからのステップの数が決定される。ステップ９４５で、再生コストが決定される。再生コストは、IPCを完了するために要する前方向ステップの数に、再生ステップのコストを乗じることで発見される。再生ステップのコストは、引く返しステップのコストと同様にして決定される。ステップ９５０で、再生及び引き返しのコストは、再生のコストに引き返しのコストを加えたものである。
【００９５】
ステップ９５５で、初期化の再生及び引き返しの方法と初期化の完全な再生の方法とは、どちらが安価であるかを判定するために比較される。よりコストが安い初期化手法が選択される。
【００９６】
図４を参照して、スケジューラノード１０４は、分散コンピューティング環境におけるソフトウェアの解析の問題の効率的な並列化のためのスケジューリングのポリシーを適用する。スケジューラノード１０４により使用されるスケジューリングのポリシーは、ジョブをワーカノード１０６に効率的且つ知的に割り当てる適切なスケジューリングのポリシーを含む。スケジューリングのポリシーは、ジョブのキュー２１０からジョブをどのように選択すべきかに関するポリシーを含む。ジョブのキュー２１０からジョブを選択する適切なポリシーが選択される。１実施の形態では、ジョブのキュー２１０は、ファーストイン、ファーストアウトのキューとして構成される。ジョブのキュー２１０で最初の未解決のジョブが処理され、このジョブは、このキューにおいて最も古いジョブを表す。別の実施の形態では、ジョブのキュー２１０は、優先度のキューとして実現される。係るケースでは、あるジョブには、サーチポリシーにおける要素のような要素に関する優先度が割り当てられる。例は、深さであり、低い深さでの調査されていない分岐には高い優先度が割り当てられる。これは、グラフの根に近い分岐の下で、かなりのサーチツリーが展開される大きな可能性があるからである。適切な方法は、係るキュー内のジョブの優先度を計算するために使用される。たとえば、ジョブの作成からの記憶されたパラメータは、緊急度を計算するために使用される。係る実施の形態では、スケジューラ１０４は、最も高い計算された優先度をもつジョブを選択する。
【００９７】
スケジューリングポリシーは、利用可能なリソースのリスト２１２からワーカノード１０６をどのように選択すべきかに関するポリシーを含む。利用可能なリソースのリスト２１２は、エントリがリストに追加されたときに対応するタイムスタンプにより順序付けされるリストとして構成される。利用可能なリソースのリスト２１２からリソースを選択する適切な方法が使用される場合がある。方法のタイプは、利用可能なリソースのリスト２１２におけるリソースの機能（nature）に依存する。係るリソースは、計算能力、メモリ、最後の計算状態等の観点で互いに関して同じ種類又は異なる種類である場合がある。
【００９８】
リソースの大部分が同じ種類である場合、簡単なリソースの選択が使用され、利用可能なリソースのリスト２１２に追加される第一のリソースは、割り当てのために選択される。リソースの大部分が異なる場合、より洗練されたリソースの選択が使用され、あるジョブとあるリソースとの間の最も適合したものが決定される。係るケースでは、あるリソースとあるジョブと整合させる基準は、たとえば利用可能な計算能力に比較されるジョブの知覚されるサイズ、利用可能なメモリに比較されるジョブの知覚されるサイズ、又は初期化のコストを含む。１実施の形態では、最も大きな利用可能な計算能力又はメモリを持つリソースが選択される。別の実施の形態では、スケジューラノード１０４は、利用可能なリソースのリストにおけるどのリソースが、ジョブの初期化の経路の状態と最も長い共通のプレフィックスを共有する終了の経路の状態を有するかを判定することで、初期化のコストに関してジョブに最も適合するリソースを決定する。更に別の実施の形態では、利用可能なリソースのリストにおいてどのリソースが最も長く待機しているかに基づいてリソースが決定される。係る待ち時間の判定は、リソースのタイムスタンプに基づいている。
【００９９】
スケジューラノード１０４は、適切な時間でジョブのキュー２１０と利用可能なリソースのリスト２１２とからエントリをスケジュールする。１実施の形態では、スケジュールノード１０４は、ジョブのキュー２１０と利用可能なリソースのリスト２１２とから周期的にエントリをスケジュールする。別の実施の形態では、スケジューラノード１０４は、何れかの構成への追加が存在するたびに、ジョブのキュー２１０と利用可能なリソースのリスト２１２とからエントリをスケジュールする。
【０１００】
図１０は、分散コンピューティング環境におけるソフトウェアの解析の問題に関する効率的な並列化のためのスケジューリングポリシーを実現する方法１０００の例示的な実施の形態である。１実施の形態では、本方法１０００は、スケジュールノード１０４により実現される。
【０１０１】
ステップ１００５で、あるジョブが選択される。ジョブは、ジョブのキューから選択される。１実施の形態では、ジョブは、ファーストイン、ファーストアウトに従って選択される。別の実施の形態では、ジョブは、最も高い優先度が割り当てられるジョブを決定することで選択される。
【０１０２】
ステップ１００７で、あるリソースが利用可能なリソースのリストから選択される。１実施の形態では、そのジョブに最も適合するリソースは、利用可能なリソースのリストにおいて待機しているリストのなかから発見される。別の実施の形態では、リソースは、ファーストイン、ファーストアウトに基づいて選択される。最も適合するリソースの基準は、所与のリソースに関するジョブの初期化のコスト、或いは、所与のリソースで利用可能な計算能力又はメモリの量を含む。ステップ１００７は、ステップ１０１０〜１０２０で実現される。
【０１０３】
ステップ１０１０で、それぞれのリソースの前のジョブで実行された最後の状態を考慮して、利用可能なリソースのリストにおけるそれぞれのリソースについて、ジョブの初期化のコストが計算される。初期化のコストの計算の適切な方法が使用される場合がある。係る実行された最後の状態は、リソースに記憶されたとき、ジョブに依存して、初期化のコストを少なくする。
【０１０４】
ステップ１０１５で、リストにおけるどのリソースが、抽出されたジョブについて最も低い初期化のコストを有するかが判定される。最も適合するリソースを決定するために別の基準が使用される場合、推論の判定（corollary  determination）が行われる。ステップ１０２０で、最も適合されたリソースが選択される。１を超えるリソースが最も適合するリソースとなる場合、最も古いタイムスタンプをもつリソースが選択される。
【０１０５】
ステップ１０２５で、選択されたリソースでの記号的実行についてジョブがスケジュールされる。
【０１０６】
ステップ１０３０で、未解決のジョブを表すジョブのキュー、又はジョブが割り当てられるべきワーカノードを表す利用可能なリソースのリストの何れかが空であるかが判定される。何れかが空である場合、スケジューリングが行われず、本方法は、別の係るリソースが到来するまで終了される。しかし、両方のジョブが未解決であって、リソースが待機している場合、本方法１０００は、何れかの係るキューが空となるまで繰り返される。
【０１０７】
図５〜７，９〜１０は、例示的な方法５００，６００，７００，９００及び１０００に関して行われるべき特定のステップの数を開示しているが、本方法５００，６００，７００，９００及び１０００は、図５〜７，９〜１０で示されるステップよりも多いステップ又は少ないステップで実行される。さらに、図５〜７，９〜１０は、方法５００，６００，７００，９００及び１０００に関して行われるべきステップの所定の順序を開示しているが、本方法５００，６００，７００，９００及び１０００を含むステップは、適切な順序で行われる。図５〜７，９〜１０の幾つかの部分は、図５〜７，９〜１０の他の１以上の文脈で上手く実行される場合がある。
【０１０８】
本方法５００，６００，７００，９００及び１０００は、図１〜６及び８のシステム、方法５００，６００，７００，９００及び１０００を実現するために動作する他のシステム、ネットワーク又はデバイスを使用して実現される。所定の実施の形態では、本方法５００，６００，７００，９００及び１０００は、コンピュータ読み取り可能な記録媒体で実行されるソフトウェアで部分的又は完全に実現される。この開示のため、コンピュータ読み取り可能な記録媒体は、ある期間についてデータ及び／又は命令を保持する手段又は手段の集合を含む。コンピュータ読み取り可能な記録媒体は、限定されるものではないが、ダイレクトアクセスストレージデバイス（たとえばハードディスクドライブ又はフロプティカルディスク）、シーケンシャルアクセスストレージデバイス（たとえばテープディスクドライブ）、コンパクトディスク、CD-ROM、DVD、ランダムアクセスメモリ（RAM）、リードオンリメモリ（ROM）、電子的に消去可能なプログラム可能なリードオンリメモリ（EEPROM）、及び／又はフラッシュメモリ、並びに、配線、光ファイバのような伝送媒体、他の有形の一時的でない媒体、及び／又は上述したものの組み合わせを含む。
【０１０９】
本実施の形態の開示が詳細に記載されたが、この開示の精神及び範囲から逸脱することなしに様々な変形、置き換え及び変更を行うことができる。
【０１１０】
以下、本発明の特徴点を付記として示す。
（付記１）
分散コンピューティングシステムであって、
検証されるべきコードの一部を含むジョブを実行する２以上のワーカノードと、
メモリに結合されるプロセッサを有するスケジューラノードと、前記メモリは、コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、それぞれのジョブが検証されるべきコードの一部を示す、ワーカノードにより実行される１以上のジョブを示すジョブのキューとを含み、
前記リソースのキューと前記ジョブのキューの両者がエントリを含むかを判定するスケジューラノードとを備え、
前記スケジューラノードは、前記リソースのキューと前記ジョブのキューとがエントリを含む場合に、スケジューリングポリシーを適用して、第一のジョブを選択し、前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択し、前記第一のジョブを前記第一のワーカノードに割り当て、前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当て、前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てる、
ことを特徴とするシステム。
（付記２）
前記コードを検証することは、コードに記号的実行を施すことを含む、
付記１記載のシステム。
（付記３）
前記スケジューラノードは、
ジョブを実行するために利用可能な初期の数のワーカノードを決定し、
前記ジョブを実行するために利用可能なワーカノードの初期の数よりも多いか又は前記前記ジョブを実行するために利用可能なワーカノードの初期の数に等しい、初期の数のジョブを作成し、
前記初期の数のワーカノードのそれぞれを、実行すべきジョブに割り当てる、
付記１記載のシステム。
（付記４）
前記スケジューラノードは、
前記ジョブのキューが空であって、全てのワーカノードが使用されていないかを判定し、
前記ジョブのキューが空であって、全てのワーカノードが使用されていない場合、全てのジョブの実行の結果を記憶する、
付記１記載のシステム。
（付記５）
前記スケジューラノードは、
前記ジョブのキューが所定の最小値未満であるか、前記リソースのキューが所定の最大値を超えるかを判定し、
前記ジョブのキューが所定の最小値未満であって、前記リソースのキューが所定の最大値を超える場合、ジョブの作成を増加するように１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記６）
前記スケジューラノードは、
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定し、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、所与のリソースの実行を増加するように、１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記７）
前記スケジューラノードは、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定し、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、ジョブの作成を減少するように、１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記８）
前記スケジューラノードは、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定し、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、所与のリソースの実行を減少するように、１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記９）
前記スケジューラノードは、
前記ジョブのキューの状態を評価し、
前記ジョブのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記１０）
前記スケジューラノードは、
前記リソースのキューの状態を評価し、
前記リソースのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節する、
付記１記載のシステム。
（付記１１）
ソフトウェアを検証する方法であって、
コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、それぞれのジョブが検証されるべきコードの一部を示す、ワーカノードにより実行される１以上のジョブを示すジョブのキューとをモニタするステップと、前記ジョブは、検証されるべきコードの一部を含み、
前記リソースのキューと前記ジョブのキューとがエントリを含むかを判定するステップと、
前記リソースのキューと前記ジョブのキューの両者がエントリを含む場合に、
スケジューリングポリシーを適用して、第一のジョブを選択するステップと、
前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択するステップと、
前記第一のジョブを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てるステップと、
を含むことを特徴とする方法。
（付記１２）
前記コードを検証することは、コードに記号的実行を施すことを含む、
付記１１記載の方法。
（付記１３）
ジョブを実行するために利用可能な初期の数のワーカノードを決定するステップと、
前記ジョブを実行するために利用可能なワーカノードの初期の数よりも多いか又は該初期の数に等しい、初期の数のジョブを作成するステップと、
前記初期の数のワーカノードのそれぞれを、実行すべきジョブに割り当てるステップと、
を更に含む付記１１記載の方法。
（付記１４）
前記ジョブのキューが空であって、全てのワーカノードが使用されていないかを判定するステップと、
前記ジョブのキューが空であって、全てのワーカノードが使用されていない場合、全てのジョブの実行の結果を記憶するステップと、
を更に含む付記１１記載の方法。
（付記１５）
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定するステップと、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、ジョブの作成を増加するように１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記１６）
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定するステップと、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、所与のリソースの実行を増加するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記１７）
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定するステップと、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、ジョブの作成を減少するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記１８）
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定するステップと、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、所与のリソースの実行を減少するように、１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記１９）
前記ジョブのキューの状態を評価するステップと、
前記ジョブのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記２０）
前記リソースのキューの状態を評価するステップと、
前記リソースのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節するステップと、
を更に含む付記１１記載の方法。
（付記２１）
コンピュータ読み取り可能な記録媒体と、
前記コンピュータ読み取り可能な記録媒体に記録されるコンピュータ実行可能な命令とを備える製品であって、前記命令は、プロセッサにより読取り可能であって、読み取られて実行されたときに、前記プロセッサに、
コードの一部を検証するために利用可能な複数のワーカノードを示すリソースのキューと、ワーカノードにより実行される１以上のジョブを示すジョブのキューとをモニタさせ、前記ジョブは、検証されるべきコードの一部を含み、
前記リソースのキューと前記ジョブのキューとがエントリを含むかを判定させ、
前記リソースのキューと前記ジョブのキューの両者がエントリを含む場合に、
スケジューリングポリシーを適用して、第一のジョブを選択させ、
前記リソースのキューのエントリのうちで前記第一のジョブの特性について最も適合するノードとして第一のワーカノードを選択させ、
前記第一のジョブを前記第一のワーカノードに割り当てさせ、
前記第一のジョブを実行している間に前記ジョブのキューにおいて新たなジョブを作成するためのジョブ作成ポリシーのパラメータを前記第一のワーカノードに割り当てさせ、
前記第一のジョブの実行を停止するための終了ポリシーのパラメータを前記第一のワーカノードに割り当てさせる、
ことを特徴とする製品。
（付記２２）
前記コードを検証することは、コードに記号的実行を施すことを含む、
付記２１記載の製品。
（付記２３）
前記命令は、前記プロセッサに、更に、
ジョブを実行するために利用可能な初期の数のワーカノードを決定するステップと、
前記ジョブを実行するために利用可能なワーカノードの初期の数よりも多いか又は該初期の数に等しい、初期の数のジョブを作成させ、
前記初期の数のワーカノードのそれぞれを、実行すべきジョブに割り当てさせる、
付記２１記載の製品。
（付記２４）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューが空であって、全てのワーカノードが使用されていないかを判定させ、
前記ジョブのキューが空であって、全てのワーカノードが使用されていない場合、全てのジョブの実行の結果を記憶させる、
付記２１記載の製品。
（付記２５）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定させ、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、ジョブの作成を増加するように１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
（付記２６）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューが第一の閾値未満であるか、前記リソースのキューが第二の閾値を超えるかを判定させ、
前記ジョブのキューが第一の閾値未満であって、前記リソースのキューが第二の閾値を超える場合、所与のリソースの実行を増加するように、１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
（付記２７）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定させ、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、ジョブの作成を減少するように、１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
（付記２８）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューが第一の閾値を超えるか、前記リソースのキューが第二の閾値未満であるかを判定させ、
前記ジョブのキューが第一の閾値を超え、且つ前記リソースのキューが第二の閾値未満である場合、所与のリソースの実行を減少するように、１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
（付記２９）
前記命令は、前記プロセッサに、更に、
前記ジョブのキューの状態を評価させ、
前記ジョブのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
（付記３０）
前記命令は、前記プロセッサに、更に、
前記リソースのキューの状態を評価させ、
前記リソースのキューの状態に基づいて、当該システムの１以上のポリシーのパラメータを調節させる、
付記２１記載の製品。
【符号の説明】
【０１１１】
１００：分散コンピューティングシステム
１０２：ネットワーク
１０４：スケジューラノード
１０６：ワーカノード
１０８：検証のウェブサービス
【図１】
0005845809.tif 000003
【図２】
0005845809.tif 000004
【図３】
0005845809.tif 000005
【図４】
0005845809.tif 000006
【図５】
0005845809.tif 000007
【図６】
0005845809.tif 000008
【図７】
0005845809.tif 000009
【図８】
0005845809.tif 000010
【図９】
0005845809.tif 000011
【図１０】
0005845809.tif 000012