カバレッジ測定対象のプログラムから第1オブジェクトコードを生成するとともに、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第1オブジェクトコードに挿入するコンパイラ部と、前記第1オブジェクトコードを実行し、第2オブジェクトコードを生成する実行環境部と、前記第1オブジェクトコードおよび第2オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出部と、を備えることを特徴とするカバレッジ測定装置。前記コード書き換え処理への移行命令はソフトウェアブレーク命令であって、前記実行環境部は、前記挿入されたソフトウェアブレーク命令に基づく割込み処理を実行し、当該割込み処理を発生させた原因のソフトウェアブレーク命令を無演算命令に書き換える割込み処理部を備える、ことを特徴とする請求項1に記載のカバレッジ測定装置。前記コンパイラ部は、前記プログラムのソースコードの基本ブロックを特定し、前記特定した基本ブロックの夫々に前記コード書き換え処理への移行命令を挿入する、ことを特徴とする請求項1に記載のカバレッジ測定装置。前記コンパイラ部は、前記プログラムのソースコードの分岐元および分岐先の基本ブロックを特定し、前記特定した基本ブロック間の分岐部分に、コード書き換え処理への移行命令を含む基本ブロックを挿入する、ことを特徴とする請求項1に記載のカバレッジ測定装置。カバレッジ測定対象のプログラムから第1オブジェクトコードを生成するとともに、前記第1オブジェクトコードを生成する際に、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第1オブジェクトコードに挿入するコンパイルステップと、前記第1オブジェクトコードを実行して第2オブジェクトコードを生成する実行ステップと、前記第1オブジェクトコードおよび第2オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出ステップと、を含むことを特徴とするカバレッジ測定方法。カバレッジ測定対象のプログラムがコンパイルされて第1オブジェクトコードが生成される際に、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第1オブジェクトコードに挿入するコード挿入ステップと、前記第1オブジェクトコードが実行された場合、当該第1オブジェクトコードに含まれるコード書き換え処理への移行命令が実行されたとき、当該実行されたコード書き換え処理への移行命令を無演算命令に書き換えて第2オブジェクトコードを生成するコード書き換えステップと、前記第1オブジェクトコードおよび第2オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出ステップと、をコンピュータに実行させることを特徴とするカバレッジ測定プログラム。このように、カバレッジを測定するためにインスツルメンテーションコードを用いることは有用であるが、一方で、インスツルメンテーションコードの挿入によるプログラムの実行時間の増大が問題になる。本発明の一つの実施形態は、カバレッジの測定時間を短縮したカバレッジ測定装置、方法およびプログラムを提供することを目的とする。本発明の一つの実施形態によれば、カバレッジ測定装置は、コンパイラ部と、実行環境部と、カバレッジ算出部とを備えている。コンパイラ部は、カバレッジ測定対象のプログラムから第1オブジェクトコードを生成するとともに、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第1オブジェクトコードに挿入する。実行環境部は、前記第1オブジェクトコードを実行し、第2オブジェクトコードを生成する。カバレッジ算出部は、前記第1オブジェクトコードおよび第2オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出する。以下に添付図面を参照して、実施形態にかかるカバレッジ測定装置、方法およびプログラムを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。第1の実施形態まず、本発明の第1の実施形態の特徴を概略的に説明する。第1の実施形態によれば、インスツルメンテーションコードをカバレッジ計測対象のプログラムに挿入し、そのプログラムをターゲットプロセッサで実行する。ターゲットプロセッサは、プログラムに埋め込まれたインスツルメンテーションコードを実行すると、実行中のプログラムにおける当該インスツルメンテーションコードが埋込まれている箇所を書き換え、次回にその箇所を実行しても、同じインスツルメンテーションコードが呼び出されないように無効化する。プログラムの実行後、インスツルメンテーションコードの挿入位置について実行前のプログラムと実行後のプログラムとで比較することでカバレッジ測定結果を得る。具体的には、実行の前後で変化があるインスツルメンテーションコードはその箇所を通過したと判断し、変化がないインスツルメンテーションコードは通過しなかったと判断し、全インスツルメンテーションコードの通過の有無の結果を集計して、プログラムのカバレッジを計測する。図1は、第1の実施形態のカバレッジ測定装置の構成を説明する図である。カバレッジ測定装置100は、コンパイラコンパイラ部1、実行環境部2、およびカバレッジ算出部3を備えている。コンパイラ1は、カバレッジ計測対象のプログラムである、高級汎用言語で記述されたソースコード21が入力される。コンパイラ1は、入力されたソースコード21をターゲットプロセッサで実行可能な第1オブジェクトコード22に変換する。コンパイラ1には、第1オブジェクトコード22にインスツルメンテーションコードコード書き換え処理への移行命令を埋め込むインスツルメンテーションコード挿入部4が実装されている。また、コンパイラ1は、挿入されたインスツルメンテーションコードに関する情報をインスツルメンテーションコード表23に出力する。実行環境部2は、カバレッジ計測対象のプログラムの実行環境として機能し、第1オブジェクトコード22を格納するメモリ領域および当該メモリ領域に格納されている第1オブジェクトコード22を実行するターゲットプロセッサを有している。実行環境部2にはプロセッサシステムの実機やシミュレータを採用することができる。実行環境部2は、インスツルメンテーションコードが実行されたとき、当該実行されたインスツルメンテーションコードを無効化する割込みハンドラ5が実装されている。割込みハンドラ5は、該当するインスツルメンテーションコードの無効化を、第1オブジェクトコード22の実行中に当該第1オブジェクトコード22に対して実行する。その結果、実行環境部2は、第1オブジェクトコード22を実行した後、実行したインスツルメンテーションコードが無効化された第2オブジェクトコード24を生成することとなる。なお、第1オブジェクトコード22を実行する際には、第1オブジェクトコード22内のインスツルメンテーションコードを書換えられるように実行環境部2を設定しておく必要がある。例えば、第1オブジェクトコード22はRAMRandomAccessMemoryなどの書換え可能なメモリに格納しなければならない。また、プログラムを書換えから保護する機能がプロセッサやメモリに実装されている場合、その機能を無効化しなければならない。カバレッジ算出部3は、第1オブジェクトコード22と第2オブジェクトコード24とを比較してソースコード21のカバレッジを求め、カバレッジ測定結果25として出力する。より詳しくは、カバレッジ算出部3は、第1オブジェクトコード22に含まれるインスツルメンテーションコードのうち、第2オブジェクトコード24において無効化されないで残っているコードおよび無効化されたコードを夫々集計して、カバレッジを算出する。図2は、第1の実施形態のカバレッジ測定装置のハードウェア構成の一例を説明する図である。カバレッジ測定装置100は、CPUCentralProcessingUnit6、RAM7、ROMReadOnlyMemory8、入力装置9、表示装置10を備えるコンピュータ構成となっている。各々は、バスを介して夫々接続されている。ROM8は、記録媒体として、第1の実施形態のカバレッジ測定装置を実現するためのカバレッジ測定プログラム11が記録されている。CPU6は、RAM7をワークエリアとして使用して、カバレッジ測定プログラム11を実行する。表示装置10は、液晶モニタなどの表示装置であり、操作画面などのユーザに対する出力情報を表示する。入力装置9は、マウスやキーボードなどで構成され、ユーザからの操作が入力される。入力装置9から入力された操作情報は、CPU6へ送られる。カバレッジ測定プログラム11は、コンパイラ1、実行環境部2、カバレッジ算出部3、インスツルメンテーションコード挿入部4、および割込みハンドラ5を含むモジュール機能を有する。カバレッジ測定プログラム11は、RAM7にロードされることによってカバレッジ測定装置100を生成する。なお、カバレッジ測定プログラム11にコンパイラ1を生成するモジュールを含めないようにし、カバレッジ測定プログラム11が備えるインスツルメンテーションコード挿入部4のモジュールを一般に入手可能なコンパイラにインストールできるように構成してもよい。また、カバレッジ測定プログラム11に実行環境部2を含めないようにし、別途用意された実機または別途作成されたシミュレータにカバレッジ測定プログラム11が備える割込みハンドラ5のモジュールをインストールできるようにしてもよい。カバレッジ測定プログラム11は、バスを介してROM8からRAM7へロードされる。CPU6はRAM7内にロードされたカバレッジ測定プログラム11を実行する。これにより、外部記憶装置などから入力されたソースコード21に対し、第1オブジェクトコード22、第2オブジェクトコード24およびカバレッジ測定結果25が生成される。第1オブジェクトコード22、第2オブジェクトコード24およびカバレッジ測定結果25は、RAM7内に形成されるデータ格納領域に一時的に記憶される。カバレッジ測定結果25は表示用の画像データに整形されて表示装置10に出力される。なお、カバレッジ測定プログラム11は、CD-ROMや外部記憶装置などの記録媒体に格納しておいてもよい。また、カバレッジ測定プログラム11を、インターネット等のネットワークに接続されたコンピュータ上の記録媒体に格納し、ネットワーク経由でダウンロードさせることにより提供または配布するように構成しても良い。次に、カバレッジ測定装置100を用いて実現される第1の実施形態のカバレッジ測定方法を具体的なコードの例を交えて説明する。図3は、第1の実施形態のカバレッジ測定方法を説明するフローチャートである。カバレッジ測定対象のソースコード21が入力されると、該ソースコード21をコンパイルするコンパイル処理、S1。続いて、第1オブジェクトコード22を実行し、第2オブジェクトコード24を生成する実行処理、S2。そして、第1オブジェクトコード22および第2オブジェクトコード24に基づいてカバレッジを算出するカバレッジ算出処理、S3。図4は、コンパイル処理S1を説明するフローチャートである。ソースコード21が入力されると、インスツルメンテーションコード挿入部4は、ソースコード21を解析し、ソースコード21中の基本ブロックを特定するS11。基本ブロックとは、分岐のない連続したコード列、すなわちプログラム中の分岐および合流点間のコード列である。分岐および合流点を特定することで基本ブロックが特定できる。続いて、インスツルメンテーションコード挿入部4は、特定された各基本ブロックにインスツルメンテーションコードを挿入し、インスツルメンテーションコードを挿入した位置を示すインスツルメンテーションコード表23を作成するS12。なお、第1の実施形態では、ラインカバレッジの計測が行われるものとする。ラインカバレッジを測定するためには、ターゲットプロセッサがプログラムを実行した際に、プログラム中の各行の実行の有無を取得する必要がある。基本ブロックにおいてそのコード列中のどこか一箇所を実行したことを知ることができれば、その基本ブロックを構成するコード列を全て実行したことがわかる。したがって、S12の処理においては、基本ブロック一つあたりに一つのインスツルメンテーションコードを挿入する。なお、基本ブロックに挿入するインスツルメンテーションコードの数は特に限定されないが、インスツルメンテーションコードの数に応じて割込み処理にかかるオーバヘッドが増大するので、基本ブロックに挿入するインスツルメンテーションコードの数は1個とするとよい。また、インスツルメンテーションコード挿入部4は、カバレッジ算出のために、インスツルメンテーションコードを挿入すると同時にコード挿入箇所をインスツルメンテーションコード表23に記録する。インスツルメンテーションコード表23には、インスツルメンテーションコードのオブジェクト内の位置、対応するソースコードのファイルと行が記録される。図5は、第1の実施形態のインスツルメンテーションコード挿入の概念を説明する図である。ソースコード21aは、インスツルメンテーションコード挿入後のソースコードを示す。ソースコード21は破線で示す3つの基本ブロックを備えており、ソースコード21aは、夫々の基本ブロックにインスツルメンテーションコードとしてのbreakが挿入されている。breakは、実行されたときに割込み処理を発生するソフトウェアブレーク命令である。当該ソフトウェアブレーク命令によって制御がカバレッジ測定対象のプログラムから割込みハンドラ5へと移るようになっている。割込みハンドラ5に制御が移る際には、ソフトウェア割込みを発生させた命令が配置されているメモリアドレスが記録される。割込みハンドラ5は、当該メモリアドレスを読み出すことができる。図6は、第1の実施形態のインスツルメンテーションコード表23の概念を説明する図である。インスツルメンテーションコード表23は、オブジェクト名、番地、ファイル名、ファイル行の項目を持ち、一個のインスツルメンテーションコードにつき一ラインの項目が記載される。オブジェクト名は、第1オブジェクトの名前である。番地は、RAM7におけるインスツルメンテーションコードが配置されたアドレスを示す。ファイル名は、ソースコードの名前であり、ファイル行は、ソースコード中の行を示す。インスツルメンテーションコード表23によりオブジェクトに挿入されたインスツルメンテーションコードの数と位置を把握でき、第2オブジェクト内のインスツルメンテーションコードの挿入位置を確認することにより、カバレッジを算出できる。インスツルメンテーションコードが挿入された後、コンパイラ1は、インスツルメンテーションコード挿入後のソースコードをコンパイルして第1オブジェクトコード22を生成しS13、コンパイル処理が終了となる。なお、ここでは分かりやすくするために、ソースコード21に対してインスツルメンテーションコードが挿入され、インスツルメンテーションコードが挿入されたソースコード21がコンパイルされることで第1オブジェクトコード22が生成される、として説明したが、インスツルメンテーションコードはアセンブリコードやオブジェクトコードに変換されてから挿入されるようにしても構わない。実行環境部2が実行処理S2の際にインスツルメンテーションコードbreakを実行したとき、ソフトウェア割込みにより割込みハンドラ5に制御が移る。図7は、割込みハンドラ5による処理を説明するフローチャートである。実行処理中に割込みが発生すると、割込みハンドラ5は割込み時のプログラムカウンタを参照し、割込み原因の命令、すなわち、実行されたインスツルメンテーションコードの場所を特定するS21。そして、割込みハンドラ5は、特定されたインスツルメンテーションコードを無演算命令に書換えるS22。割込みハンドラ5による書換え処理が終わると、第1オブジェクトコード22の割込み発生前の箇所に制御が戻る。図8は、割込みハンドラ5による処理の概念を説明する図である。実行中の第1オブジェクトコード22に含まれるbreakが実行された際、割込みが発生し、割込みハンドラ5が割込みを発生させたbreakを無演算命令nopに書き換えている。このように、割込みハンドラ5は、割込みの原因となったbreakをnopに書き換えることで、同一基本ブロックが再度実行されたときに割込みが発生することを抑制する。図9は、カバレッジ算出処理S3を説明するフローチャートである。すべての実行処理が終了すると、カバレッジ算出部3は、インスツルメンテーションコード表23を用い、基本ブロック中のインスツルメンテーションコードを特定するS31。そして、カバレッジ算出部3は、S32~S36のループ処理を各基本ブロックに対して実行し、カバレッジ算出処理が終了となる。第2オブジェクトコード24においては、第1オブジェクトコード22と比較すると、実行された基本ブロックに配置されていたインスツルメンテーションコードが無演算命令に書き換わっている。カバレッジ算出部3は、基本ブロックに含まれるインスツルメンテーションコードが第1オブジェクトコード22と第2オブジェクトコード24との間で書き換わっているか否かを判定するステップS33。書き換わっている場合S33、Yes、カバレッジ算出部3は、当該基本ブロック内のコード列を実行されたコード列として集計するステップS34。書き換わっていない場合S33、No、カバレッジ算出部3は、当該基本ブロック内のコード列を実行されていない未実行のコード列として集計するS35。実行された行数と実行されていない行数とが夫々集計され、集計結果はカバレッジ測定結果25として出力される。なお、ここでは、実行されたコード列の数と実行されていないコード列の数とを夫々集計するようにしているが、インスツルメンテーションコード表23を参照することによってインスツルメンテーションコードの総数を知ることができるので、どちらか一方のみを集計し、インスツルメンテーションコードの総数から他方の数を算出するようにしてもよい。図10は、カバレッジ算出処理の概念を説明する図である。図10では、第1オブジェクトコードに挿入されている3つのbreakのうちの2つがnopに書き換えられている。この場合、3つの基本ブロックの行数が夫々等しいとすると、ラインカバレッジ測定結果25は66となる。図11は、カバレッジ測定結果25の表記例を説明する図である。図11-1は、カバレッジ測定結果25は、ソースコード21に記述されているコード列が記述されており、カバレッジ算出処理により実行したことが判別されたコード列が識別できるように色づけ表示されている例である。このように、ソースコードに色をつけることによって、直感的にカバレッジを確認することができるようになる。また、図11-2は、カバレッジ測定結果25は、実行された行数がファイルや関数ごとに記述されるテーブル構成の例である。このように、カバレッジ対象の異なる単位で表示することによって、より注目する箇所のカバレッジを把握できるようになる。なお、以上の説明においては、第1オブジェクトコードに含まれるインスツルメンテーションコードの書き換えを割込みハンドラ5が実行することとしたが、インスツルメンテーションコード挿入部4は、インスツルメンテーションコードによって呼び出され、呼び出し元のインスツルメンテーションコードを書き換えるプログラムを第1オブジェクトコード22に埋め込むようにしてもよい。これにより、実行環境部2は割込みハンドラ5の実装を必要とすることなく、第1オブジェクトコード22を実行するだけでインスツルメンテーションコードの書き換えを実行できるようになる。また、インスツルメンテーションコード挿入部4は、インスツルメンテーションコードを挿入したソースコードを出力する。そして、割込みハンドラ5は、第1オブジェクトコード22のインスツルメンテーションコードを書き換える際、ソースコードの対応するインスツルメンテーションコードも無演算命令に書き換えるようにする。カバレッジ算出部3は、インスツルメンテーションコードが書き換えられる前後のソースコードをカバレッジ測定結果25とともに出力するようにしてもよい。また、カバレッジ算出部3は、インスツルメンテーションコード表23を用いることで第1オブジェクトコード22と第2オブジェクトコード24とを間接的に比較するようにしたが、第1オブジェクトコード22と第2オブジェクトコード24とを直接的に比較するようにしてもよい。このように、第1の実施形態によれば、カバレッジ測定対象のソースコード21から第1オブジェクトコード22が生成される際に、自命令が実行されたときに自命令を無演算命令に書き換えるインスツルメンテーションコードを前記第1オブジェクトコード22に挿入するインスツルメンテーションコード挿入部4と、生成された第1オブジェクトコード22を実行する実行環境部2と、実行環境部2により出力された第2オブジェクトコード24に含まれるインスツルメンテーションコードおよび無演算命令に基づいてソースコード21のカバレッジを算出するカバレッジ算出部3と、を備えるように構成したので、一度実行されたインスツルメンテーションコードが再度実行されることを防止することができるので、カバレッジの測定時間を短縮することができる。また、インスツルメンテーションコード挿入部4は、ソースコード21の基本ブロックを特定し、特定した基本ブロックの夫々にインスツルメンテーションコードを1つ挿入する、ように構成したので、ラインカバレッジを効率的に測定することができる。すなわち、基本ブロック単位でインスツルメンテーションコードを挿入するので、少ない演算でカバレッジの測定を効率的に行うことができる。また、カバレッジ算出部3は、第2オブジェクトコード24において、インスツルメンテーションコードが残っている基本ブロックを実行されていない基本ブロックとして集計し、または、インスツルメンテーションコードが無演算命令に書き換えられた基本ブロックを実行された基本ブロックとして集計し、集計結果に基づいてカバレッジを算出する、ように構成したので、ラインカバレッジを効率的に測定することができる。第2の実施形態第2の実施形態は、ブランチカバレッジを測定することができる。第2の実施形態のカバレッジ測定装置は、第1の実施形態と同様の構成により実現される。また、第2の実施形態のカバレッジ測定装置の機能構成要素はインスツルメンテーションコード挿入部4の動作が異なるのみで第1の実施形態とほぼ同様であるので、以降、第1の実施形態と異なる部分のみ説明し、重複する説明を省略する。ブランチカバレッジはプログラム中の分岐に対するカバレッジである。ブランチカバレッジを計測するためには、ラインカバレッジのようなコード列中の実行箇所ではなく、コード列間の実行箇所を特定する必要がある。このため、インスツルメンテーションコード挿入部4は、プログラム中の分岐部分にインスツルメンテーションコードを挿入する。図12は、第2の実施形態のコンパイル処理を説明するフローチャートである。ソースコード21が入力されると、インスツルメンテーションコード挿入部4は、ソースコード21を解析し、ソースコード21中の基本ブロックを特定するS41。そして、インスツルメンテーションコード挿入部4は、ソースコード21中の分岐について、分岐元と分岐先の基本ブロックを特定し、それら基本ブロック間に追加のインスツルメンテーションコード用基本ブロックを挿入するS42。そして、インスツルメンテーションコード挿入部4は、インスツルメンテーションコード用基本ブロックにインスツルメンテーションコードコード書き換え処理への移行命令を挿入し、インスツルメンテーションコードを挿入した位置を示すインスツルメンテーションコード表23を作成するS43。インスツルメンテーションコードが挿入された後、コンパイラ1は、インスツルメンテーションコード挿入後のソースコードをコンパイルして第1オブジェクトコード22を生成しS44、コンパイル処理が終了となる。その後、第1実施形態と同様に、第1オブジェクトコード22を実行し、第2オブジェクトコード24を生成する。第1オブジェクトコード22と第2オブジェクトコード24を解析し、カバレッジを測定する。図13は、第2の実施形態のインスツルメンテーションコード挿入の概念を説明する図である。破線で囲まれたコード列は、第1オブジェクトコード22に含まれている基本ブロックを示しており、実線で囲まれたコード列はインスツルメンテーションコード用基本ブロックを示している。図示するように、基本ブロック間の分岐、即ちL1-L2間とL1-L3間に新たに基本ブロックが挿入され、それらの基本ブロックにインスツルメンテーションコードとしてのbreakが挿入されている。このように、第2の実施形態によれば、コンパイラ1は、ソースコード21の基本ブロックを特定し、特定した基本ブロック間の分岐部分に、インスツルメンテーションコードを挿入した基本ブロックを挿入する、ように構成したので、ブランチカバレッジを効率的に測定することができる。また、第2の実施形態によれば、第1の実施形態と同様に、一度実行されたインスツルメンテーションコードが再度実行されることを防止することができる。したがって、カバレッジの測定時間を短縮することができる。また、カバレッジ算出部3は、第2オブジェクトコード24に含まれる基本ブロックのうち、インスツルメンテーションコードが残っている基本ブロックを実行されていない基本ブロックとして集計し、または、インスツルメンテーションコードが無演算命令に書き換えられた基本ブロックを実行された基本ブロックとして集計し、集計結果に基づいてカバレッジを算出する、ように構成したので、ブランチカバレッジを効率的に測定することができる。なお、実施形態では、書き換えるインスツルメンテーションコードとしてbreakを例に説明したが、コード書き換え処理を通常の関数にして、インスツルメンテーションコードを関数呼び出し命令にしてもよい。また、書き換えられるインスツルメンテーションコードとしてnopを例に説明したが、実質的にnopと同等の効果のあるコード無意味に演算する命令、例えば0をたす、等に書き換えてもよい。本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。