(57)【特許請求の範囲】
【請求項１】
最適化したバイナリー・モジュールをテストする方法であって、コンピュータが、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択するステップと、
選択した対象領域を最適化したバイナリー・モジュール（以下、「最適化バイナリー・モジュール」という）を作成するステップと、
前記最適化バイナリー・モジュールと前記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させて、前記最適化バイナリー・モジュールの実行の出力と前記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって前記最適化バイナリー・モジュールを検証するステップと
を実行することを含み、
前記コンピュータが、
所定の時間の経過後に、前記最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないことに応じて、前記選択した対象領域を縮小するステップと、
縮小した対象領域について、前記作成するステップ及び前記検証するステップを再実行するステップと
をさらに実行することを含む、前記方法。
【請求項２】
最適化したバイナリー・モジュールをテストする方法であって、コンピュータが、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択するステップと、
選択した対象領域を最適化したバイナリー・モジュール（以下、「最適化バイナリー・モジュール」という）を作成するステップと、
前記最適化バイナリー・モジュールと前記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させて、前記最適化バイナリー・モジュールの実行の出力と前記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって前記最適化バイナリー・モジュールを検証するステップと
を実行することを含み、
前記選択するステップが、
前記プロファイル情報を用いて、前記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで前記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュールとを検出するステップと、
検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーション（instrumentation）し、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出するステップ
を含み、
検出したトレースが前記最適化の対象領域として用いられる、
前記方法。
【請求項３】
前記選択した対象領域を縮小するステップが、
前記所定の時間の経過後に、前記最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないこと且つテスト時間が超過したことに応じて、分岐をトレースに含めるかを判断する為の閾値を上げるステップであって、前記閾値は、分岐先に分岐した回数を総分岐実行回数で除した分岐確率の閾値である、前記閾値を上げるステップと
をさらに含む、請求項２に記載の方法。
【請求項４】
前記選択するステップが、
前記プロファイル情報を用いて、前記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで前記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュールとを検出するステップと、
検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーション（instrumentation）し、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出するステップ
を含み、
検出したトレースが前記最適化の対象領域として用いられる、
請求項１に記載の方法。
【請求項５】
前記選択するステップが、
前記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成するステップ
を含み、
前記結合領域が前記最適化の対象領域として用いられる、
請求項２又は４に記載の方法。
【請求項６】
前記選択するステップが、
トレースの先頭候補として下記条件（Ｓ１）〜（Ｓ３）のうちのいずれか１つ又は複数を選択するステップと：
（Ｓ１）バック−エッジの分岐先；
（Ｓ２）既に存在するトレースのイグジット（exit）先；又は、
（Ｓ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つと判断された分岐命令のいずれかの分岐先、
選択したトレースそれぞれの先頭候補の実行に応じて、当該トレースの先頭候補に関連付けられたカウンタをインクリメントするステップと、
前記カウンタが閾値を超えたことに応じて、当該閾値を超えたトレースの先頭候補から下記条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つを示すトレースの末尾候補までを１つのトレースとするステップと：
（Ｅ１）次のバック−エッジの分岐命令；
（Ｅ２）別のトレースの先頭へ分岐する命令、若しくは、直後の命令が別のトレースの先頭である非分岐命令；
（Ｅ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つ分岐命令の直前の命令；
（Ｅ４）前記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成する場合には、エッジが２つ以上合流する点の直前の命令、又は
（Ｅ５）プログラムの終端
を含む、請求項４又は５に記載の方法。
【請求項７】
前記コンピュータが、
前記最適化バイナリー・モジュールの実行の前記出力と前記オリジナルのバイナリー・モジュールの実行の前記出力との比較の結果、前記最適化バイナリー・モジュールが正しく実行されていることに応じて、前記チェックポイントのコードを前記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行するステップと、
前記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行された前記チェックポイントのコードの実行結果を、前記最適化バイナリー・モジュールを実行しているプロセスにコピーするステップと
をさらに実行することを含む、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
前記検証するステップが、
前記最適化バイナリー・モジュールの終了コード及び終了ステータスと、前記オリジナルのバイナリー・モジュールの終了コード及び終了ステータスとをそれぞれ比較することによって前記最適化バイナリー・モジュールを検証するステップ
を含む、請求項１〜７のいずれか一項に記載の方法。
【請求項９】
前記コンピュータが、
前記チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存するステップと、
前記コンピュータの負荷が所定の閾値よりも小さい時間帯において、前記最適化バイナリー・モジュールのテストを実行するステップと
をさらに実行することを含む、請求項１〜８のいずれか一項に記載の方法。
【請求項１０】
前記最適化バイナリー・モジュールを作成するステップが、
前記最適化バイナリー・モジュールのチェックポイントを、前記オリジナルのバイナリー・モジュールと同等の入力と出力結果とを持つように最適化するステップ、又は、
前記最適化バイナリー・モジュールのチェックポイントの呼び出しが、前記オリジナルのバイナリー・モジュール中の同等のチェックポイントの呼び出しと同じ順番となるように、前記オリジナルのバイナリー・モジュールを最適化するステップ
を含む、請求項１〜９のいずれか一項に記載の方法。
【請求項１１】
前記最適化の対象領域が、分岐確率が小さいサイド・イグジット（side exit）を含まない、請求項１〜１０のいずれか一項に記載の方法。
【請求項１２】
前記チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させるステップが、
前記オリジナルのバイナリー・モジュールを検証用プロセスにロードし、前記最適化バイナリー・モジュールをテスト用プロセスにロードするステップと、
前記チェックポイントで、前記検証用プロセスと前記テスト用プロセスとを同期するステップと
を含む、請求項１〜１１のいずれか一項に記載の方法。
【請求項１３】
前記最適化バイナリー・モジュールの実行の前記出力と前記オリジナルのバイナリー・モジュールの実行の前記出力とを比較するステップが、
前記テスト用プロセスの出力と前記検証用プロセスの出力とを比較するステップ
を含む、請求項１２に記載の方法。
【請求項１４】
前記コンピュータが、
前記テスト用プロセスの出力と前記検証用プロセスの出力との比較の結果、前記最適化バイナリー・モジュールが正しく実行されていることに応じて、前記チェックポイントのコードを前記検証用プロセスでのみ実行するステップと、
前記検証用プロセスでのみ実行された前記チェックポイントのコードの実行結果を、前記テスト用プロセスにコピーするステップ
をさらに実行することを含む、請求項１３に記載の方法。
【請求項１５】
前記コンピュータが、
前記チェックポイントへの入力と、当該チェックポイントのコードを前記検証用プロセスでのみ実行した実行結果とを、バッファに格納するステップと、
前記バッファに前記チェックポイントへの全ての入力と前記実行結果とが格納されていることに応じて、前記コンピュータの負荷が所定の閾値よりも小さい時間帯において、前記テスト用プロセスでのテストを実行するステップと
をさらに実行することを含む、請求項１４に記載の方法。
【請求項１６】
前記プロファイル情報が、タイマー・サンプリング（timer sampling）、又は、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーション（Runtime Instrumentation）を利用することによって得られる情報である、請求項１〜１５のいずれか一項に記載の方法。
【請求項１７】
前記チェックポイントが、システム・コール又は標準ライブラリ・コールである、請求項１〜１６のいずれか一項に記載の方法。
【請求項１８】
最適化したバイナリー・モジュールをテストするためのコンピュータであって、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択する対象領域選択手段と、
選択した対象領域を最適化したバイナリー・モジュール（以下、「最適化バイナリー・モジュール」という）を作成する最適化バイナリー・モジュール作成手段と、
前記最適化バイナリー・モジュールと前記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させて、前記最適化バイナリー・モジュールの実行の出力と前記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって前記最適化バイナリー・モジュールを検証する検証手段と
を備えており、
前記対象領域選択手段が、
所定の時間の経過後に、前記最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないことに応じて、前記選択した対象領域を縮小する縮小手段
をさらに備えており、
前記最適化バイナリー・モジュール作成手段が、縮小した対象領域を最適化したバイナリー・モジュールを作成することをさらに実行し、及び
前記検証手段が、前記縮小した対象領域を最適化した最適化バイナリー・モジュールと前記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させて、前記縮小した対象領域を最適化した前記最適化バイナリー・モジュールの実行の出力と前記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって前記縮小した対象領域を最適化した前記最適化バイナリー・モジュールを検証することをさらに実行する、
前記コンピュータ。
【請求項１９】
最適化したバイナリー・モジュールをテストするためのコンピュータであって、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択する対象領域選択手段と、
選択した対象領域を最適化したバイナリー・モジュール（以下、「最適化バイナリー・モジュール」という）を作成する最適化バイナリー・モジュール作成手段と、
前記最適化バイナリー・モジュールと前記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで前記最適化バイナリー・モジュールの実行と前記オリジナルのバイナリー・モジュールの実行とを同期させて、前記最適化バイナリー・モジュールの実行の出力と前記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって前記最適化バイナリー・モジュールを検証する検証手段と
を備えており、
前記対象領域選択手段が、
前記プロファイル情報を用いて、前記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで前記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュールとを検出すること、
検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーション（instrumentation）し、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出すること
を実行し、前記最適化バイナリー・モジュール作成手段は、検出したトレースを前記最適化の対象領域として用いる、
前記コンピュータ。
【請求項２０】
最適化したバイナリー・モジュールをテストするためのコンピュータ・プログラムであって、コンピュータに、請求項１〜１７のいずれか一項に記載の方法の各ステップを実行させる、前記コンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バイナリー・モジュールの最適化技術に関する。特には、本発明は、最適化したバイナリー・モジュールをテストするための技法に関する。
【背景技術】
【０００２】
近年、ハードウェアの更新やダウンサイズ化とともに、バイナリー・モジュールの最適化技術が注目を集めている。バイナリー・モジュールの最適化技術とは、ソースコードを再コンパイルすること無しに、レガシー資産であるコンパイル済みのバイナリー・モジュール（例えば、ＣＯＢＯＬプログラムのバイナリー・モジュール）を最新のマシン用のバイナリー・モジュールに最適化し直す技術である。
【０００３】
インターナショナル・ビジネス・マシーンズ・コーポレーションは、バイナリー・モジュールの最適化（以下、単に「バイナリー最適化」ともいう）の為のソフトウェアとして、IBM（登録商標） COBOL Binary OptimizerをIBM（登録商標） alphaWorksからリリースしている。IBM（登録商標） COBOL Binary Optimizerは、ＣＯＢＯＬプログラムのバイナリー・モジュール（すなわち、オリジナルのバイナリー・モジュール）に、ソースコードを再コンパイルすること無しに、最適化されたバイナリー・モジュールが実行されるシステム上で利用可能な新しいｚ／アーキテクチャ命令を適用することによって最適化する。
【０００４】
下記特許文献１は、実行すべきオリジナル・プログラムに存在するシステム・コール等の回復不可能ポイントとスレッド同期ポイントで、プログラムがセクションに区切られること、この処理は、コンパイラによって行なわれること、スレッド同期ポイントでプログラムを区切ることにより、トランジェント・フォールトが発生しない限り、適切な同期処理を行っているプログラムでは、２つのスレッドから同一の実行結果を得られることが保証されることを記載する（段落００１０）。
【０００５】
下記特許文献２は、動的バイナリリライタ（dynamic binary rewriter）（ＤＢＲ）サービスは、ハードウェア性能モニタからサンプルを集約し、ホットサンプルの周囲のプログラム構造を推定することによって領域選択を行い、選択された領域上で変形を行い（例えば最適化）、そして置換コードを生成することを記載する（段落０００５）。
【０００６】
下記特許文献３は、少なくとも１つのプロセッサを備えた所定のハードウェア・プラットフォーム上で実行するのに適し、所定の分野のアプリケーションに用いる、ユーザーの提供するソースコードからの最適化コードの自動発生システム（段落０００１）、並びに、当該システムが、ベンチマークシーケンス、静的パラメータおよび動的パラメータを用いて行われる試験およびパフォーマンスの測定から最適化ルールを作成する分析装置を備えていること（段落００３０）を記載する。
【０００７】
下記特許文献４は、プログラムの移植作業の効率化を支援するプログラム移植支援システム（段落０００１）、並びに、移植対象プログラムの解析は、プログラムの静的解析により移植の影響を受けない記述部分を選別する静的解析器と、既存の試験データＴiを用いたプログラムの実行トレースによる情報収集に基づき、動作の条件に関わらず、その試験データに対しては全く移植の影響を受けない記述部分を選別する動的解析器で実施すること、及びこのときプログラム変換器は、プログラムの実行トレースに先立ち、移植の影響を受ける可能性のある記述に対し実行時情報を収集する機能を元のプログラムに挿入すること（段落０００６）を記載する。
【０００８】
下記特許文献５は、異なるプロセッサ間でプログラムコードの変換を行う場合に、変換元のバイナリコードに含まれるプログラム上の工夫を、変換先のバイナリコードに反映することができるプログラムコード変換装置を記載する（段落０００８）。
【０００９】
下記非特許文献１は、マルチコア・アーキテクチャのためのトランジエント・フォールト検出に対するソフトウェア・アプローチを記載し、当該ソフトウェア・アプローチでは、同一のプログラムを並列に実行し、当該トランジエント・フォールトを検出することに応じて、チェックポイントで同期し、出力を比較し、結果を複製する冗長実行が利用される旨を記載する（第７頁右欄「4.10 Transient Fault Recovery」の項を参照）。
【００１０】
下記非特許文献２は、Java（登録商標） JIT Compilerのテストシステムでは、ランダムなプログラムを生成し、信頼性の高いJava（登録商標） Runtimeにおける実行結果と、テスト対象のJIT Compilerでコンパイルしたプログラムの実行結果を比較する旨を記載する（第１頁左欄「Abstract」の項を参照）。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１１−４４０７８号公報
【特許文献２】特表２０１３−５０４１２４号公報
【特許文献３】特表２００７−５１８１７６号公報
【特許文献４】特開平６−２３６２９５号公報
【特許文献５】特開２００８−２７６７３５号公報
【非特許文献】
【００１２】
【非特許文献１】PLR: A Software Approach to Transient Fault Tolerance for Multicore Architectures, A. Shye et al., IEEE Transactions on Dependable and Secure Computing, vol.6, no.2, 2009，＜http://www.cs.du.edu/~dconnors/courses/old/lockheedOS/notes/PLR-paper.pdf＞から入手可能
【非特許文献２】Random Program Generator for Java JIT Compiler Test System,Yoshikawa et al., Proceedings of the Third International Conference on Quality Software, 2003，＜http://www.cs.du.edu/~dconnors/courses/old/lockheedOS/notes/PLR-paper.pdf＞から入手可能
【発明の概要】
【発明が解決しようとする課題】
【００１３】
バイナリー最適化技術は、レガシー資産を大量に抱えているユーザーが新しいマシンへ移行するための技術でもある。しかしながら、当該ユーザーは、最適化したバイナリー・モジュールが正しく動作するかを確認するためのテストに掛かるコストに懸念を持っている。そこで、このコストを低減させることは、新しいマシンへの移行の促進の観点やビジネス的な観点から大きな課題である。
【００１４】
上記テストを人手ではなく、最適化したバイナリー・モジュールを実行するシステム環境（すなわち、本番環境）のバックグラウンドにおいて自動的にバイナリー最適化と当該最適化したバイナリー・モジュールのテストを行うことができれば、上記コストを下げることが可能になる。
【００１５】
そこで、本発明は、オリジナルのバイナリー・モジュールと、最適化したバイナリー・モジュールとが同一の入力に対して同一の実行結果を持つように最適化モジュールを作成するとともに、当該作成において、上記本番環境の性能をできるだけ低下させないように、プログラムの入力と正しい出力との組み合わせからなるテストケースを当該本番環境から取得し、上記最適化したバイナリー・モジュールのテストを可能にすることを目的とする。
【００１６】
また、最適化したバイナリー・モジュールにおいて、当該最適化したバイナリー・モジュール内の最適化したバイナリー・コードから、当該最適化したバイナリー・モジュール内のオリジナルのバイナリー・コードをコピーしたオリジナルのバイナリー・コードにサイド・エグジット（side exit）（ここでは、サイド・エグジットとはトレースから外れる為の分岐である）する部分がある場合に、レジスタ又はメモリのイメージが正しくないとプログラムの実行がフェール（fail）する。従って、最適化したバイナリー・コードのサイド・エグジットを含む全ての分岐が当該最適化したバイナリー・モジュールのテスト時に網羅されていること（すなわち、バイナリー・コード・レベルの分岐網羅がされていること）が必要である。分岐網羅とはコード網羅率の測定方法の1つであり、当該分岐網羅はバイナリー・コード上の分岐でそれぞれの分岐方向が実行されたかどうかで判断する手法である。
【００１７】
バイナリー最適化の従来技術として、例えば一定回数実行されたバックエッジ（後方参照されたエッジともいう）の先頭から始まるトレースを取得するという手法がある。当該手法において、バイナリー最適化する対象領域を選択すると、分岐網羅率が著しく下がる恐れがある。
【００１８】
図８は、従来手法において、オリジナルのバイナリー・コード中の分岐網羅率が低くなる領域を最適化する処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。当該ループは、実行される確率が低い例外処理のコード（（GO TO）（８０３）、及び（* error handling *）（８１３））を有するものとする。
【００１９】
上記ソースコード（８０１及び８１１）中、それぞれ行番号０１〜０４及び行番号０１〜１０は参照のために便宜的に付した番号である。
【００２０】
従来手法では、上記ソースコード（８０１）に対応する上記オリジナルのバイナリー・コードをバイナリー最適化するに際して、図８に示すソースコード（８０１）中のループのボディ（８０２）に対応するバイナリー・コードを最適化するが、当該最適化したバイナリー・コードには、実行される確率が低い例外処理（GO TO）（８０３）がサイド・エグジットとして含まれてしまう。当該サイド・エグジットは、最適化バイナリー・モジュール内の最適化した領域からオリジナルの最適化していない領域に戻るコードである。その為に、上記従来手法に従ってオリジナルのバイナリー・コードをバイナリー最適化すると、網羅率が著しく下がる可能性がある。従って、実行される確率が低い例外処理のサイド・エグジットを最適化領域として含めないことが好ましい。
【００２１】
また、従来手法では、上記ソースコード（８１１）に対応する上記オリジナルのバイナリー・コードをバイナリー最適化するに際して、図８に示すソースコード（８１１）中のループのボディ（８１２）に対応するバイナリー・コードを最適化するが、当該最適化したバイナリー・コードには、実行される確率が低い例外処理（* error handling *）（８１３）がサイド・エグジットとして含まれてしまう。その為に、上記ソースコード（８１１）に対応するバイナリー・コードを上記従来手法に従ってバイナリー最適化すると、分岐網羅率が著しく下がる可能性がある。従って、実行される確率が低い例外処理のサイド・エグジット（８１３）を最適化領域として含めずに、上記ループの後半部分（８１４）に対応するバイナリー・コードを最適化することが好ましい。
【００２２】
図９に示すダイアグラム（９０１）のトレースは、上記従来手法に従い作成されたトレースを示す。当該ダイアグラム（９０１）のトレースでは分岐確率が低い分岐先を持つ分岐命令が４つあり、それぞれの分岐命令について分岐先の分岐確率が示してある。当該分岐確率は、オリジナルのバイナリー・モジュールのプロファイル情報での分岐確率を示す。分岐網羅率（すなわち、最適化されたバイナリー・モジュールのテスト時に当該最適化バイナリー・モジュール内の最適化バイナリー・コードの分岐が１回でも実行されたかどうかを示す）では、それぞれの分岐命令についてそれぞれの分岐先へ最低１度は分岐しないと、分岐網羅率１００％にならない。しかしながら、当該ダイアグラム（９０１）のトレースでは、上記４つの分岐命令の片方の分岐先への分岐確率がいずれも０％である。従って、当該ダイアグラム（９０１）のトレースでは、１００％の分岐網羅率は達成されない。
【００２３】
そこで、本発明は、トレースとして、分岐確率が低い分岐先を持つ分岐命令が含まれないようにすることを保証することを目的とする。
【課題を解決するための手段】
【００２４】
本発明は、最適化したバイナリー・モジュールをテストするための技法を提供する。当該技法は、上記最適化したバイナリー・モジュールをテストする方法、並びに、当該実行頻度情報を得るためのコンピュータ、コンピュータ・プログラム及びコンピュータ・プログラム製品を包含しうる。
【００２５】
（本発明に従う第１の態様）
【００２６】
本発明に従う第１の態様において、最適化したバイナリー・モジュールをテストする方法であって、コンピュータが、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択するステップと、 
選択した対象領域を最適化したバイナリー・モジュール（以下、「最適化バイナリー・モジュール」ともいう）を作成するステップと、
上記最適化バイナリー・モジュールと上記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで上記最適化バイナリー・モジュールの実行と上記オリジナルのバイナリー・モジュールの実行とを同期させて、上記最適化バイナリー・モジュールの実行の出力と上記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって上記最適化バイナリー・モジュールを検証するステップと
を実行することを含む。
【００２７】
本発明の一つの実施態様において、上記プロファイル情報が、タイマー・サンプリング（timer sampling）、又は、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーション（Runtime Instrumentation，ＲＩ）を利用することによって得られる情報でありうる。
【００２８】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
所定の時間の経過後に、上記最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないことに応じて、上記選択した対象領域を縮小するステップと、
縮小した対象領域について、上記作成するステップ及び上記検証するステップを再実行するステップと
をさらに実行することを含みうる。
【００２９】
本発明の一つの実施態様において、上記選択した対象領域を縮小するステップが、
上記所定の時間の経過後に、上記最適化バイナリー・モジュール内の上記最適化バイナリー・コード領域の分岐網羅が達成されないこと且つテスト時間が超過したことに応じて、分岐をトレースに含めるかを判断する為の閾値を上げるステップ
をさらに含みうる。上記閾値は、分岐先に分岐した回数を総分岐実行回数で除した分岐確率の閾値である。
【００３０】
本発明の一つの実施態様において、上記分岐網羅される見込みのある領域を選択するステップが、
上記プロファイル情報を用いて、上記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで上記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュールとを検出するステップと、
検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーション（instrumentation）し、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出するステップ
を含みうる。そして、上記コンピュータは、検出したトレースを上記最適化の対象領域として用いる。
【００３１】
本発明の一つの実施態様において、上記分岐網羅される見込みのある領域を選択するステップが、
上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成するステップ
を含みうる。そして、上記コンピュータは、上記結合領域を上記最適化の対象領域として用いる。
本発明の一つの実施態様において、上記分岐網羅される見込みのある領域を選択するステップが、
トレースの先頭候補として下記条件（Ｓ１）〜（Ｓ３）のうちのいずれか１つ又は複数を選択するステップと：
（Ｓ１）バック−エッジの分岐先；
（Ｓ２）既に存在するトレースのイグジット（exit）先；又は、
（Ｓ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つと判断された分岐命令のいずれかの分岐先、
選択したトレースそれぞれの先頭候補の実行に応じて、当該トレースの先頭候補に関連付けられたカウンタをインクリメントするステップと、
上記カウンタが閾値を超えたことに応じて、当該閾値を超えたトレースの先頭候補から下記条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つを示すトレースの末尾候補までを１つのトレースとするステップと：
（Ｅ１）次のバック−エッジの分岐命令；
（Ｅ２）別のトレースの先頭へ分岐する命令、若しくは、直後の命令が別のトレースの先頭である非分岐命令（例えば、直後の命令が別のトレースの先頭であるフォール・スルー（fall through）する命令）；
（Ｅ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つ分岐命令の直前の命令；
（Ｅ４）上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成する場合には、エッジが２つ以上合流する点の直前の命令；又は
（Ｅ５）プログラムの終端
を含みうる。
【００３２】
本発明の一つの実施態様において、上記プロファイル履歴が、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、又は、ランタイム・インストラメンテーションを利用することによって得られる情報でありうる。
【００３３】
本発明の一つの実施態様において、上記最適化の対象領域が、分岐確率が小さいサイド・イグジット（side exit）を含まないようにしうる。
【００３４】
本発明の一つの実施態様において、上記最適化バイナリー・モジュールを作成するステップが、
上記最適化バイナリー・モジュールのチェックポイントを、上記オリジナルのバイナリー・モジュールと同等の入力と出力結果とを持つように最適化するステップ
を含みうる。
【００３５】
本発明の一つの実施態様において、上記最適化バイナリー・モジュールを作成するステップが、
上記最適化バイナリー・モジュールのチェックポイントの呼び出しが、上記オリジナルのバイナリー・モジュール中の同等のチェックポイントの呼び出しと同じ順番となるように、上記オリジナルのバイナリー・モジュールを最適化するステップ
を含みうる。
【００３６】
本発明の一つの実施態様において、上記チェックポイントで上記最適化バイナリー・モジュールの実行と上記オリジナルのバイナリー・モジュールの実行とを同期させるステップが、
上記オリジナルのバイナリー・モジュールを検証用プロセスにロードし、上記最適化バイナリー・モジュールをテスト用プロセスにロードするステップと、
上記チェックポイントで、上記検証用プロセスと上記テスト用プロセスとを同期するステップと
を含みうる。
【００３７】
本発明の一つの実施態様において、上記最適化バイナリー・モジュールの実行の上記出力と上記オリジナルのバイナリー・モジュールの実行の上記出力とを比較するステップが、
上記テスト用プロセスの出力と上記検証用プロセスの出力とを比較するステップ
を含みうる。
【００３８】
本発明の一つの実施態様において、上記最適化バイナリー・モジュールを検証するステップが、
上記最適化バイナリー・モジュールの終了コード及び終了ステータスと、上記オリジナルのバイナリー・モジュールの終了コード及び終了ステータスとをそれぞれ比較することによって上記最適化バイナリー・モジュールを検証するステップ
を含みうる。
【００３９】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記最適化バイナリー・モジュールの実行の上記出力と上記オリジナルのバイナリー・モジュールの実行の上記出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、上記チェックポイントのコードを上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行するステップと、
上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記最適化バイナリー・モジュールを実行しているプロセスにコピーするステップと
をさらに実行することを含みうる。
【００４０】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存するステップと、
上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記最適化バイナリー・モジュールのテストを実行するステップと
をさらに実行することを含みうる。
【００４１】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記テスト用プロセスの出力と上記検証用プロセスの出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、上記チェックポイントのコードを上記検証用プロセスでのみ実行するステップと、
上記検証用プロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記テスト用プロセスにコピーするステップ
をさらに実行することを含みうる。
【００４２】
本発明の一つの実施態様において、上記方法は、上記コンピュータが、
上記チェックポイントへの入力と、当該チェックポイントのコードを上記検証用プロセスでのみ実行した実行結果とを、バッファに格納するステップと、
上記バッファに上記チェックポイントへの全ての入力と上記実行結果とが格納されていることに応じて、上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記テスト用プロセスでのテストを実行するステップと
をさらに実行することを含みうる。
【００４３】
本発明の一つの実施態様において、上記チェックポイントが、システム・コール又は標準ライブラリ・コールでありうる。システム・コール又は標準ライブラリ・コールとして、任意のものを使用しうる。
【００４４】
（本発明に従う第２の態様）
【００４５】
本発明に従う第２の態様において、最適化したバイナリー・モジュールをテストするためのコンピュータは、
プロファイル情報に基づいて、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択する対象領域選択手段と、
選択した対象領域を最適化したバイナリー・モジュール（最適化バイナリー・モジュール）を作成する最適化バイナリー・モジュール作成手段と、
上記最適化バイナリー・モジュールと上記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで上記最適化バイナリー・モジュールの実行と上記オリジナルのバイナリー・モジュールの実行とを同期させて、上記最適化バイナリー・モジュールの実行の出力と上記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって上記最適化バイナリー・モジュールを検証する検証手段と
を備えている。
【００４６】
本発明の一つの実施態様において、上記プロファイル情報が、タイマー・サンプリング、又は、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーションを利用することによって得られる情報でありうる。
【００４７】
本発明の一つの実施態様において、上記対象領域選択手段が、
所定の時間の経過後に、上記最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないことに応じて、上記選択した対象領域を縮小する縮小手段
をさらに備えており、
上記最適化バイナリー・モジュール作成手段が、縮小した対象領域を最適化したバイナリー・モジュールを作成することをさらに実行し、及び
上記検証手段が、上記縮小した対象領域を最適化した最適化バイナリー・モジュールと上記オリジナルのバイナリー・モジュールとをそれぞれ実行しながら、チェックポイントで上記最適化バイナリー・モジュールの実行と上記オリジナルのバイナリー・モジュールの実行とを同期させて、上記縮小した対象領域を最適化した上記最適化バイナリー・モジュールの実行の出力と上記オリジナルのバイナリー・モジュールの実行の出力とを比較することによって上記縮小した対象領域を最適化した上記最適化バイナリー・モジュールを検証することをさらに実行しうる。
【００４８】
本発明の一つの実施態様において、上記検証手段が、上記選択した対象領域を縮小することにおいて、上記所定の時間の経過後に、上記最適化バイナリー・モジュール内の上記最適化したバイナリー・コード領域の分岐網羅が達成されないこと且つテスト時間が超過したことに応じて、分岐をトレースに含めるかを判断する為の閾値を上げることをさらに実行しうる。当該閾値は、分岐先に分岐した回数を総分岐実行回数で除した分岐確率の閾値である。
【００４９】
本発明の一つの実施態様において、上記対象領域選択手段が、
上記プロファイル情報を用いて、上記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで上記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュールとを検出すること、
検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションし、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出すること
を実行しうる。そして、上記最適化バイナリー・モジュール作成手段は、検出したトレースを上記最適化の対象領域として用いうる。
【００５０】
本発明の一つの実施態様において、上記対象領域選択手段が、
上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成することを実行しうる。そして、上記最適化バイナリー・モジュール作成手段は、上記結合領域を上記最適化の対象領域として用いうる。
【００５１】
本発明の一つの実施態様において、上記対象領域選択手段が、
トレースの先頭候補として下記条件（Ｓ１）〜（Ｓ３）のうちのいずれか１つ又は複数を選択すること：
（Ｓ１）バック−エッジの分岐先；
（Ｓ２）既に存在するトレースのイグジット先；又は、
（Ｓ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つと判断された分岐命令のいずれかの分岐先、
選択したトレースそれぞれの先頭候補の実行に応じて、当該トレースの先頭候補に関連付けられたカウンタをインクリメントすること、
上記カウンタが閾値を超えたことに応じて、当該閾値を超えたトレースの先頭候補から下記条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つを示す領域の末尾候補までを１つのトレースとすること：
（Ｅ１）次のバック−エッジの分岐命令；
（Ｅ２）別のトレースの先頭へ分岐する命令、若しくは、直後の命令が別のトレースの先頭である非分岐命令（例えば、直後の命令が別のトレースの先頭であるフォール・スルーする命令）；
（Ｅ３）プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つ分岐命令の直前の命令；
（Ｅ４）上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成する場合には、エッジが２つ以上合流する点の直前の命令；又は
（Ｅ５）プログラム終端
を実行しうる。
【００５２】
本発明の一つの実施態様において、上記プロファイル履歴が、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、又は、ランタイム・インストラメンテーションを利用することによって得られる情報でありうる。
【００５３】
本発明の一つの実施態様において、上記最適化の対象領域が、分岐確率が小さいサイド・イグジットを含まないようにしうる。
【００５４】
本発明の一つの実施態様において、上記最適化バイナリー・モジュール作成手段が、上記最適化バイナリー・モジュールのチェックポイントを、上記オリジナルのバイナリー・モジュールと同等の入力と出力結果とを持つように最適化することを実行しうる。
【００５５】
本発明の一つの実施態様において、上記最適化バイナリー・モジュール作成手段が、上記最適化バイナリー・モジュールのチェックポイントの呼び出しが、上記オリジナルのバイナリー・モジュール中の同等のチェックポイントの呼び出しと同じ順番となるように、上記オリジナルのバイナリー・モジュールを最適化することを実行しうる。
【００５６】
本発明の一つの実施態様において、上記検証手段が、上記チェックポイントで上記最適化バイナリー・モジュールの実行と上記オリジナルのバイナリー・モジュールの実行とを同期させることにおいて、
上記オリジナルのバイナリー・モジュールを検証用プロセスにロードし、上記最適化バイナリー・モジュールをテスト用プロセスにロードすること、
上記チェックポイントで、上記検証用プロセスと上記テスト用プロセスとを同期すること
を実行しうる。
【００５７】
本発明の一つの実施態様において、上記検証手段が、上記最適化バイナリー・モジュールの実行の上記出力と上記オリジナルのバイナリー・モジュールの実行の上記出力とを比較することにおいて、
上記テスト用プロセスの出力と上記検証用プロセスの出力とを比較すること
を実行しうる。
【００５８】
本発明の一つの実施態様において、上記検証手段が、上記最適化バイナリー・モジュールの終了コード及び終了ステータスと、上記オリジナルのバイナリー・モジュールの終了コード及び終了ステータスとをそれぞれ比較することによって上記最適化バイナリー・モジュールを検証することを実行しうる。
【００５９】
本発明の一つの実施態様において、上記コンピュータは、
上記最適化バイナリー・モジュールの実行の上記出力と上記オリジナルのバイナリー・モジュールの実行の上記出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、上記チェックポイントのコードを上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行する実行手段と、
上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記最適化バイナリー・モジュールを実行しているプロセスにコピーするコピー手段と
をさらに備えうる。
【００６０】
本発明の一つの実施態様において、上記実行手段は、上記チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存することを実行し、且つ、上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記最適化バイナリー・モジュールのテストを実行しうる。
【００６１】
本発明の一つの実施態様において、
上記実行手段が、上記テスト用プロセスの出力と上記検証用プロセスの出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、上記チェックポイントのコードを上記検証用プロセスでのみ実行し、
上記コピー手段が、上記検証用プロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記テスト用プロセスにさらにコピーすることを実行しうる。
【００６２】
本発明の一つの実施態様において、上記コンピュータは、上記チェックポイントへの入力と、当該チェックポイントのコードを上記検証用プロセスでのみ実行した実行結果とを格納する格納手段をさらに備えており、
上記実行手段が、
上記バッファに上記チェックポイントへの全ての入力と上記実行結果とが格納されていることに応じて、上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記テスト用プロセスでのテストをさらに実行しうる。
【００６３】
本発明の一つの実施態様において、上記チェックポイントが、システム・コール又は標準ライブラリ・コールでありうる。
（本発明に従う第３の態様）
【００６４】
本発明に従う第３の態様において、最適化したバイナリー・モジュールをテストするためのコンピュータ・プログラム又はコンピュータ・プログラム製品は、コンピュータに、上記第１の態様に記載の方法の各ステップを実行させる。
【００６５】
本発明の実施態様に従うコンピュータ・プログラムはそれぞれ、一つ又は複数のフレキシブル・ディスク、ＭＯ、ＣＤ−ＲＯＭ、ＤＶＤ、ＢＤ、ハードディスク装置、ＵＳＢに接続可能なメモリ媒体、ＲＯＭ、ＭＲＡＭ、ＲＡＭ等の任意のコンピュータ読み取り可能な記録媒体に格納することができる。当該コンピュータ・プログラムは、上記記録媒体への格納のために、通信回線で接続する他のコンピュータ、例えばサーバ・コンピュータからダウンロードしたり、又は他の記録媒体から複製したりすることができる。また、本発明の実施態様に従うコンピュータ・プログラムは、圧縮し、又は複数に分割して、単一又は複数の記録媒体に格納することもできる。また、様々な形態で、本発明の実施態様に従うコンピュータ・プログラム製品を提供することも勿論可能であることにも留意されたい。本発明の実施態様に従うコンピュータ・プログラム製品は、例えば、上記コンピュータ・プログラムを記録した記憶媒体、又は、上記コンピュータ・プログラムを伝送する伝送媒体を包含しうる。
【００６６】
本発明の上記概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの構成要素のコンビネーション又はサブコンビネーションもまた、本発明となりうることに留意すべきである。
【００６７】
本発明の実施態様において使用されるコンピュータの各ハードウェア構成要素を、複数のマシンと組み合わせ、それらに機能を配分し実施する等の種々の変更は当業者によって容易に想定され得ることは勿論である。それらの変更は、当然に本発明の思想に包含される概念である。ただし、これらの構成要素は例示であり、そのすべての構成要素が本発明の必須構成要素となるわけではない。
【００６８】
また、本発明は、ハードウェア、ソフトウェア、又は、ハードウェア及びソフトウェアの組み合わせとして実現可能である。ハードウェアとソフトウェアとの組み合わせによる実行において、上記コンピュータ・プログラムのインストールされたコンピュータにおける実行が典型的な例として挙げられる。かかる場合、当該コンピュータ・プログラムが当該コンピュータのメモリにロードされて実行されることにより、当該コンピュータ・プログラムは、当該コンピュータを制御し、本発明にかかる処理を実行させる。当該コンピュータ・プログラムは、任意の言語、コード、又は、表記によって表現可能な命令群から構成されうる。そのような命令群は、当該コンピュータが特定の機能を直接的に、又は、１．他の言語、コード若しくは表記への変換及び、２．他の媒体への複製、のいずれか一方若しくは双方が行われた後に、本発明の実施態様に従う処理を実行することを可能にするものである。
【発明の効果】
【００６９】
本発明の実施態様に従うと、本番環境のバックグラウンドにおいて、上記本番環境の性能をできるだけ低下させないように、プログラムの入力と正しい出力との組み合わせからなるテストケースを当該本番環境から取得し、自動的にバイナリー最適化と当該最適化したバイナリー・モジュールのテストを行うことが可能になる。
【００７０】
また、本発明の実施態様に従うと、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択するために、例えば実行される確率が低い例外処理のサイド・エグジットが最適化領域として含まれない。その結果、最適化バイナリー・モジュール内の最適化バイナリー・コードでの分岐網羅率が改善される。
【００７１】
また、本発明の実施態様に従うと、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の最適化の対象領域を縮小することによって、テストの分岐網羅率の向上と、当該分岐網羅率の達成にかかる時間を短縮することが可能になる。さらに、最適化の対象領域を段階的に縮小することによって、テストの分岐網羅率のさらなる向上と、当該分岐網羅率の達成にかかる時間をさらに短縮することが可能になるとともに、テストケースの実行に伴う本願環境の性能低下が長引かないように制限することが可能になる。
【００７２】
また、本発明の実施態様に従うと、人手によるテスト環境の構築と上記テストケースの実行を行うこと無しに、オリジナルのバイナリー・モジュール中の分岐網羅される見込みのある領域の最適化、当該最適化により生成された最適化バイナリー・モジュールのテスト、そして当該最適化バイナリー・モジュールへの切り替えまでの一連の作業を、上記本願環境において透過的に行うバイナリー最適化システムを実現することが可能になる。
【図面の簡単な説明】
【００７３】
【図１】本発明の実施態様に従う又は本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【図２Ａ】本発明の実施態様に従い、最適化したバイナリー・モジュールをテストする処理の為のフローチャート（ステップ１〜４）を示す。
【図２Ｂ】本発明の実施態様に従い、最適化したバイナリー・モジュールをテストする処理の為のフローチャート（ステップ５〜１１）を示す。
【図２Ｃ】本発明の実施態様に従い、図２Ａに示すフローチャートのステップのうち、ステップ２の詳細な処理のフローチャートを示す。
【図３Ａ】本発明の実施態様に従い、最適化バイナリー・モジュールの実行の出力とオリジナルのバイナリー・モジュールの実行の出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、チェックポイントのコードを上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行し、当該オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記最適化バイナリー・モジュールを実行しているプロセスにコピーする処理の為のフローチャートを示す。
【図３Ｂ】本発明の実施態様に従い、チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存し、コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記最適化バイナリー・モジュールのテストを実行する処理の為のフローチャートを示す。
【図４Ａ】本発明の実施態様に従い、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択する処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【図４Ｂ】本発明の実施態様に従い、図２Ａに示すフローチャートのステップのうち、上記ステップ２に示す処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【図５】本発明の実施態様に従い、最適化したバイナリー・モジュールをテストする処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【図６Ａ】本発明の実施態様に従い、図３Ａに示すテスト実行Ａの処理を示すダイアグラム図である。
【図６Ｂ】本発明の実施態様に従い、所定の時間の経過後に、最適化バイナリー・モジュール内の最適化バイナリー・コード領域の分岐網羅が達成されないことに応じて、選択した対象領域を縮小する処理を示すダイアグラム図である。
【図６Ｃ】本発明の実施態様に従い作成されたトレースを示し、当該トレースでは分岐確率が低い分岐先を持つ分岐命令がないことを示す。
【図７】図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い上記最適化したバイナリー・モジュールをテストするコンピュータの機能ブロック図の一例を示した図である。
【図８】従来手法において、オリジナルのバイナリー・コード中の分岐網羅率が低くなる領域を最適化する処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【図９】従来手法に従い作成されたトレースを示し、当該トレースでは分岐確率が低い分岐先を持つ分岐命令を含むことを示す。
【発明を実施するための形態】
【００７４】
本発明の実施形態を、以下に図面に従って説明する。以下の図を通して、特に断らない限り、同一の符号は同一の対象を指す。本発明の実施形態は、本発明の好適な態様を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
【００７５】
本発明の実施態様において使用されうるコンピュータは、最適化したバイナリー・モジュールをテストすることができるコンピュータであれば特に限定されない。当該コンピュータは例えば、例えば、メインフレーム・コンピュータ、サーバ・コンピュータ、デスクトップ・コンピュータ、ノート・コンピュータ若しくは一体型パソコン、又は、タブレット端末若しくはスマートフォン（例えば、Ｗｉｎｄｏｗｓ（登録商標）、アンドロイド（登録商標）又はｉＯＳを搭載したタブレット端末若しくスマートフォン）でありうる。
【００７６】
図１は、本発明の実施態様に従う又は本発明の実施態様において使用されうるコンピュータの一例を示した図である。
【００７７】
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを備えており、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものである。当該ＣＰＵ（１０２）は例えば、インテル社のＣｏｒｅ（商標）  ｉシリーズ、Ｃｏｒｅ（商標）  ２シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（登録商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ若しくはＣｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ（Advanced Micro Devices）社のＡシリーズ、Ｐｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（登録商標）シリーズ若しくはＳｅｍｐｒｏｎ（商標）、又は、インターナショナル・ビジネス・マシーンズ・コーポレーションのＰｏｗｅｒ（商標）シリーズでありうる。
【００７８】
バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。また、液晶ディスプレイ（ＬＣＤ）は例えば、タッチパネル・ディスプレイ又はフローティング・タッチ・ディスプレイであてもよい。ディスプレイ（１０６）は、コンピュータ（１０１）上で動作中のソフトウェア（例えば、本発明の実施態様に従うコンピュータ・プログラム又は当該コンピュータ（１０１）上で動作中の各種コンピュータ・プログラム）が稼働することによって表示されるオブジェクトを、適当なグラフィック・インタフェースで表示するために使用されうる。また、ディスプレイ（１０６）は例えば、最適化バイナリー・モジュールの検証結果を出力しうる。当該検証結果は例えば、最適化バイナリー・モジュールをロードしたテスト用プロセスの終了コード（例えば、正常にプロセスが終了したことオペレーティング・システムに返すためのコードであり、例えば、プロセスが異常終了した場合にはエラーの種別を表す特定の値でありうる）及び終了ステータス（プロセスに関連付けられているものであり、例えば、セグメンテーション・フォールト又は正常終了でありうる）と、オリジナルのバイナリー・モジュールをロードした検証用プロセスの終了コード及び終了ステータスとをそれぞれ比較して、上記テスト用プロセスが正しく終了したかを示す結果でありうる。
【００７９】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はソリッド・ステート・ドライブ（ＳＳＤ）が接続されうる。
【００８０】
バス（１０４）には任意的に、例えばＳＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブが接続されうる。
【００８１】
バス（１０４）には、周辺装置コントローラ（１１０）を介して、例えばキーボード・マウス・コントローラ又はＵＳＢバスを介して、任意的に、キーボード（１１１）及びマウス（１１２）が接続されうる。
【００８２】
ディスク（１０８）には、オペレーティング・システム、例えばｚ／ＯＳ（登録商標）、ｚ／ＶＭ（登録商標）、ｚ／ＶＳＥ（登録商標）、ｚ／ＴＰＦ、ＶＯＳ３、ＵＮＩＸ（登録商標）、Ｗｉｎｄｏｗｓ（登録商標）、ＭａｃＯＳ（登録商標）、及びＪ２ＥＥなどのＪａｖａ（登録商標）処理環境、Ｊａｖａ（登録商標）アプリケーション、Ｊａｖａ（登録商標）仮想マシン（ＶＭ）、Ｊａｖａ（登録商標）実行時（ＪＩＴ）コンパイラを提供するプログラム、本発明の実施態様に従うコンピュータ・プログラム、及びその他のプログラム、並びにデータが、メイン・メモリ（１０３）にロード可能なように記憶されうる。
【００８３】
ディスク（１０８）は、コンピュータ（１０１）内に内蔵されていてもよく、当該コンピュータ（１０１）がアクセス可能なようにケーブルを介して接続されていてもよく、又は、当該コンピュータ（１０１）がアクセス可能なように有線又は無線ネットワークを介して接続されていてもよい。
【００８４】
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラム、例えばオペレーティング・システム、アプリケーション又は本発明の実施態様に従うコンピュータ・プログラムをディスク（１０８）にインストールするために使用されうる。
【００８５】
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に有線又は無線接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は例えば、無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境、ＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどのＷｉ−Ｆｉ無線ＬＡＮ環境、又は携帯電話網環境（例えば、３Ｇ又は４Ｇ環境）でありうる。
【００８６】
下記図２Ａ〜図３Ｂそれぞれは、本発明の実施態様に従い、オリジナルのバイナリー・モジュールから最適化する対象領域を選択し、当該選択した対象領域を最適化した最適化バイナリー・モジュールを作成し、当該作成した最適化したバイナリー・モジュールをテストする処理の為のフローチャートを示す。
【００８７】
図２Ａ及び図２Ｂそれぞれは、本発明の実施態様に従い、オリジナルのバイナリー・モジュールから最適化する対象領域を選択し、当該選択した対象領域を最適化した最適化バイナリー・モジュールを作成し、当該作成した最適化バイナリー・モジュールをテストする処理の為のフローチャート（ステップ１〜４）及び（ステップ５〜１１）を示す。
【００８８】
ステップ２０１において、コンピュータ（１０１）は、オリジナルのバイナリー・モジュールから最適化する対象領域を選択し、当該選択した対象領域を最適化した最適化バイナリー・モジュールを作成し、当該作成した最適化したバイナリー・モジュールをテストする処理を開始する。
【００８９】
ステップ２０２（以下、「ステップ１」ともいう）において、コンピュータ（１０１）は、プロファイル情報を利用して、中央演算処理装置（例えば、ＣＰＵ）リソースを消費するプロセスと、当該プロセスで中央演算処理装置リソースを実際に消費しているオリジナルのバイナリー・モジュールとを検出する。オリジナルのバイナリー・モジュールは例えば、当該オリジナルのバイナリー・モジュールからトレースを作成することが可能であり、当該オリジナルのバイナリー・モジュールを最適化した最適化バイナリー・モジュールが異なるプロセス（同一のコンピュータ上の異なるプロセスであっても、異なるコンピュータ上のプロセスであってもよい）で実行可能であれば、その種類は特に制限されない。
【００９０】
ステップ１で使用するプロファイル情報は例えば、頻繁に実行されるプロセスとバイナリー・モジュールとを検出可能とするパラメータであれば特にその種類を問わない。当該プロファイル情報は特には例えば、タイマー・サンプリングでありうる。また、当該プロファイル情報は例えば、System zにおいて使用されるＳＭＦ（System Management Facilities）、又は、ランタイム・インストラメンテーション（Runtime Instrumentation）でありうる。
【００９１】
ステップ２０３（以下、「ステップ２」ともいう）において、コンピュータ（１０１）は、上記ステップ１で検出したバイナリー・モジュール中の分岐命令をインストラメンテーションし、上記プロセスの実行中に当該インストラメンテーションしたコードを含むモジュールを実行し、当該インストラメンテーションしたコードで、下記図２Ｃに示す処理を実行することにより、テスト・ステップで分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出する。当該実行頻度が高いことは、上記プロセスにおける当該トレースの実行回数で判断する。当該実行頻度が高いことは例えば、下記図２Ｃに示すステップ２−３におけるカウンタが所定の閾値を超えることで判断されうる。当該検出されたトレースは、下記ステップ４において最適化の対象領域となりうる。バイナリー・モジュール中の分岐命令をインストラメンテーションすることは、プロファイルを可能にするコードを挿入したりすることである。バイナリー・モジュール中にインストラメンテーションしたコードは、プロファイル情報（例えば、それぞれの分岐命令の総分岐実行回数やそれぞれの分岐先に分岐した回数）を取得しつつ（当該取得したプロファイル情報は、プロファイル履歴として格納される）、同時に図２Ｃに示す処理を実行する。ステップ２の詳細な処理を、下記図２Ｃに示す。
【００９２】
上記プロファイル履歴は例えば、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、又は、ランタイム・インストラメンテーションを利用することによって得られる情報でありうる。
【００９３】
ステップ２０４（以下、「ステップ３」ともいう）は任意のステップであり、当該ステップ２０４において、コンピュータ（１０１）は、上記ステップ２で検出したトレースについて、当該トレースの分岐先から始まるトレースが存在することに応じて、複数のトレースを結合して、トレースよりもより大きな結合領域を作成する。当該結合領域は、下記ステップ４において最適化の対象領域となりうる。当該結合領域を作成することによって、最適化の効果が増す。
【００９４】
ステップ２０５（以下、「ステップ４ともいう）において、コンピュータ（１０１）は、ステップ２で検出した上記トレース又はステップ３で作成した上記結合領域を最適化の対象領域とし、当該最適化の対象領域を最適化したバイナリー・モジュール（最適化バイナリー・モジュール）を作成する。コンピュータ（１０１）は、上記最適化バイナリー・モジュールにおいて、オリジナルのバイナリー・モジュールと同等の入力と出力（実行結果）を持ち、且つ、最適化バイナリー・モジュール用のチェックポイントのコードをオリジナルのバイナリー・モジュールと同じ順番で呼び出すことができるように、上記オリジナルのバイナリー・モジュールを最適化しうる。上記チェックポイントは例えば、標準ライブラリールーチンの呼び出し、又はシステム・コールでありうる。
【００９５】
ステップ２０６（以下、「ステップ５」ともいう）は任意のステップであり、当該ステップ２０６において、コンピュータ（１０１）は、下記図３Ａに示すテスト実行Ａのフローチャートで保存された１つ又は複数のテストケースがある場合には、下記図３Ｂに示すテスト実行Ｂのフローチャートに従い、負荷の少ない時間帯に上記テストケースそれぞれを実行する。また、コンピュータ（１０１）は、保存されたテストケースがまだない場合には、当該ステップ５及び下記ステップ６をスキップしうる。
【００９６】
ステップ２０７（以下、「ステップ６」ともいう）において、コンピュータ（１０１）は、上記最適化バイナリー・モジュール内の最適化バイナリー・コードの分岐網羅が達成されたかを判断する。コンピュータ（１０１）は、上記分岐網羅が達成されていないことに応じて、処理をステップ２０８に進める。一方、コンピュータ（１０１）は、上記分岐網羅が達成されていることに応じて、処理をステップ２１２に進める。
【００９７】
ステップ２０８（以下、「ステップ７」ともいう）において、コンピュータ（１０１）は、下記図３Ａに示すテスト実行Ａのフローチャートに従い、テストを実行する。
【００９８】
ステップ２０９（以下、「ステップ８」ともいう）において、コンピュータ（１０１）は、上記最適化バイナリー・モジュール内の最適化バイナリー・コードの分岐網羅が達成されたかを判断する。コンピュータ（１０１）は、上記分岐網羅が達成されていないことに応じて、処理をステップ２１０に進める。一方、コンピュータ（１０１）は、上記分岐網羅が達成されていることに応じて、処理をステップ２１２に進める。
【００９９】
ステップ２１０（以下、「ステップ９」ともいう）において、コンピュータ（１０１）は、上記テストのテスト時間が超過したかを判断する。当該テスト時間とは、テスト実行に要した総時間であり、例えば図２Ｂに示す上記ステップ２０６及び２０８の処理に要する総時間である。そして、当該総時間がユーザーにより指定された所定の閾値よりも超えた場合に、テスト時間が超過したと判断されうる。コンピュータ（１０１）は、上記テスト時間が超過していることに応じて、処理をステップ２１１に進める。一方、コンピュータ（１０１）は、上記テスト時間が超過してないことに応じて、さらに上記テストを実行する為に、処理をステップ２０８に戻す。
【０１００】
ステップ２１１（以下、「ステップ１０」ともいう）において、コンピュータ（１０１）は、分岐をトレースに含めるかを判断する為の閾値（分岐確率の閾値）を上げて、図２Ａに示すステップ２〜ステップ４を再実行する。当該分岐確率の閾値を上げることによって、最適化の対象領域が縮小されることになる。コンピュータ（１０１）は、ステップ２〜ステップ４の再実行が終了することに応じて、処理をステップ５に戻す。
【０１０１】
ステップ２１２（以下、「ステップ１１」ともいう）において、コンピュータ（１０１）は、上記テストを完了し、テスト完了以降の対象プロセス（すなわち、最適化されたバイナリー・モジュールをオリジナルのバイナリー・モジュールに代わって透過的に実行するプロセスである）では、常に最適化バイナリー・モジュールをロードするようにする。
【０１０２】
ステップ２１３において、コンピュータ（１０１）は、最適化したバイナリー・コードをテストする処理を終了する。
【０１０３】
図２Ｃは、本発明の実施態様に従い、図２Ａに示すフローチャートのステップのうち、ステップ２の詳細な処理のフローチャートであり、最適化の対象領域となるトレースを検出する処理のためのフローチャートでもある。
【０１０４】
ステップ２２１において、コンピュータ（１０１）は、図２Ａに示すステップ２（２０３）の処理を開始する。
【０１０５】
ステップ２２２（以下、「ステップ２−１」ともいう）において、コンピュータ（１０１）は、プロファイル履歴（例えば、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーションを利用することによって得られる情報）に基づいて、オリジナルのバイナリー・モジュール中の分岐網羅される見込みのあるトレースを最適化の対象領域として選択する際に、トレースの先頭候補として下記条件（Ｓ１）〜（Ｓ３）のうちの１つ又は複数を選択する：
（Ｓ１）バック−エッジの分岐先；
（Ｓ２）既に存在するトレースのイグジット先；又は、
（Ｓ３）上記プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つと判断された分岐命令のいずれかの分岐先（すなわち、下記（Ｅ３）において分岐確率が低いと判断された分命令のうちのいずれかの分岐先である）。
【０１０６】
ステップ２２３（以下、「ステップ２−２」ともいう）において、コンピュータ（１０１）は、上記選択したトレースの上記先頭候補の実行に応じて、当該トレースの先頭候補に関連付けられたカウンタをインクリメントする（例えば、＋１増分する）。
【０１０７】
ステップ２２４（以下、「ステップ２−３」ともいう）において、コンピュータ（１０１）は、上記カウンタが所定の閾値を超えたかを判断する。コンピュータ（１０１）は、上記カウンタが所定の閾値を超えていることに応じて処理をステップ２２５に進める。一方、コンピュータ（１０１）は、上記カウンタが所定の閾値を超えていないことに応じて、トレースの末尾候補を検出しないで先頭候補の処理に戻す為に、処理をステップ２２２に戻す。
【０１０８】
ステップ２２５（以下、「ステップ２−４」ともいう）において、コンピュータ（１０１）は、上記カウンタの閾値を超えたトレースの先頭候補から下記条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つを示すトレースの末尾候補までを１つのトレースとする：
（Ｅ１）次のバック−エッジの分岐命令；
（Ｅ２）別のトレースの先頭へ分岐する命令、若しくは、直後の命令が別のトレースの先頭である非分岐命令（例えば、直後の命令が別のトレースの先頭であるフォール・スルーする命令）；
（Ｅ３）上記プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つ分岐命令の直前の命令；
（Ｅ４）上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結領域を作成する場合には、エッジが２つ以上合流する点の直前の命令；又は、
（Ｅ５）プログラムの終端。
【０１０９】
上記フォール・スルー命令は、分岐命令以外の命令であり、当該命令を実行すると次のアドレスにある命令が順番に実行されていく命令でもある。
【０１１０】
ステップ２２６において、コンピュータ（１０１）は、ステップ２−１〜ステップ２−４を繰り返すかを判断する。当該判断は、対象プロセスが終了するかどうかで行われる。コンピュータ（１０１）は例えば、上記ステップ２でインストラメンテーションしたコードを使用して、対象プロセスが終了するまで、ステップ２−１〜ステップ２−４の処理を実行する。コンピュータ（１０１）は、当該繰り返しをしないこと（すなわち、上記対象プロセスが終了したこと）に応じて、処理を終了ステップ２２７に進める。一方、コンピュータ（１０１）は、当該繰り返しをすること（すなわち、上記対象プロセスが終了していないこと）に応じて、処理をステップ２２２に進める。
【０１１１】
ステップ２２７において、コンピュータ（１０１）は、上記ステップ２（２０３）の処理を終了する。
【０１１２】
上記した通り、図２Ｃに示す上記処理において、コンピュータ（１０１）は、対象プロセスの実行中に、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションしたコード（以下、インストラメンテーション・コードともいう）が上記ステップ２−１に示す条件（Ｓ１）〜（Ｓ３）のうちのいずれか１つ又は複数を満たすことを検出すると、上記ステップ２−２及び上記ステップ２−３の処理を上記インストラメンテーション・コードで実行する。引き続き、コンピュータ（１０１）は、上記ステップ２−３でカウンタが閾値を超えることに応じて、トレース記録モードに入り、上記対象プロセスの実行を継続しながら、上記ステップ２−４に示す条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つの条件を上記インストラメンテーション・コードが検出するまでに実行した命令列をトレースとして選択する。
【０１１３】
図３Ａは、本発明の実施態様に従い、最適化バイナリー・モジュールの実行の出力とオリジナルのバイナリー・モジュールの実行の出力との比較の結果、上記最適化バイナリー・モジュールが正しく実行されていることに応じて、チェックポイントのコードを上記オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行し、当該オリジナルのバイナリー・モジュールを実行しているプロセスでのみ実行された上記チェックポイントのコードの実行結果を、上記最適化バイナリー・モジュールを実行しているプロセスにコピーする処理（以下、「テスト実行Ａ」ともいう）の為のフローチャートを示す。
【０１１４】
ステップ３０１において、コンピュータ（１０１）は、図２Ｂに示す上記ステップ７の処理として上記テスト実行Ａを開始する。
【０１１５】
ステップ３０２（以下、「ステップＡ−１」ともいう）において、コンピュータ（１０１）は、対象プロセス開始時に、検証用プロセスとテスト用プロセスとをそれぞれ立ち上げて、当該検証用プロセス及びテスト用プロセスの実行を開始する。コンピュータ（１０１）は、当該検証用プロセス及びテスト用プロセスの実行を例えば並列に実行しうる。コンピュータ（１０１）は、最適化バイナリー・モジュールが存在するモジュールをロードするときに、検証用プロセスにオリジナルのバイナリー・モジュールをローダー（他のプログラムを読み込んで起動できる状態にし、それを実行するプログラムである）を用いてロードし、テスト用プロセスに最適化バイナリー・モジュールを、上記ローダーを用いてロードする（実行中のロードも同様である）。なお、検証用プロセスとテスト用プロセスとが同一のコンピュータ（１０１）上で実行されてもよく、又は、代替的には、検証用プロセスとテスト用プロセスとが異なるコンピュータ上で実行されてもよい。
【０１１６】
ステップ３０３（以下、「ステップＡ−２」ともいう）において、コンピュータ（１０１）は、次のチェックポイントまで、検証用プロセス及びテスト用プロセスそれぞれを実行する。上記チェックポイントは例えば、標準ライブラリールーチンの呼び出し、又はシステム・コールでありうる。
【０１１７】
ステップ３０４において、コンピュータ（１０１）は、検証用プロセス及びテスト用プロセスそれぞれを終了するかを判断する。コンピュータ（１０１）は、次のチェックポイントに到達したことに応じて検証用プロセス及びテスト用プロセスそれぞれを終了しないと判断し、処理をステップ３０５に進める。一方、コンピュータ（１０１）は、チェックポイントに到着せずに、検証用プロセス又はテスト用プロセスが終了することに応じて、処理をステップ３０９に進める。
【０１１８】
ステップ３０５（以下、「ステップＡ−３」ともいう）において、コンピュータ（１０１）は、到達したチェックポイントで、検証用プロセスとテスト用プロセスとを同期し、検証用プロセスの出力とテスト用プロセスの出力とを比較する。コンピュータ（１０１）は、当該比較の結果、検証用プロセスの出力とテスト用プロセスの出力とが等しいことに応じて、処理をステップ３０６に進める。一方、コンピュータ（１０１）は、当該比較の結果、検証用プロセスの出力とテスト用プロセスの出力とが等しくないことに応じて、処理をエラー処理ステップ３０７に進める。
【０１１９】
ステップ３０６（以下、「ステップＡ−４」ともいう）において、コンピュータ（１０１）は、ステップ３０４での到達したチェックポイントのコードを検証用プロセス内でのみ実行し、その実行結果（すなわち、チェックポイントのコードの出力）をテスト用プロセスにコピーする。チェックポイントの実行結果は、バイナリー・コードの入力である。
【０１２０】
ステップ３０７において、コンピュータ（１０１）は、検証用プロセスの出力とテスト用プロセスの出力とが等しくないことから、検証用プロセスでの最適化バイナリー・モジュールが正しくないとして、テスト失敗であることを出力し、テスト実行Ａを終了する。
【０１２１】
ステップ３０８（以下、「ステップＡ−５」ともいう）は任意のステップであり、当該ステップ３０８において、コンピュータ（１０１）は、バッファ、例えばテストケース保存用バッファに空きがある場合に、チェックポイントのコードへの入力とその実行結果とを当該バッファにコピーする。チェックポイントのコードへの入力は、バイナリー・コードの出力である。上記バッファの大きさが、チェックポイントのコードへの全ての入力とその実行結果と検証用プロセスの終了コード及び終了ステータスとを、下記図３Ｂに示す処理で使われるテストケースとして保存するかどうかを判断する所定の閾値として用いられる。
【０１２２】
ステップ３０９（以下、「ステップＡ−６」ともいう）において、コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスそれぞれをテスト用プロセスの終了コード及び終了ステータスそれぞれと比較して、当該テスト用プロセスが正しく終了したかを判断する。コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスとテスト用プロセスの終了コード及び終了ステータスとがそれぞれいずれも等しいこと（すなわち、テスト用プロセスが正しく終了したこと）に応じて、終了処理をステップ３１０に進める。一方、コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスとテスト用プロセスの終了コード及び終了ステータスとの少なくとも１つが等しくないこと（すなわち、テスト用プロセスが正しく終了しなかったこと）に応じて、処理をエラー処理ステップ３１１に進める。
【０１２３】
ステップ３１０（以下、「ステップＡ−７」ともいう）において、チェックポイントのコードへの全ての入力とその実行結果とが上記バッファにコピーできている場合に、当該バッファの内容とステップＡ−６での終了コード及び終了ステータスとをテストケースとして保存する。当該テストケースは、本番環境で実行されているオリジナルのバイナリー・コード（又はバイナリー・モジュール）の入力とその出力との組み合わせである。
【０１２４】
ステップ３１１において、コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスとテスト用プロセスの終了コード及び終了ステータスとの少なくとも１つが等しくないことから、検証用プロセスでの最適化バイナリー・モジュールが正しくないとして、テスト失敗であることを出力し、テスト実行Ａを終了する。
【０１２５】
ステップ３１２において、コンピュータ（１０１）は、検証用プロセスでの最適化バイナリー・モジュールが正しいことから、テスト成功であることを出力し、テスト実行Ａを終了する。
【０１２６】
なお、テスト実行Ａの処理内容をさらに容易にする為に、下記図６Ａにおいてその処理内容を説明する。
【０１２７】
図３Ｂは、本発明の実施態様に従い、チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さい（図３Ａに示すステップ３０８のバッファに、チェックポイントでの全ての入力とその実行結果がコピーできている場合）ことに応じて、ステップ３１０で当該全ての入出力を保存し、コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記最適化バイナリー・モジュールのテストを実行する処理（以下、「テスト実行Ｂ」ともいう）の為のフローチャートを示す。
【０１２８】
ユーザーは、「チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいこと」における閾値（すなわち、図３Ａに示すステップ３０８でのバッファのバッファ・サイズである）として例えば、記憶装置（例えば、ディスク）の空き容量を基準に、テスト以外のワークロードに影響を与えないような値を設定しうる。
【０１２９】
ユーザーは、「コンピュータの負荷が所定の閾値よりも小さい時間帯」における閾値として例えば、ＣＰＵリソースの空きを基準に、テスト以外のワークロードに影響をあたえないような値を設定しうる。
【０１３０】
ステップ３２１において、コンピュータ（１０１）は、図２Ｂに示す上記ステップ５の処理として上記テスト実行Ｂを開始する。
【０１３１】
ステップ３２２（以下、「ステップＢ−１」ともいう）において、コンピュータ（１０１）は、テスト用プロセスを立ち上げて、当該テスト用プロセスを開始する。コンピュータ（１０１）は、最適化バイナリー・モジュールが存在するモジュールを、ローダーを用いてロードするときに、テスト用プロセスに最適化バイナリー・モジュールをロードする（実行中のロードも同様である）。
【０１３２】
ステップ３２３（以下、「ステップＢ−２」ともいう）において、コンピュータ（１０１）は、次のチェックポイントまで、テスト用プロセスを実行する。上記チェックポイントは例えば、標準ライブラリールーチンの呼び出し、又はシステム・コールでありうる。
【０１３３】
ステップ３２４において、コンピュータ（１０１）は、テスト用プロセスが終了するかを判断する。コンピュータ（１０１）は、次のチェックポイントに到達したことに応じてテスト用プロセスを終了しないと判断し、処理をステップ３２５に進める。一方、コンピュータ（１０１）は、チェックポイントに到着せずに、テスト用プロセスが終了することに応じて、処理をステップ３２８に進める。
【０１３４】
ステップ３２５（以下、「ステップＢ−３」ともいう）において、コンピュータ（１０１）は、到達したチェックポイントで、テスト用プロセスの出力と図３ＡのステップＡ−７で保存された検証用プロセスの出力（すなわち、Ａ−５でコピーされたチェックポイントのコードへの入力）を比較する。コンピュータ（１０１）は、当該比較の結果、テスト用プロセスの出力と上記保存された検証用プロセスの出力とが等しいことに応じて、処理をステップ３２５に進める。一方、コンピュータ（１０１）は、当該比較の結果、テスト用プロセスの出力と上記保存された検証用プロセスの出力とが等しくないことに応じて、処理をエラー処理ステップ３２７に進める。
【０１３５】
ステップ３２６（以下、「ステップＢ−４」ともいう）において、コンピュータ（１０１）は、テスト用プロセスの出力と上記保存された検証用プロセスの出力とが等しいことに応じて、上記保存されたチェックポイントのコードの出力（すなわちＡ−５でコピーされたチェックポイントのコードの実行結果）をテスト用プロセスにコピーする。コンピュータ（１０１）は、当該コピーが終了することに応じて、処理をステップ３２３に戻す。
【０１３６】
ステップ３２７において、コンピュータ（１０１）は、テスト用プロセスの出力と上記保存された検証用プロセスの出力とが等しくないことから、テスト用プロセスでの最適化バイナリー・モジュールが正しくないとして、テスト失敗であることを出力し、テスト実行Ｂを終了する。
【０１３７】
ステップ３２８（以下、「ステップＢ−６」ともいう）において、コンピュータ（１０１）は、テスト用プロセスの終了コード及び終了ステータスそれぞれを上記Ａ−７で保存された終了コード及び終了ステータスそれぞれと比較して、当該テスト用プロセスが正しく終了したかを判断する。コンピュータ（１０１）は、上記テスト用プロセスの終了コード及び終了ステータスが上記保存された終了コード及び終了ステータスのいずれとも等しいこと（すなわち、テスト用プロセスが正しく終了したこと）に応じて、終了処理をステップ３２９に進める。一方、コンピュータ（１０１）は、上記テスト用プロセスの終了コード及び終了ステータスが上記保存された終了コード及び終了ステータスのいずれかと等しくないこと（すなわち、テスト用プロセスが正しく終了しなかったこと）に応じて、処理をエラー処理ステップ３３０に進める。
【０１３８】
ステップ３２９において、コンピュータ（１０１）は、上記テスト用プロセスの終了コード及び終了ステータスが上記保存された終了コード及び終了ステータスのいずれとも等しいことから、検証用プロセスでの最適化バイナリー・モジュールが正しいとして、テスト成功であることを出力し、テスト実行Ｂを終了する。
【０１３９】
ステップ３３０において、コンピュータ（１０１）は、上記テスト用プロセスの終了コード及び終了ステータスが上記保存された終了コード及び終了ステータスのいずれかと等しくないことから、検証用プロセスでの最適化バイナリー・モジュールが正しくないとして、テスト失敗であることを出力し、テスト実行Ｂを終了する。
【０１４０】
図４Ａは、本発明の実施態様に従い、オリジナルのバイナリー・モジュール内のオリジナルのバイナリー・コード中の分岐網羅される見込みのある領域を最適化の対象領域として選択する処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【０１４１】
図４Ａに示すソースコード（４０１）は、図８に示すソースコード（８１１）と同じである。オリジナルのバイナリー・コードに対応するソースコード（４０１）は、実行される確率の低い例外処理のコード（* error handling *）（４１３）を、オリジナルのバイナリー・コード中に有するものとする。
【０１４２】
従来手法では、上記したとおり、最適化したバイナリー・コードには、実行される確率が低い例外処理（* error handling *）（８１３）がサイド・エグジットとして含まれてしまう。当該サイド・エグジットは、上記したように、最適化バイナリー・モジュール内の最適化したバイナリー・コードからオリジナルの最適化していないバイナリー・コードに戻るコードである。
【０１４３】
一方、本発明では、図２Ａに示すステップ２に従い、プロファイル情報（例えば、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーションを利用することによって得られる情報）に基づいて、オリジナルのバイナリー・コード中の分岐網羅される見込みのある領域（例えば、サイド・エグジットを含め実行される見込みのある領域）を最適化の対象領域として選択する。従って、コンピュータ（１０１）は、実行される確率の低い例外処理のサイド・エグジット（４１３）を最適化領域に含めずに、上記ループの後半部分（４１４）に対応するバイナリー・コードのみを最適化する。従って、本発明に従ってバイナリー最適化すると、網羅率が改善される。
【０１４４】
図４Ｂは、本発明の実施態様に従い、図２Ａに示すフローチャートのステップのうち、上記ステップ２に示す処理（すなわち、ステップ１で検出したバイナリー・モジュール中の分岐命令をインストラメンテーションし、当該インストラメンテーションしたコードを含むモジュールを実行し、当該インストラメンテーションしたコードで図２Ｃに示す処理を実行することにより、テスト・ステップで分岐網羅が達成可能であり且つ実行頻度が高い領域を検出する）の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【０１４５】
オリジナルのバイナリー・コードに対応するソースコード（４１１）中、行番号０１〜２２は参照のために便宜的に付した番号であり、また、Ａ〜Ｐは領域を示す。
【０１４６】
以下において、コンピュータ（１０１）が、ステップ２を図２Ｃに示すフローチャートに従って実行し、上記オリジナルのバイナリー・コードの分岐網羅が達成可能であり且つ実行頻度が高いトレースをどのようにして検出するか、そして任意的にステップ３をさらに実行して結合領域をどのように作成するかを、上記ソースコード（４１１）を参照しながら説明する。
【０１４７】
（ステップ２を実行し、ステップ３を実行しない場合）
【０１４８】
１）領域Ａ〜Ｅは、トレースの開始条件（Ｓ１〜Ｓ４）が無い為にトレースの対象外である。
２）コンピュータ（１０１）は、（Ｓ１）の条件より、領域Ｆからトレースを開始しようと試みる。コンピュータ（１０１）は、領域Ｇを発見し、（Ｅ３）の条件から領域Ｇの分岐命令の直前の命令（すなわち、領域Ｆの命令）までをトレースに含める。
３）領域Ｇは、分岐確率が低い分岐先を持つ分岐なので除外される。
４）コンピュータ（１０１）は、（Ｓ３）及び（Ｅ１）の条件より、領域Ｈ，Ｊ及びＫをトレースとして選択する。
５）領域Ｉは、分岐確率が０％であり、実行されない為にトレースの対象外である。
６）コンピュータ（１０１）は、（Ｓ２）の条件より、領域Ｌからトレースを開始し、領域Ｍの次は領域Ｎを選択し（トレース構築時にＭからＮに分岐したものとする）、（Ｅ５）の条件よりプログラム終端（すなわち、領域Ｐ）まで（すなわち、領域Ｌ，Ｍ，Ｎ，及びＰ）をトレースとして選択する。
７）コンピュータ（１０１）は、（Ｓ２）及び（Ｅ２）の条件より、領域Ｏをトレースとして選択する。
【０１４９】
以上より、コンピュータ（１０１）は、ステップ２（すなわち、ステップ２−１〜ステップ２−４）に示す処理によって、トレース｛Ｆ｝，｛Ｈ，Ｊ，Ｋ｝，｛Ｌ，Ｍ，Ｎ，Ｐ｝及び｛Ｏ｝を、所定の分岐網羅が達成可能であり且つ実行頻度が高いトレースとして検出する。当該検出したトレースは、ステップ４における最適化の対象領域として用いられる。
【０１５０】
（ステップ２を実行し、さらにステップ３を実行する場合）
【０１５１】
１）領域Ａ〜Ｅは、トレースの開始条件（Ｓ１〜Ｓ４）が無い為にトレースの対象外である。
２）コンピュータ（１０１）は、（Ｓ１）の条件より、領域Ｆからトレースを開始しようと試みる。コンピュータ（１０１）は、領域Ｇを発見し、（Ｅ３）の条件から領域Ｇの分岐命令の直前の命令（すなわち、領域Ｆの命令）までをトレースに含める。
３）領域Ｇは、分岐確率が低い分岐先を持つ分岐なので除外される。
４）コンピュータ（１０１）は、（Ｓ３）及び（Ｅ４）の条件より、領域Ｈをトレースとして選択する。
５）コンピュータ（１０１）は、（Ｓ２）及び（Ｅ１）の条件より、領域Ｊ及びＫをトレースとして選択する。
６）領域Ｉは、実行されない為にトレースの対象外である。
７）コンピュータ（１０１）は、（Ｓ２）の条件より、領域Ｌからトレースを開始し、領域Ｍの次に領域Ｎを選択し（トレース構築時にＭからＮに分岐したものとする）、（Ｅ４）の条件でＮまでをトレースとして選択する。
８）コンピュータ（１０１）は、（Ｓ２）及び（Ｅ４）の条件より、領域Ｏをトレースとして選択する。
９）コンピュータ（１０１）は、（Ｓ２）の条件より、領域Ｐからトレースを開始し、プログラムの終端に達するので、（Ｅ５）の条件より領域Ｐまでをトレースとして選択する。
【０１５２】
以上より、コンピュータ（１０１）は、ステップ２に示す処理によって、トレース｛Ｆ｝，｛Ｈ｝，｛Ｊ，Ｋ｝，｛Ｌ，Ｍ，Ｎ｝，｛Ｏ｝及び｛Ｐ｝を、所定の分岐網羅が達成可能であり且つ実行頻度が高いトレースとして検出する。
【０１５３】
１０）引き続き、コンピュータ（１０１）は、ステップ２で検出したトレース｛Ｆ｝，｛Ｈ｝，｛Ｊ，Ｋ｝，｛Ｌ，Ｍ，Ｎ｝，｛Ｏ｝及び｛Ｐ｝について、ステップ３に示す処理に従い、トレースの分岐先から始まるトレースが存在することから、｛Ｈ｝と｛Ｊ，Ｋ｝と｛Ｆ｝を、及び、｛Ｌ，Ｍ，Ｎ｝と｛Ｏ｝と｛Ｐ｝をそれぞれ結合して、結合領域｛Ｈ，Ｊ，Ｋ，Ｆ｝及び結合領域｛Ｌ，Ｍ，Ｎ，Ｏ，Ｐ｝を作成する。
【０１５４】
以上より、コンピュータ（１０１）は、ステップ３に示す処理によって、結合領域｛Ｈ，Ｊ，Ｋ，Ｆ｝及び結合領域｛Ｌ，Ｍ，Ｎ，Ｏ，Ｐ｝を作成する。当該作成した結合領域は、ステップ４における最適化の対象領域として用いられる。
【０１５５】
図５は、本発明の実施態様に従い、最適化したバイナリー・モジュールをテストする処理の説明を容易にする為に示したソースコード例であり、バイナリー最適化の対象であるオリジナルのバイナリー・コードに対応するソースコード例である。
【０１５６】
オリジナルのバイナリー・モジュール（バイナリ最適化対象である）に対応するソースコード（５０１）中、行番号０１〜１４は参照のために便宜的に付した番号であり、また、Ａ〜Ｊは領域を示す。
【０１５７】
以下において、コンピュータ（１０１）が、図２Ａ〜図２Ｃ及び図３Ａ〜図３Ｂに示すフローチャートに従って実行し、オリジナルのバイナリー・コードをどのように最適化し、且つ当該最適化された最適化バイナリー・コードをどのようにテストするかを説明する。
【０１５８】
図２Ａに示すステップ２の、分岐をトレースに含めるかを判断する為の閾値（分岐確率の閾値）の初期値を例えば１％であるとする。
【０１５９】
１）ステップ１において、コンピュータ（１０１）は、プロファイル情報を利用して、ＣＰＵリソースを消費するプロセスと、当該プロセスでＣＰＵリソースを実際に消費しているオリジナルのバイナリー・モジュールを検出する。図５Ａに示すソースコードは、当該検出されたバイナリー・モジュールの説明を容易にする為に示したものであり、当該検出されたオリジナルのバイナリー・モジュールに対応するソースコードである。
【０１６０】
２）ステップ２において、コンピュータ（１０１）は、トレース｛Ａ，Ｂ，Ｃ，Ｄ，Ｅ｝及び｛Ｇ，Ｈ，Ｉ，Ｊ｝を検出したとする。
【０１６１】
３）ステップ３において、コンピュータ（１０１）は、上記ステップ２で検出したトレースの分岐先から始まるトレースが存在することから、ステップ２で検出された上記トレースを結合して、結合領域｛Ａ，Ｂ，Ｃ，Ｄ，Ｅ，Ｇ，Ｈ，Ｉ，Ｊ｝を作成する。
【０１６２】
４）ステップ４において、コンピュータ（１０１）は、上記ステップ３で作成した結合領域を最適化の対象領域とし、当該最適化の対象領域を最適化した最適化バイナリー・モジュールを作成する。
【０１６３】
５）コンピュータ（１０１）は、保存されたテストケースがまだないことから、ステップ５及び６をスキップし、処理をステップ７へ進める。
【０１６４】
６）コンピュータ（１０１）は、ステップ７を開始し、ステップＡ−１において、検証用プロセスとテスト用プロセスとをそれぞれ立ち上げて、当該検証用プロセス及び当該テスト用プロセスそれぞれの実行を開始する。
【０１６５】
７）ステップＡ−２において、コンピュータ（１０１）は、最初のチェックポイントである領域Ｂまで、上記検証用プロセス及び上記テスト用プロセスをそれぞれ実行する。
【０１６６】
８）ステップＡ−３において、コンピュータ（１０１）は、上記検証用プロセス及び上記テスト用プロセスそれぞれの実行が上記最初のチェックポイントである領域Ｂまで到達したことに応じて、上記検証用プロセスの出力に当たるfile1の値と上記テスト用プロセスの出力に当たるfile1の値とを比較し、当該値が一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。領域Ｂの命令「str1=read(file1)」は、「file1」が指すファイルからデータを読み込んで、そのデータを「str1」に返す命令である。その為に、上記「file1」が上記プロセスからの出力であり、且つ、読み込んだ上記データ「str1」が上記プロセスへの入力である。なお、上記検証用プロセスの出力に当たるfile1の値と上記テスト用プロセスの出力に当たるfile1の値とは一致しているとする。
【０１６７】
９）ステップＡ−４において、コンピュータ（１０１）は、上記テスト用プロセスが正しく動いていることに応じて、上記最初のチェックポイントのコードである領域Ｂのコードを上記検証用プロセスでのみ実行し、当該実行結果であるstr1の値を上記テスト用プロセスにコピーする。
【０１６８】
１０）ステップＡ−５において、コンピュータ（１０１）は、テストケース保存用バッファに上記file1と上記str1とを保存する。
【０１６９】
１１）コンピュータ（１０１）は、ステップＡ−５が終了することに応じて、処理をステップＡ−２に戻す。
【０１７０】
１２）ステップＡ−２において、コンピュータ（１０１）は、次のチェックポイントである領域Ｈまで、上記検証用プロセス及び上記テスト用プロセスをそれぞれ実行する。
【０１７１】
１３）ステップＡ−３において、コンピュータ（１０１）は、上記検証用プロセス及び上記テスト用プロセスそれぞれの実行が上記次のチェックポイントである領域Ｈまで到達したことに応じて、上記検証用プロセスの出力に当たるfile2の値及びstr2の値それぞれを上記テスト用プロセスの出力に当たるfile2の値及びstr2の値それぞれと比較し、当該値がいずれも一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。領域Ｈの命令「rc=write(file2, str2)」は、「file2」が指すファイルへ「str2」のデータを書き込んで、結果を示すコード（例えば、成功又は失敗を示すコード）を「rc」に返す。その為に、上記「file2」及び当該「file2」に書き込むデータ「str2」が上記プロセスからの出力であり、且つ、結果を示すコード「rc」が上記プロセスへの入力である。
【０１７２】
１４）ステップＡ−４において、コンピュータ（１０１）は、チェックポイントのコードである領域Ｈのコードを検証用プロセスでのみ実行し、当該実行結果であるrcをテスト用プロセスにコピーする。
【０１７３】
１５）ステップＡ−５において、コンピュータ（１０１）は、テストケース保存用バッファに空きがあることに応じて、上記file2、上記str2、及び上記rcを当該保存用バッファにコピーする。
【０１７４】
１６）コンピュータ（１０１）は、ステップＡ−２〜Ａ〜５の各処理を、ステップ３０４に示すように、上記検証用プロセス及び上記テスト用プロセスの各プロセスが終了するまで繰り返す。
【０１７５】
なお、上記オリジナルのバイナリー・モジュール（５０１）の上記６）〜１６）の例では、領域Ｄ→領域Ｆの分岐は最後まで実行されていず、且つ、上記テストケース保存用バッファに全てのチェックポイントへの全ての入力とそれに対応する実行結果とがコピーできたとする。
【０１７６】
１７）ステップＡ−６において、コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスそれぞれをテスト用プロセスの終了コード及び終了ステータスそれぞれと比較して、当該テスト用プロセスが正しく終了したかを判断する。
【０１７７】
１８）ステップＡ−７において、検証用プロセスの終了コード及び終了ステータスとテスト用プロセスの終了コード及び終了ステータスとがそれぞれいずれも等しいことに応じて、コンピュータ（１０１）は、今回の実行、すなわち上記テストケース保存用バッファの内容とステップＡ−６の終了コード及び終了ステータスとを今回の実行によるテストケースとして保存する。
【０１７８】
１９）コンピュータ（１０１）は、ステップ８において判断される分岐網羅がまだ達成されておらず（すなわち、領域Ｄ→領域Ｆの分岐が実行されていない）、且つ、ステップ９において判断されるテスト時間がまだ超過していないので、ステップ７〜ステップ８を繰り返す。
【０１７９】
２０）コンピュータ（１０１）は、ステップ７を開始し、ステップＡ−１において、検証用プロセスとテスト用プロセスとをそれぞれ新たに立ち上げて、当該検証用プロセス及び当該テスト用プロセスそれぞれの実行を開始する。
【０１８０】
２１）ステップＡ−２において、コンピュータ（１０１）は、最初のチェックポイントである領域Ｂまで、上記検証用プロセス及び上記テスト用プロセスをそれぞれ実行する。
【０１８１】
２２）ステップＡ−３において、コンピュータ（１０１）は、上記検証用プロセス及び上記テスト用プロセスの実行が上記最初のチェックポイントである領域Ｂまで来たことに応じて、上記検証用プロセスの出力に当たるfile1の値と上記テスト用プロセスの出力に当たるfile1の値とを比較し、当該値が一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。なお、上記検証用プロセスの出力に当たるfile1の値と上記テスト用プロセスの出力に当たるfile1の値とは一致しているとする。
【０１８２】
２３）ステップＡ−４において、コンピュータ（１０１）は、上記テスト用プロセスが正しく動いていることに応じて、上記最初のチェックポイントのコードである領域Ｂのコードを上記検証用プロセスでのみ実行し、当該実行結果であるstr1の値を上記テスト用プロセスにコピーする。
【０１８３】
２４）ステップＡ−５において、コンピュータ（１０１）は、テストケース保存用バッファに上記file1と上記str1とを保存する。
【０１８４】
２５）コンピュータ（１０１）は、ステップＡ−５が終了することに応じて、処理をステップＡ−２に戻す。
【０１８５】
２６）ステップＡ−２において、コンピュータ（１０１）は、次のチェックポイントである領域Ｈまで、上記検証用プロセス及び上記テスト用プロセスをそれぞれ実行する。
【０１８６】
２７）ステップＡ−３において、コンピュータ（１０１）は、上記検証用プロセス及び上記テスト用プロセスそれぞれの実行が次のチェックポイントである領域Ｈまで到着したことに応じて、上記検証用プロセスの出力に当たるfile2の値及びstr2の値それぞれを上記テスト用プロセスの出力に当たるfile2の値及びstr2の値それぞれと比較し、当該値がいずれも一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。
【０１８７】
２８）ステップＡ−４において、コンピュータ（１０１）は、チェックポイントのコードである領域Ｈのコードを検証用プロセスでのみ実行し、当該実行結果であるrcをテスト用プロセスにコピーする。
【０１８８】
２９）ステップＡ−５において、コンピュータ（１０１）は、上記テストケース保存用バッファに空きがあることに応じて、上記file2、上記str2、及び上記rcを上記テストケース保存用バッファに保存する。
【０１８９】
３０）コンピュータ（１０１）は、ステップＡ−２〜Ａ〜５の各処理を、ステップ３０４に示すように、上記検証用プロセス及び上記テスト用プロセスの各プロセスが終了するまで繰り返す。
【０１９０】
なお、上記オリジナルのバイナリー・モジュール（５０１）の上記１８）〜３０）の例では、領域Ｄ→領域Ｆの分岐は最後まで実行されていず、且つ、上記テストケース保存用バッファに全てのチェックポイントへの全ての入力とそれに対応する実行結果とがコピーできなかったとする。
【０１９１】
３１）ステップＡ−７において、コンピュータ（１０１）は、上記テストケース保存用バッファに全てのチェックポイントへの全ての入力とそれに対応する実行結果とがコピーできなかった為に、今回の実行、すなわちテストケース保存用バッファの内容とステップＡ−６の終了コード及び終了ステータスとをテストケースとして保存しない。
【０１９２】
３２）コンピュータ（１０１）は、ステップ８において判断される分岐網羅がまだ達成されていない（すなわち、領域Ｄ→領域Ｆの分岐が実行されていない）が、ステップ９において判断されるテスト時間が超過したとする。
【０１９３】
３３）ステップ１０において、コンピュータ（１０１）は、分岐をトレースに含めるかの判断する為の閾値（分岐確率の閾値）を１０％に上げるとする。引き続き、コンピュータ（１０１）は、ステップ２〜ステップ４を再実行する。
【０１９４】
３４）ステップ２において、コンピュータ（１０１）は、トレース｛Ａ，Ｂ，Ｃ｝、｛Ｅ｝、及び｛Ｇ，Ｈ，Ｉ，Ｊ｝を検出したとする。
【０１９５】
３５）ステップ３において、コンピュータ（１０１）は、上記ステップ２で検出したトレースの分岐先から始まるトレースが存在することから、ステップ２で検出された上記トレースを結合して、結合領域｛Ｅ，Ｇ，Ｈ，Ｉ，Ｊ，Ａ，Ｂ，Ｃ｝を作成する。コンピュータ（１０１）は、上記検出したトレースの分岐先から始まるトレースが｛Ｅ｝の場合は｛Ｇ，Ｈ，Ｉ，Ｊ｝であり、トレースが｛Ｇ，Ｈ，Ｉ，Ｊ｝の場合は｛Ａ，Ｂ，Ｃ｝であり、また、トレース｛Ａ，Ｂ，Ｃ｝の分岐先から始まるトレースが存在しないので、上記結合領域を｛Ｅ，Ｇ，Ｈ，Ｉ，Ｊ，Ａ，Ｂ，Ｃ｝の順に作成する。
【０１９６】
３６）ステップ４において、コンピュータ（１０１）は、上記ステップ３で作成した結合領域を最適化の対象領域とし、当該最適化の対象領域を最適化した最適化バイナリー・モジュールを作成する。
【０１９７】
３７）コンピュータ（１０１）は、ステップ５を開始し、ステップＢ−１において、上記１８）で保存したテストケース（ループのそれぞれの繰り返しについて保存された上記file1、上記str1、上記file2、上記str2、上記rc、および上記終了コードと上記終了ステータス）を実行することを開始する。すなわち、ステップＢ−１において、コンピュータ（１０１）は、テスト用プロセスを立ち上げて、上記保存したテストケースの実行を開始する。
【０１９８】
３８）ステップＢ−２において、コンピュータ（１０１）は、最初のチェックポイントである領域Ｂまで、上記テスト用プロセスを実行する。
【０１９９】
３９）ステップＢ−３において、コンピュータ（１０１）は、上記最初のチェックポイントである領域Ｂまで到着したことに応じて、上記テスト用プロセスの出力に当たるfile1の値を、上記１８）で保存されたfile1の値と比較し、当該値が一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。なお、上記テスト用プロセスの出力に当たるfile1の値と上記保存されたfile1の値とは一致しているとする。
【０２００】
４０）ステップＢ−４において、上記１８）におけるステップＡ−７で保存されたstr1をテスト用プロセスにコピーする。
【０２０１】
４１）コンピュータ（１０１）は、ステップＢ−４が終了することに応じて、処理をステップＢ−２に戻す。
【０２０２】
４２）ステップＢ−２において、コンピュータ（１０１）は、次のチェックポイントである領域Ｈまで、上記テスト用プロセスを実行する。
【０２０３】
４３）ステップＢ−３において、コンピュータ（１０１）は、上記テスト用プロセスの実行が上記次のチェックポイントである領域Ｈまで到着したことに応じて、上記テスト用プロセスの出力に当たるfile2の値及びstr2の値それぞれを、上記１８）におけるステップＡ−７で保存されたfile2の値及びstr2の値それぞれと比較し、当該値がいずれも一致することに応じて、上記テスト用プロセスが正しく動いていると判断する。
【０２０４】
４４）ステップＢ−４において、コンピュータ（１０１）は、上記１８）におけるステップＡ−７で保存されたrcをテスト用プロセスにコピーする。
【０２０５】
４５）コンピュータ（１０１）は、ステップＢ−２〜Ｂ〜４の各処理を、ステップ３２４に示すように、テスト用プロセスが終了するまで繰り返す。
【０２０６】
４６）ステップＢ−５において、コンピュータ（１０１）は、テスト用プロセスの終了コード及び終了ステータスそれぞれを、上記１８）におけるステップＡ−７で保存された終了コード及び終了ステータスそれぞれと比較して、当該テスト用プロセスが正しく終了したかを判断する。
【０２０７】
４７）テスト用プロセスの終了コード及び終了ステータスと上記１８）におけるステップＡ−７で保存された終了コード及び終了ステータスとがそれぞれいずれも等しいことに応じて、コンピュータ（１０１）は、最適化バイナリー・モジュールのテストが成功したと判断する。
【０２０８】
４８）ステップ６において、コンピュータ（１０１）は、最適化バイナリー・モジュールの所定の分岐網羅が達成されたことに応じて、処理をステップ１１に進める。
【０２０９】
４９）ステップ１１において、コンピュータ（１０１）は、テストを完了し、以降の対象プロセスでは、常に最適化バイナリー・モジュールをロードするようにする。
【０２１０】
図６Ａは、本発明の実施態様に従い、図３Ａに示すテスト実行Ａの処理を示すダイアグラム図である。
【０２１１】
ステップＡ−１において、コンピュータ（１０１）は、対象プロセス開始時に、検証用プロセスとテスト用プロセスとをそれぞれ立ち上げて、当該検証用プロセス及び当該テスト用プロセスの実行を並列に開始する。コンピュータ（１０１）は、上記検証用プロセスにオリジナルのバイナリー・モジュール（６０１）をロードし、上記テスト用プロセスに最適化バイナリー・モジュール（６０２）をロードする。
【０２１２】
ステップＡ−２において、コンピュータ（１０１）は、次のチェックポイント（６１１）まで、検証用プロセス及びテスト用プロセスそれぞれを実行する。
【０２１３】
ステップＡ−３において、コンピュータ（１０１）は、チェックポイント（６１１）で、検証用プロセスとテスト用プロセスとを同期し、検証用プロセスの出力（すなわち、オリジナルのバイナリー・モジュール（６０１）のチェックポイントのコードの入力）とテスト用プロセスの出力（すなわち、最適化バイナリー・モジュール（６０２）のチェックポイントのコードの入力）とを比較する（６２１）。
【０２１４】
ステップＡ−４において、コンピュータ（１０１）は、検証用プロセスの出力とテスト用プロセスの出力とが等しいことに応じて、チェックポイントのコードを検証用プロセス内でのみ実行する（６２２）。従って、チェックポイントのコードは、オリジナルのバイナリー・モジュール（６０１）でのみ実行される。そして、コンピュータ（１０１）は、検証用プロセス内での上記チェックポイントのコードの実行結果（すなわち、上記検証用プロセス内での上記チェックポイントのコードの出力）をテスト用プロセスにコピーする（６２３）。
【０２１５】
引き続き、コンピュータ（１０１）は、検証用プロセス及びテスト用プロセスそれぞれを実行する。
【０２１６】
ステップＡ−６において、コンピュータ（１０１）は、検証用プロセスの終了コード及び終了ステータスそれぞれをテスト用プロセスの終了コード及び終了ステータスそれぞれと比較して、当該テスト用プロセスが正しく終了したかを判断する（６２４）。
【０２１７】
図６Ｂは、本発明の実施態様に従い、図２Ｂに示すステップ１０に従う処理であって、所定の時間の経過後に、最適化バイナリー・モジュール内の最適化したバイナリー・コード領域の分岐網羅が達成されないことに応じて、選択した対象領域を縮小する処理を示すダイアグラム図である。
【０２１８】
最適化バイナリー・コード（６４２）及びオリジナルのバイナリー・コードのコピー（６４１及び６４３）からなる最適化バイナリー・モジュール（６３１）において、コンピュータ（１０１）は、最適化バイナリー・コードの分岐網羅が所定の時間内に達成されない場合に、オリジナルのバイナリー・モジュール中の最適化の対象領域を縮小する。コンピュータ（１０１）は、当該縮小した対象領域についてバイナリー最適化をやり直し、そして当該やり直しにより最適化されたバイナリー・モジュールのテストをやり直す。従って、対象領域縮小後の最適化バイナリー・モジュール（６５１）中の最適化バイナリー・コード（６６２）は、対象領域縮小前の最適化バイナリー・モジュール（６３１）中の最適化バイナリー・コード（６４２）よりも縮小されており、一方、対象領域縮小後の最適化バイナリー・モジュール（６５１）中のオリジナルのバイナリー・コードのコピー部分（６６１及び６６３）は、対象領域縮小前の最適化バイナリー・モジュール（６３１）中のオリジナルのバイナリー・モジュールのコピー部分（６４１及び６４３）よりも拡大されている。
【０２１９】
オリジナルのバイナリー・モジュール中の最適化の対象領域を縮小することによって、テストの分岐網羅率の向上と、当該分岐網羅率の達成にかかる時間を短縮することが可能になる。
【０２２０】
また、オリジナルのバイナリー・モジュール中の最適化の対象領域を縮小することを繰り返すことは、オリジナルのバイナリー・モジュール中の最適化の対象領域を段階的に縮小することである。最適化の対象領域を段階的に縮小することによって、テストの分岐網羅率のさらなる向上と、当該分岐網羅率の達成にかかる時間をさらに短縮することが可能になるとともに、テストケースの実行に伴う本願環境の性能低下が長引かないように制限することが可能になる。
【０２２１】
図６Ｃは、本発明の実施態様に従い作成されたトレースを示し、当該トレースでは分岐確率が低い分岐先を持つ分岐命令がないことを示す。
【０２２２】
図６Ｃに示すダイアグラム（６０１）のトレースでは、分岐網羅される見込みのある領域をバイナリー最適化の対象領域として選択した場合のトレースを示す。当該ダイアグラム（６０１）のトレースでは分岐命令が４つあり、それぞれの分岐命令について分岐先の分岐確率が示してある。当該ダイアグラム（６０１）のトレースでは、上記分岐命令の分岐確率が１０％，１０％，２０％及び５０％であり、図９に示すダイアグラム（９０１）のトレースの分岐確率よりも高い。従って、当該ダイアグラム（６０２）のトレースでは、上記ダイアグラム（９０１）のトレースと比べて、分岐網羅率が改善される。
【０２２３】
図７は、図１に従うハードウェア構成を好ましくは備えており、本発明の実施態様に従い上記最適化したバイナリー・モジュールをテストするためのコンピュータの機能ブロック図の一例を示した図である。
【０２２４】
コンピュータ（７０１）は、本発明の実施態様に従い、上記最適化したバイナリー・モジュールをテストするためのコンピュータであり、例えば図１に示すコンピュータ（１０１）でありうる。
【０２２５】
コンピュータ（７０１）は、対象領域選択手段（７１１）、最適化バイナリー・モジュール作成手段（７１２）及び検証手段（７１３）、並びに任意的に、実行手段（７１６）、コピー手段（７１７）及び格納手段（７２３）を備えている。
【０２２６】
対象領域選択手段（７１１）は、プロファイル履歴（例えば、オリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションすることによって得られる情報、若しくは、ランタイム・インストラメンテーションを利用することによって得られる情報）に基づいて、オリジナルのバイナリー・モジュール（７２１）内のオリジナルのバイナリー・コード（７２１）中の分岐網羅される見込みのある領域を最適化の対象領域として選択することを実行する。オリジナルのバイナリー・モジュール（７２１）は、例えば記憶装置（１０８，１０９）に格納されていたり、又は、ネットワークを介してダウンロードされたりしうる。
【０２２７】
また、対象領域選択手段（７１１）は、トレースの先頭候補として下記条件（Ｓ１）〜（Ｓ３）のうちのいずれか１つ又は複数を選択すること：
（Ｓ１）バック−エッジの分岐先；
（Ｓ２）既に存在するトレースのイグジット先；又は、
（Ｓ３）上記プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つと判断された分岐命令のいずれかの分岐先、
上記選択したトレースそれぞれの先頭候補の実行に応じて、当該トレースの先頭候補に関連付けられたカウンタをインクリメントすること、
上記カウンタが閾値を超えたことに応じて、当該閾値を超えたトレースの先頭候補から下記条件（Ｅ１）〜（Ｅ５）のうちのいずれか１つを示す領域の末尾候補までを１つのトレースとすること：
（Ｅ１）次のバック−エッジの分岐命令；
（Ｅ２）別のトレースの先頭へ分岐する命令、若しくは、直後の命令が別のトレースの先頭である非分岐命令（例えば、直後の命令が別のトレースの先頭であるフォール・スルーする命令）；
（Ｅ３）上記プロファイル履歴において、分岐先に分岐した回数を総分岐実行回数で除した分岐確率が閾値よりも低い分岐先を持つ分岐命令の直前の命令；
（Ｅ４）上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成する場合には、エッジが２つ以上合流する点の直前の命令；又は、
（Ｅ５）プログラムの終端
を実行しうる。
【０２２８】
また、対象領域選択手段（７１１）は、上記最適化の対象領域が、分岐確率が小さいサイド・イグジットを含まないようにしうる。
【０２２９】
また、対象領域選択手段（７１１）は、上記プロファイル情報（例えば、頻繁に実行されるプロセスとバイナリー・モジュールとを検出可能とするパラメータ）を用いて、上記コンピュータの中央演算処理装置リソースを消費するプロセスと、当該プロセスで上記中央演算処理装置リソースを消費しているオリジナルのバイナリー・モジュール（７２１）とを検出すること、及び、上記検出したオリジナルのバイナリー・モジュールの分岐命令をインストラメンテーションし、分岐網羅が達成可能であり且つ実行頻度が高いトレースを検出することを実行しうる。当該検出されたトレースは、最適化バイナリー・モジュール作成手段（７１２）によって最適化の対象領域とされうる。
【０２３０】
また、対象領域選択手段（７１１）は、上記検出したトレースについて当該トレースの分岐先から始まるトレースが存在していることに応じて、複数のトレースを結合して結合領域を作成することを実行しうる。当該作成された結合領域は、最適化バイナリー・モジュール作成手段（７１２）によって最適化の対象領域とされうる。
【０２３１】
最適化バイナリー・モジュール作成手段（７１２）は、対象領域選択手段（７１１）が選択した対象領域を最適化した最適化バイナリー・モジュール（７２２）を作成することを実行する。最適化バイナリー・モジュール作成手段（７１２）は、最適化バイナリー・モジュール（７２２）を、例えば記憶装置（１０８，１０９）に格納したり、又は、ネットワークを介して他のコンピュータ（例えば、サーバ）アップロードしたりすることを実行しうる。
【０２３２】
また、最適化バイナリー・モジュール作成手段（７１２）は、上記最適化バイナリー・モジュール（７２２）のチェックポイントを、上記オリジナルのバイナリー・モジュール（７２１）と同等の入力と出力結果とを持つように最適化することを実行しうる。
【０２３３】
また、最適化バイナリー・モジュール作成手段（７１２）は、上記最適化バイナリー・モジュール（７２２）のチェックポイントの呼び出しが、上記オリジナルのバイナリー・モジュール（７２１）中の同等のチェックポイントの呼び出しと同じ順番となるように、上記オリジナルのバイナリー・モジュール（７２１）を最適化することを実行しうる。
【０２３４】
また、最適化バイナリー・モジュール作成手段（７１２）は、上記最適化バイナリー・モジュール（７２２）の実行の上記出力と上記オリジナルのバイナリー・モジュール（７２１）の実行の上記出力とを比較することにおいて、テスト用プロセス（７１５）の出力と検証用プロセス（７１４）の出力とを比較することを実行しうる。
【０２３５】
検証手段（７１３）は、最適化バイナリー・コード作成手段（７１２）が作成した上記最適化バイナリー・モジュール（７２２）と上記オリジナルのバイナリー・モジュール（７２１）とをそれぞれ実行しながら、チェックポイントで上記最適化バイナリー・モジュール（７２２）の実行と上記オリジナルのバイナリー・モジュール（７２１）の実行とを同期させて、上記最適化バイナリー・モジュール（７２２）の実行の出力と上記オリジナルのバイナリー・モジュール（７２１）の実行の出力とを比較することによって上記最適化バイナリー・モジュール（７２２）を検証することを実行する。
【０２３６】
また、検証手段（７１２）は、上記チェックポイントで上記最適化バイナリー・モジュール（７２２）の実行と上記オリジナルのバイナリー・モジュール（７２１）の実行とを同期させることにおいて、上記オリジナルのバイナリー・モジュール（７２１）を検証用プロセス（７１４）にロードし、上記最適化バイナリー・モジュール（７２２）をテスト用プロセス（７１５）にロードすること、及び、上記チェックポイントで、上記検証用プロセス（７１４）と上記テスト用プロセス（７１５）とを同期することを実行しうる。
【０２３７】
また、検証手段（７１３）は、最適化バイナリー・モジュール作成手段（７１２）が作成した上記最適化バイナリー・モジュール（７２２）をロードしたテスト用プロセス（７１５）と上記オリジナルのバイナリー・モジュール（７２１）をロードした検証用プロセス（７１４）とをそれぞれ実行しながら、チェックポイントで上記テスト用プロセス（７１５）の実行と上記検証用プロセス（７１４）の実行とを同期させて、上記テスト用プロセス（７１５）の出力と上記検証用プロセス（７１４）の出力とを比較することによって上記最適化バイナリー・モジュール（７２２）を検証することを実行しうる。
【０２３８】
また、検証手段（７１３）は、上記最適化バイナリー・モジュール（７２２）の終了コード及び終了ステータスと、上記オリジナルのバイナリー・モジュール（７２１）の終了コード及び終了ステータスとをそれぞれ比較することによって上記最適化バイナリー・モジュール（７２２）を検証すること（すなわち、上記テスト用プロセス（７１５）が正しく終了したことを検証すること）を実行しうる。
【０２３９】
また、対象領域選択手段（７１１）は、所定の時間の経過後に、最適化バイナリー・モジュール作成手段（７１２）が作成した最適化バイナリー・モジュール（７２２）内の最適化バイナリー・コード領域の分岐網羅が達成されないことに応じて、上記選択した対象領域を縮小する縮小手段（図示せず）をさらに備えうる。
【０２４０】
また、最適化バイナリー・モジュール作成手段（７１２）は、縮小手段によって縮小した対象領域を最適化した最適化バイナリー・モジュール（７２２）を作成することを実行しうる。
【０２４１】
また、検証手段（７１３）は、上記縮小した対象領域を最適化した最適化バイナリー・モジュール（７２２）と上記オリジナルのバイナリー・モジュール（７２１）とをそれぞれ実行しながら、チェックポイントで上記最適化バイナリー・モジュール（７２２）の実行と上記オリジナルのバイナリー・モジュール（７２１）の実行とを同期させて、上記縮小した対象領域を最適化した上記最適化バイナリー・モジュール（７２２）の実行の出力と上記オリジナルのバイナリー・モジュール（７２１）の実行の出力とを比較することによって上記縮小した対象領域を最適化した上記最適化バイナリー・モジュール（７２２）を検証することを実行しうる。
【０２４２】
また、検証手段（７１３）は、上記最適化バイナリー・モジュール（７２２）の実行の上記出力と上記オリジナルのバイナリー・モジュール（７２１）の実行の上記出力とを比較することにおいて、上記テスト用プロセス（７１５）の出力と上記検証用プロセス（７１４）の出力とを比較することを実行しうる。
【０２４３】
また、検証手段（７１３）は、上記選択した対象領域を縮小することにおいて、上記所定の時間の経過後に、上記最適化バイナリー・モジュール（７２２）内の最適化したバイナリー・コード領域の分岐網羅が達成されないこと且つテスト時間が超過したことに応じて、分岐をトレースに含めるかを判断する為の閾値（分岐確率の閾値）を上げることを実行しうる。
【０２４４】
また、検証手段（７１３）は、上記最適化バイナリー・モジュール（７２２）の終了コード及び終了ステータスと、上記オリジナルのバイナリー・モジュール（７２１）の終了コード及び終了ステータスとをそれぞれ比較することによって上記最適化バイナリー・モジュール（７２２）を検証することを実行しうる。
【０２４５】
実行手段（７１６）は、最適化バイナリー・モジュール（７２２）の実行の出力とオリジナルのバイナリー・モジュール（７２１）の実行の出力との比較の結果、最適化バイナリー・モジュール（７２２）が正しく実行されていることに応じて、チェックポイントのコードをオリジナルのバイナリー・モジュール（７２１）を実行しているプロセス（すなわち、検証用プロセス（７１４）でのみ実行することを実行しうる。
【０２４６】
また、実行手段（７１６）は、上記チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存することを実行しうる。
【０２４７】
また、実行手段（７１６）は、上記チェックポイントでの全ての入出力の合計サイズが所定の閾値よりも小さいことに応じて、当該全ての入出力を保存することを実行し、且つ、上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記最適化バイナリー・モジュール（７２２）のテストを実行しうる。
【０２４８】
また、実行手段（７１６）は、上記テスト用プロセス（７１５）の出力と上記検証用プロセス（７１４）の出力との比較の結果、上記最適化バイナリー・モジュール（７２２）が正しく実行されていることに応じて、上記チェックポイントのコードを上記検証用プロセス（７１４）でのみ実行しうる。
【０２４９】
また、実行手段（７１６）は、上記チェックポイントへの入力と、当該チェックポイントのコードを上記検証用プロセス（７１４）でのみ実行した実行結果とを格納手段（７２３）（例えば、バッファ）に格納することを実行しうる。
【０２５０】
また、実行手段（７１６）は、格納手段（７２３）に上記チェックポイントへの全ての入力と上記実行結果とが格納されていることに応じて、上記コンピュータの負荷が所定の閾値よりも小さい時間帯において、上記テスト用プロセス（７１５）でのテストをさらに実行しうる。
【０２５１】
コピー手段（７１７）は、オリジナルのバイナリー・モジュール（７２１）を実行しているプロセス（すなわち、検証用プロセス（７１４））でのみ実行された上記チェックポイントのコードの実行結果を、上記最適化バイナリー・モジュール（７２２）を実行しているプロセス（すなわち、テスト用プロセス（７１５））にコピーすることを実行しうる。
【０２５２】
また、コピー手段（７１７）は、上記検証用プロセス（７１４）でのみ実行された上記チェックポイントのコードの実行結果を、上記テスト用プロセス（７１５）にさらにコピーすることを実行しうる。
【図１】
0005988444.tif 000002
【図２Ａ】
0005988444.tif 000003
【図２Ｂ】
0005988444.tif 000004
【図２Ｃ】
0005988444.tif 000005
【図３Ａ】
0005988444.tif 000006
【図３Ｂ】
0005988444.tif 000007
【図４Ａ】
0005988444.tif 000008
【図４Ｂ】
0005988444.tif 000009
【図５】
0005988444.tif 000010
【図６Ａ】
0005988444.tif 000011
【図６Ｂ】
0005988444.tif 000012
【図６Ｃ】
0005988444.tif 000013
【図７】
0005988444.tif 000014
【図８】
0005988444.tif 000015
【図９】
0005988444.tif 000016