(57)【要約】【課題】プログラムの処理フローを考慮して、プログラムを解析するコストを計測することができるようにすること。【解決手段】本発明は、プログラムの動作をトレースし、トレースにおいて参照が発生した変数に対する参照コストを変数が現在の参照されている実行ステップ数と変数が前回に処理された実行ステップ数との距離に基づいて計測し、計測した参照コストに基づいてプログラムの解析コストを計測するようにした。このように、プログラムをトレースし、トレース結果を用いてプログラムの解析コストを計測することにより、プログラムの処理フローを考慮したプログラムの解析コストの計測を実現した。【選択図】        図１
2004272814.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの動作をトレースするプログラムトレース部と、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測し、前記参照コストに基づいて前記プログラムの解析コストを計測するコスト計測部と、を具備したことを特徴とするプログラム解析コスト計測装置。
【請求項２】
前記トレースにおいて参照が発生した前記変数もしく代入が発生した前記変数を入力する有限長のキューを具備し、
前記コスト計測部は、前記参照が発生した変数が前記キューに存在するか否かに基づいて、前記参照コストの計測方法を変更することを特徴とする請求項１記載のプログラム解析コスト計測装置。
【請求項３】
前記コスト計測部は、前記キューに前記参照が発生した変数が存在する場合には、前記参照コストを一定とすることを特徴とする請求項２記載のプログラム解析コスト計測装置。
【請求項４】
前記コスト計測部は、前記キューに前記参照が発生した変数が存在しない場合には、前記距離が大きいほど前記参照コストを大きくすることを特徴とする請求項２または請求項３記載のプログラム解析コスト計測装置。
【請求項５】
前記プログラムの実行コードを実行順に記述したプログラムに変換し、変換した前記プログラム中に前記変数の参照を行う前記実行コード部分および前記変数に対する代入を行う前記実行コード部分に前記参照が発生したこともしくは前記代入が発生したことを示すシンボルを出力する出力コードを付加し、前記出力コードが付加された前記プログラムを実行することにより前記シンボルが出力されたファイルを出力する変換部を具備し、
前記プログラムトレース部は、前記ファイルに対して前記トレースを実行することを特徴とする請求項１から請求項４のいずれかに記載のプログラム解析コスト計測装置。
【請求項６】
前記コスト計測部は、前記解析コストの合計値と前記プログラムの総ステップ数に基づいて前記プログラムの解析コストを計測することを特徴とする請求項１から請求項５のいずれかに記載のプログラム解析コスト計測装置。
【請求項７】
前記コスト計測部は、前記解析コストの合計値を前記プログラムの総ステップ数で割ることで前記プログラムの解析コストを計測することを特徴とする請求項６記載のプログラム解析コスト計測装置。
【請求項８】
前記プログラムに対して条件式の入力パターンを複数選択し、前記入力パターン毎に前記解析コストを計測し、計測した複数の前記解析コストに基づいて、前記解析コストを計測することを特徴とする請求項１から請求項７のいずれかに記載のプログラム解析コスト計測装置。
【請求項９】
プログラムの動作をトレースするステップと、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測するステップと、前記参照コストに基づいて前記プログラムの解析コストを計測するステップと、を具備したことを特徴とするプログラム解析コスト計測方法。
【請求項１０】
コンピュータに、プログラムの動作をトレースするステップと、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測するステップと、前記参照コストに基づいて前記プログラムの解析コストを計測するステップと、を行わせることを特徴とするプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラムを解析するコストを計測するプログラム解析コスト計測装置およびその方法に関する。
【０００２】
【従来の技術】
従来より、プログラムを解析するコスト（時間）を計算することにより、プログラムの品質評価や読みやすさの評価することが行われている。プログラムを解析するコストを計測する方法としては、例えば非特許文献１に開示された方法がある。
【０００３】
この方法は、ソースのプログラムを参照し、プログラム中で変数が参照されている行を検出した場合に、参照されている変数が前回に処理された行を検出し、現在変数が参照されている行とこの変数が前回参照された行との距離を計測する。そして、計測した距離が大きいほどプログラムを解析するコストが大きいとするものである。そして、この計測を、プログラム中のすべての参照変数に対して行うことにより、プログラムを解析するコストを計測する。
【０００４】
【非特許文献１】
ＣＯＮＴＥ，Ｓ．Ｄ．，Ｄｕｎｓｍｏｒｅ，Ｈ．Ｅ．ａｎｄ  ＳｈｅｎＶ．Ｙ．  “Ｓｏｆｔｗａｒｅ  Ｅｎｇｉｎｅｅｒｉｎｇ  Ｍｅｔｒｉｃｓ  ａｎｄ  Ｍｏｄｅｌｓ，”．  Ｔｈｅ  Ｂｅｎｊａｍｉｎ／ｃｕｍｍｉｎｇｓ，１９８６．
【０００５】
【発明が解決しようとする課題】
しかしながら、上述した方法は、単純にソースのプログラム中で、現在変数が参照されている行とこの変数が前回参照された行との距離に応じて、プログラムの解析コストを計測するものである。よって、上述した方法は、これらの行間における制御フローについて考慮していない。
【０００６】
例えば、現在変数が参照されている行とこの変数が前回参照された行の間に、ｉｆ文、ｆｏｒ文、およびｗｈｉｌｅ文などのプログラムのフローをコントロールする命令文がある場合と、ない場合では、実行ステップ数が大きく違う。しかし、上述した方法では、これらの行間に命令文があってもなくても解析コストが同じになってしまうという課題を有している。
【０００７】
また、現在変数が参照されている行とこの変数が前回参照された行との間に大量に他の変数が参照されている場合と、コメントなど実際の処理に関係ない記述がなされている場合とでも、大きく実行ステップ数が変わってくる。しかし、上述した方法では、このような場合であっても解析するコストが同じになってしまう。
【０００８】
本発明は、かかる点に鑑みてなされたものであり、プログラムの処理フローを考慮して、プログラムを解析するコストを計測することを目的とする。
【０００９】
【課題を解決するための手段】
本発明は、プログラムの動作をトレースし、トレースにおいて参照が発生した変数に対する参照コストを変数が現在の参照されている実行ステップ数と変数が前回に処理された実行ステップ数との距離に基づいて計測し、計測した参照コストに基づいてプログラムの解析コストを計測するようにした。
【００１０】
このように、プログラムをトレースし、トレース結果を用いてプログラムの解析コストを計測することにより、プログラムの処理フローを考慮したプログラムの解析コストを計測することができる。
【００１１】
【発明の実施の形態】
本発明の第１の態様にかかるプログラム解析コスト計測装置は、プログラムの動作をトレースするプログラムトレース部と、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測し、前記参照コストに基づいて前記プログラムの解析コストを計測するコスト計測部と、を具備した構成を採る。
【００１２】
これにより、プログラムをトレースし、トレース結果を用いてプログラムの解析コストを計測することで、プログラムの処理フローを考慮したプログラムの解析コストを計測することができる。
【００１３】
本発明の第２の態様は、第１の態様にかかるプログラム解析コスト計測装置において、前記トレースにおいて参照が発生した前記変数もしく代入が発生した前記変数を入力する有限長のキューを具備し、前記コスト計測部は、前記参照が発生した変数が前記キューに存在するか否かに基づいて、前記参照コストの計測方法を変更する。
【００１４】
キューに格納されている変数は、人間が記憶できている変数を意味する。よって、参照されている変数がキューに格納されているか否かで変えることにより、参照コストを人間の記憶能力に対応したものにできる。
【００１５】
本発明の第３の態様は、第２の態様にかかるプログラム解析コスト計測装置において、前記コスト計測部は、前記キューに前記参照が発生した変数が存在する場合には、前記参照コストを一定とする。
【００１６】
キューに格納されている変数は、人間が記憶できている変数を意味する。よって、参照コストを一定の値にすることにより、参照コストを人間の記憶能力に対応したものにできる。
【００１７】
本発明の第４の態様は、第２の態様または第３の態様にかかるプログラム解析コスト計測装置において、前記コスト計測部は、前記キューに前記参照が発生した変数が存在しない場合には、前記距離が大きいほど前記参照コストを大きくする。
【００１８】
キューに格納されていない参照変数は、人間が記憶できていない変数を意味するので、人間はこの変数を解析するのに前回参照したステップまでバックトレースする必要がある。よって、解析コストを前回参照されたステップ数との距離に応じた値にすることにより、バックトレースにかかるコストに正確に対応するものにできる。このように、参照コストを人間の記憶能力に対応したものにできる。
【００１９】
また、前回参照されたステップ数との距離が大きいほど参照コストを大きくすることにより、参照コストをバックトレースに対応させたものにできる。
【００２０】
本発明の第５の態様は、第１の態様から第４の態様のいずれかにかかるプログラム解析コスト計測装置において、前記プログラムの実行コードを実行順に記述したプログラムに変換し、変換した前記プログラム中に前記変数の参照を行う前記実行コード部分および前記変数に対する代入を行う前記実行コード部分に前記参照が発生したこともしくは前記代入が発生したことを示すシンボルを出力する出力コードを付加し、前記出力コードが付加された前記プログラムを実行することにより前記シンボルが出力されたファイルを出力する変換部を具備し、前記プログラムトレース部は、前記ファイルに対して前記トレースを実行する。
【００２１】
これにより、プログラムを、変数が実行順に出力されるファイルに変換してからプログラム解析コストの計測を行える。この結果、プログラム中の変数の実行順を容易に把握でき、変数に関する解析コストの計測を高速化することができる。
【００２２】
本発明の第６の態様は、第１の態様から第５の態様のいずれかにかかるプログラム解析コスト計測装置において、前記コスト計測部は、前記解析コストの合計値と前記プログラムの総ステップ数に基づいて前記プログラムの解析コストを計測する。
【００２３】
これにより、プログラムのサイズにかかわらずコストを計測できる。
【００２４】
本発明の第７の態様は、第６の態様にかかるプログラム解析コスト計測装置において、前記コスト計測部は、前記解析コストの合計値を前記プログラムの総ステップ数で割ることで前記プログラムの解析コストを計測する。
【００２５】
これにより、解析コストを正規化することができ、１ステップあたりの解析コストを計算でき、プログラムのサイズにかかわらずコストを計測できる。
【００２６】
本発明の第８の態様は、第１の態様から第７の態様のいずれかにかかるプログラム解析コスト計測装置において、前記プログラムに対して条件式の入力パターンを複数選択し、前記入力パターン毎に前記解析コストを計測し、計測した複数の前記解析コストに基づいて、前記解析コストを計測する。
【００２７】
これにより、入力パターンによりプログラムの解析結果が変わる場合でも、入力パターンの依存度を少なくすることができる。
【００２８】
本発明の第９の態様は、プログラムの動作をトレースするステップと、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測するステップと、前記参照コストに基づいて前記プログラムの解析コストを計測するステップと、を具備したことを特徴とするプログラム解析コスト計測方法である。
【００２９】
本発明の第１０の態様は、コンピュータに、プログラムの動作をトレースするステップと、前記トレースにおいて参照が発生した変数に対する参照コストを前記変数が現在の参照されている実行ステップ数と前記変数が前回に処理された実行ステップ数との距離に基づいて計測するステップと、前記参照コストに基づいて前記プログラムの解析コストを計測するステップと、を行わせることを特徴とするプログラムである。
【００３０】
（実施の形態１）
以下、本発明の実施の形態１にかかるプログラム解析コスト計測装置について、添付図面を用いて詳細に説明する。
【００３１】
まず、実施の形態１にかかるプログラム解析コスト計測装置の構成について図１を用いて説明する。図１は、実施の形態１にかかるプログラム解析コスト計測装置のブロック図である。
【００３２】
実施の形態１にかかるプログラム解析コスト計測装置１００には、ソースプログラム１０１を格納するプログラム格納部１０２が設けられている。
【００３３】
また、プログラム解析コスト計測装置１００には、プログラム１０１の動作をトレースするプログラムトレース部１０３が設けられている。プログラムトレース部１０３は、プログラム１０１を実行し、動作中に代入された変数や、参照されている変数を、コスト計測部１０４、キュー１０５、および変数記憶部１０６に出力する。また、プログラムトレース部１０３は、出力した変数のプログラム１０１における実行ステップ数をコスト計測部１０４および変数記憶部１０６に出力する。
【００３４】
キュー１０５は、あらかじめ決められた数の格納場所を有するＦＩＦＯメモリである。キュー１０５は、あらかじめ決められた数以上の情報が入力されると、格納順の最も古い情報を追い出す。キュー１０５が格納できる情報の数は、人間が記憶できる変数の数に対応させるのが好ましい。実施の形態１では、キュー１０５は、３つの変数まで格納できるとする。
【００３５】
変数記憶部１０６は、図に示すように、変数名１０７と、変数の最終参照ステップ数１０８と、変数の最終代入ステップ１０９と、の組を複数格納したテーブルである。
【００３６】
コスト計測部１０４は、プログラムトレース部１０３から変数が入力されると、入力された変数が値を参照されている変数（以下、参照変数とする）か否かを判断する。入力された変数が参照変数である場合には、コスト計測部１０４は、参照変数が、キュー１０５に格納されているか否かを判断する。そして、参照変数がキュー１０５に格納されている場合には、コスト計測部１０４は、所定の値をこの参照変数に対する解析コスト（参照コスト）とする。
【００３７】
このように解析コストを計算するのは、キュー１０５に格納されている参照変数は、人間が記憶できている変数を意味するからである。つまり、この参照変数を解析するのに、プログラムをバックトレースする必要がなく、解析コストは一定の値になるからである。このように、解析コストを人間の記憶能力に対応したものにできる。
【００３８】
一方、入力された参照変数がキュー１０５に格納されていない場合には、コスト計測部１０４は、まず、変数記憶部１０６の最終参照ステップ数１０８および最終代入ステップ数１０９を参照し、ステップ数の大きいものを抽出する。
【００３９】
次に、コスト計測部１０４は、この抽出したステップ数１０８、１０９と入力された参照変数の実行ステップ数と差分の（差分）ステップ数を計算し、この差分ステップ数に応じた値を解析コスト（参照コスト）とする。
【００４０】
本実施例では、コスト計測部１０４は、差分ステップ数に所定の値を乗算した値を解析コストとする。つまり、コスト計測部１０４は、差分ステップが大きいほど解析コストが大きくなるようにする。
【００４１】
このように解析コストを計算するのは、キュー１０５に格納されていない参照変数は、人間が記憶できていない変数を意味するからである。つまり、人間はこの変数を解析するために、この参照変数が前回処理されたステップまでバックトレースする必要があるためである。よって、解析コストを前回参照されたステップ数との差分（距離）に応じた値にすることにより、バックトレースにかかるコストに対応するものにできる。このように、解析コストを人間の記憶能力に対応したものにできる。
【００４２】
また、バックトレースにかかる解析コストは差分ステップが大きいほど大きくなる。よって、上述したように、差分ステップが大きいほど解析コストを大きくすることにより、解析コストをバックトレースに正確に対応させたものにできる。
【００４３】
なお、コスト計測部１０４の差分ステップ数に応じた解析コストの計算方法は、これ以外であってもよい。差分ステップ数が多いほど値が大きくなる計算方法であればいかなるものであっても良い。
【００４４】
また、コスト計測部１０４は、入力された変数が値の代入されている変数（以下、代入変数とする）である場合は、所定の値を解析コスト（代入コスト）とする。
【００４５】
このように解析コストを計算するのは、代入変数は今回始めて処理されたものであり、以前に行われた処理とは関係ないので、人間の記憶能力に関係なく、解析コストは一定の値になるからである。
【００４６】
そして、コスト計測部１０４は、入力されたすべての変数に対して計測した解析コスト（参照コスト、代入コスト）を加算したものに基づいてプログラム１０１の解析コストを計測し、結果出力部１１０に出力する。
【００４７】
結果出力部１１０は、コスト計測部１０４が出力した解析コストを提示する。結果出力部１１０は、モニタやプリンタなどの情報提示手段である。
【００４８】
次に、プログラム解析コスト計測装置のプログラム解析動作について、図２を用いて詳細に説明する。図２は、実施の形態１にかかるプログラム解析コスト計測装置のプログラム解析フロー図である。
【００４９】
まず、プログラムトレース部１０３がプログラムの１ステップ目を実行する（ＳＴ２０１）。次に、コスト計測部１０４が、ＳＴ２０１において実行されたステップに変数があるか否かを判断する（ＳＴ２０２）。
【００５０】
実行されたステップに変数がない場合は、コスト計測部１０４は、キュー１０５に変数と関係ない値を入力することにより、キュー１０５に格納されたデータをずらし、ＳＴ２０１の処理に移行する（ＳＴ２０３）。
【００５１】
これは、キュー１０５に格納された変数であっても、前回参照されてから時間が経過すると、人間が忘れるからである。
【００５２】
なお、実施の形態１では、変数がないステップ（行）毎にキュー１０５をずらす処理を行うが、変数がないステップが数ステップ加算されてからキュー１０５をずらすようにしても良い。
【００５３】
一方、ＳＴ２０２において実行されたステップに参照変数がある場合は、コスト計測部１０４は、参照変数に関する解析コスト計測処理に移行する（ＳＴ２０４）。
【００５４】
まず、コスト計測部１０４は、ＳＴ２０１において実行されたステップの参照変数がキュー１０５内にあるか否かを判断する（ＳＴ２０５）。
【００５５】
ＳＴ２０１において実行されたステップの参照変数がキュー１０５内にある場合には、この参照変数は人間が記憶できていると考えられるので、解析コストＣに定数１を代入する（ＳＴ２０６）。
【００５６】
次に、コスト計測部１０４は、トータルの解析コストであるＣ＿ｔｏｔａｌにＳＴ２０６で計測した解析コストＣを加算する（ＳＴ２０７）。
【００５７】
次に、コスト計測部１０４は、今回参照された参照変数を人間により記憶されているものとするために、参照変数をキュー１０５に代入する（ＳＴ２０８）。
【００５８】
一方、ＳＴ２０５において、ＳＴ２０１において実行されたステップの参照変数がキュー１０５内に存在しない場合には、この参照変数は人間が記憶できていないと考えられる。よって、コスト計測部１０４は、バックトレースに要するコストを解析コストにする。
【００５９】
具体的には、コスト計測部１０４は、変数記憶部１０６の実行された参照変数の最終参照ステップ数１０８および最終代入ステップ数１０９を参照し、大きいステップ数のものを抽出する。つまり、コスト計測部１０４は、この変数に対して最後に処理がなされたステップ数を抽出する。
【００６０】
次に、コスト計測部１０４は、抽出したステップ数１０８、１０９と入力された参照変数の実行ステップ数と距離（差分）Ｌを計算する（ＳＴ２０９）。次に、コスト計測部１０４は、計算した距離Ｌに所定の定数２を乗算することにより解析コストＣを求める（ＳＴ２１０）。
【００６１】
このようにして、参照変数のバックトレースにかかるコストを容易に計算できる。
【００６２】
次に、コスト計測部１０４は、トータルの解析コストであるＣ＿ｔｏｔａｌにＳＴ２１０で計測した解析コストＣを加算し（ＳＴ２０７）、さらに今回参照された参照変数を人間により記憶されているものとするために、この参照変数をキュー１０５に挿入する（ＳＴ２０８）。
【００６３】
そして、コスト計測部１０４は、プログラムすべてに対してＳＴ２０４〜ＳＴ２１０の処理を行う（ＳＴ２１１）。
【００６４】
このように、参照変数の参照関係に関わらず、解析コストを定量的に求めることができる。
【００６５】
一方、ＳＴ２０２において実行されたステップに代入変数がある場合は、コスト計測部１０４は、代入変数に関する解析コスト計測処理に移行する（ＳＴ２１２）。
【００６６】
まず、コスト計測部１０４は、トータルの解析コストであるＣ＿ｔｏｔａｌ、に、代入変数に対する解析コストである定数３を加算する（ＳＴ２１３）。
【００６７】
次に、コスト計測部１０４は、今回処理された代入変数を人間により記憶されているものとするために、この代入変数をキュー１０５に代入する（ＳＴ２１４）。
【００６８】
これにより、後段のステップでこの代入変数が参照された場合にも、この代入変数の参照関係に関わらず解析コストを定量的に計算できる。
【００６９】
そして、コスト計測部１０４は、プログラムすべてに対してＳＴ２１２〜ＳＴ２１４の処理を行う（ＳＴ２１５）。
【００７０】
このようにして、代入変数に対する解析コストを計算する。
【００７１】
次に、コスト計測部１０４は、Ｃ＿ｔｏｔａｌをプログラムに含まれるステップ数で割ることで正規化する、これをプログラムの解析コストとして、結果出力部１１０に出力する（ＳＴ２１６）。
【００７２】
このように解析コストを正規化することにより、１ステップあたりの解析コストを計算でき、プログラムのサイズにかかわらずコストを計測できる。
【００７３】
なお、ＳＴ２１６を省略することにより、プログラムの大きさを解析コストに反映させる形態であっても良い。
【００７４】
次に、プログラム解析コスト計測装置１００が、プログラム１０１のコストを計測する処理について図３〜図１１を用いて具体的に説明する。図３〜図１１は、実施の形態１にかかるプログラム解析コスト計測装置１００の動作を説明するための図である。
【００７５】
まず、コスト計測部１０４は、図３に示すように、プログラム１０１の一番上のステップを参照する。このステップは、変数ｘに１を代入する処理であるので、コスト計測部１０４は、解析コストを代入変数に対する解析コストの値である定数ａとする。
【００７６】
次に、コスト計測部１０４は、図３に示すように、変数ｘを記憶されている変数とするために、キュー１０５に代入する。
【００７７】
次に、コスト計測部１０４は、図４に示すように、プログラム１０１の次のステップを参照する。このステップは、変数ｙに１０を代入する処理であるので、コスト計測部１０４は、解析コストを定数ａとする。
【００７８】
次に、コスト計測部１０４は、図４に示すように、変数ｙを記憶されている変数とするために、キュー１０５に代入する。これに伴って、変数ｘはキュー１０５の後段にずれる。
【００７９】
次に、コスト計測部１０４は、図５に示すように、プログラム１０１の次のステップを参照する。このステップは、変数ｚに１０５を代入する処理であるので、コスト計測部１０４は、解析コストを定数ａとする。
【００８０】
次に、コスト計測部１０４は、図５に示すように、変数ｚを記憶されている変数とするために、キュー１０５に代入する。これに伴って、変数ｙはキュー１０５の後段にずれる。
【００８１】
次に、コスト計測部１０４は、図６に示すように、プログラム１０１の次のステップを参照する。このステップは、変数に対する処理でないので、コスト計測部１０４は、解析コストを０とする。
【００８２】
次に、コスト計測部１０４は、人間がステップをひとつ解析することによりひとつの変数を忘れるものと仮定して、図６に示すように、キュー１０５内の情報をひとつずつ後段にシフトする。これに伴って、変数ｘはキュー１０５から外に出る。つまり、変数ｘは人間が記憶していない変数ということになる。
【００８３】
次の数ステップは、変数に対する処理でないので、コスト計測部１０４は、解析コストを０とし、キュー１０５内の情報をひとつずつ後段にシフトし、キュー１０には、何も格納されていない状態になる。
【００８４】
次に、コスト計測部１０４は、図７に示すように、プログラム１０１のｆｏｒ文の条件に関するステップを参照する。このステップは、変数ｉに０を代入しているので、コスト計測部１０４は、解析コストを定数ａとする。
【００８５】
次に、コスト計測部１０４は、図７に示すように、変数ｉを記憶されている変数とするために、キュー１０５に代入する。
【００８６】
さらに、次のステップで、変数ｉが５以下であるか参照しているので、コスト計測部１０４は、キュー１０５を参照し、変数ｉがキュー１０５に格納されているか否か判断する。この場合は、変数ｉはキュー１０５に格納されているので、解析コストとして、変数のキュー内参照に関する解析コストである定数ｂを解析コストに加算する。そして、コスト計測部１０４は、変数ｉを記憶されている変数とするために、キュー１０５に代入する。
【００８７】
次に、コスト計測部１０４は、ｉ＝＋＋の解析コストの計算をするが詳細な説明は省略する。
【００８８】
このようにして、ｆｏｒ文内の条件に関する解析コストを計算する。
【００８９】
次に、コスト計測部１０４は、プログラム１０１の以降のステップを参照する。これらステップは、変数に対する処理でないので、コスト計測部１０４は、解析コストを０とし、キュー１０５内の情報をひとつずつ後段にシフトする。この結果、キュー１０５は、図８に示すような状態になる。
【００９０】
次のステップで、変数ｉが参照されているので、コスト計測部１０４は、キュー１０５を参照し、変数ｉがキュー１０５に格納されているか否か判断する。この場合は、図８に示すように変数ｉがキュー１０５に格納されていないので、解析コストを参照変数のキュー外参照の解析コストであるｃ（ｐ、ｉ）とする。
【００９１】
ｃ（ｐ、ｘ）は、変数ｉが最後に処理された最終参照ステップ数１０８と、現在のステップ数との差分に定数を乗算したものである。
【００９２】
次に、コスト計測部１０４は、変数ｉを記憶されている変数とするために、キュー１０５に代入する。
【００９３】
さらに、次に、変数ｘが参照されているので、コスト計測部１０４は、キュー１０５を参照し、変数ｘがキュー１０５に格納されているか否か判断する。この場合は、変数ｘがキュー１０５に格納されていないので、解析コストを参照変数のキュー外参照の解析コストであるｃ（ｐ、ｘ）とする。
【００９４】
ｃ（ｐ、ｘ）は、変数ｘを最後に処理した最終代入ステップ数１０９と、現在のステップ数との差分に定数を乗算したものである。
【００９５】
次に、コスト計測部１０４は、変数ｘを記憶されている変数とするために、キュー１０５に代入する。
【００９６】
さらに、次に、変数ｙが参照されているので、コスト計測部１０４は、キュー１０５を参照し、変数ｙがキュー１０５に格納されているか否か判断する。この場合は、変数ｙがキュー１０５に格納されていないので、解析コストを参照変数のキュー外参照の解析コストであるｃ（ｐ、ｙ）とする。
【００９７】
ｃ（ｐ、ｙ）は、変数ｙを最後に処理した最終代入ステップ数１０９と、現在のステップ数との差分に定数を乗算したものである。
【００９８】
次に、コスト計測部１０４は、変数ｙを記憶されている変数とするために、キュー１０５に代入する。
【００９９】
さらに、次に、変数ｆに値が代入されているので、コスト計測部１０４は、解析コストを代入変数の解析コストであるａとする。
【０１００】
次に、コスト計測部１０４は、変数ｆを記憶されている変数とするために、キュー１０５に代入する。
【０１０１】
そして、キュー１０５は、図９に示すようになる。
【０１０２】
次の数ステップは、変数に対する処理でないので、コスト計測部１０４は、解析コストを０とし、キュー１０５内の情報をひとつずつ後段にシフトし、キュー１０は、図１０に示すような状態になる。
【０１０３】
次のステップで、変数ｚが参照されているので、コスト計測部１０４は、キュー１０５を参照し、変数ｚがキュー１０５に格納されているか否か判断する。この場合は、図１０に示すように変数ｚがキュー１０５に格納されていないので、解析コストを参照変数のキュー外参照の解析コストであるｃ（ｐ、ｚ）とする。
【０１０４】
ｃ（ｐ、ｚ）は、変数ｚを最後に処理した最終代入ステップ数１０９と、現在のステップ数との差分に定数を乗算したものである。
【０１０５】
次に、コスト計測部１０４は、変数ｚを記憶されている変数とするために、キュー１０５に代入する。
【０１０６】
さらに、次に、変数ｓｕｍが参照されているので、コスト計測部１０４は、キュー１０５を参照し、変数ｓｕｍがキュー１０５に格納されているか否か判断する。この場合は、変数ｓｕｍがキュー１０５に格納されていないので、解析コストを参照変数のキュー外参照の解析コストであるｃ（ｐ、ｓｕｍ）とする。
【０１０７】
ｃ（ｐ、ｓｕｍ）は、変数ｓｕｍを最後に処理した最終参照ステップ１０８もしくは最終代入ステップ数１０９と、現在のステップ数との差分に定数を乗算したものである。
【０１０８】
次に、コスト計測部１０４は、変数ｓｕｍを記憶されている変数として、キュー１０５に代入する。
【０１０９】
さらに、次に、変数ｚに値が代入されているので、コスト計測部１０４は、解析コストを代入変数の解析コストであるａとする。
【０１１０】
次に、コスト計測部１０４は、変数ｚを記憶されている変数として、キュー１０５に代入する。そして、キュー１０５は、図１１に示すようになる。
【０１１１】
このように、プログラム解析コスト計測装置１００は、キュー１０５を用いることで、プログラム１０１中の変数の参照関係に関わらず、解析コストを人間の記憶を考慮に入れて、正確にかつ定量的に計算することができる。
【０１１２】
以上説明したように、実施の形態１によれば、プログラムの動作をトレースし、トレースにおいて参照が発生した参照変数に対する解析コストを参照変数が現在の参照されている実行ステップ数と前回に処理された実行ステップ数との距離に基づいて計測し、計測した参照変数の解析コストに基づいてプログラムの解析コストを計測するようにできる。このように、プログラムをトレースし、トレース結果を用いてプログラムの解析コストを計測することにより、プログラムの処理フローを考慮したプログラムの解析コストを計測することができる。
【０１１３】
また、実施の形態１によれば、キュー１０５に格納されている変数を、人間が記憶できている変数とすることにより、参照されている変数がキュー１０５に格納されているか否かにより解析コストを変えることにより、解析コストを人間の記憶能力に対応したものにできる。
【０１１４】
なお、実施の形態１の例では、プログラムの入力（関数の引数）がないばあいについて説明したが、プログラムが引数をもち、引数に応じてプログラムの動作が変化することもある。このような場合には、入力パターンとして複数の引数の組み合わせを準備し、入力パターン毎にプログラム解析コストを計測し、計測した複数の解析コストの平均、最大値、最小値などをプログラムの解析コストを計測するようにしても良い。
【０１１５】
このように複数の入力パターンを用いて解析コストを計算することにより、入力パターンによりプログラムの解析結果が変わる場合でも、入力パターンの依存度を少なくすることができる。
【０１１６】
なお、実施の形態１のプログラムトレース部１０３およびコスト計測部１０４の動作をプログラムにし記憶媒体に格納し、汎用のコンピュータに実行させる形態であっても良い。
【０１１７】
また、実施の形態１では、プログラム解析コスト計測装置を説明したが、本発明は、プログラム解析コスト計測装置が計測した解析コストを元にプログラムの評価をするプログラム評価装置や、計測した解析コストを元にプログラムの難読化をするプログラム難読化装置に適応した形態であっても良い。
【０１１８】
（実施の形態２）
本発明の実施の形態２は、プログラムを、プログラムの実行順に並べ変え、かつ変数が実行順に出力されるファイルに変換してからトレースするようにしたものである。
【０１１９】
以下、実施の形態２にかかるプログラム解析コスト計測装置について説明する。まず、実施の形態２にかかるプログラム解析コスト計測装置の構成について図１２を用いて説明する。図１２は、実施の形態２にかかるプログラム解析コスト計測装置のブロック図である。なお、既に説明した部分には同一の符号を付与し、詳細な説明を省略する。
【０１２０】
実施の形態２にかかるプログラム解析コスト計測装置１１００は、変換部１１０１を有するところが、実施の形態１と大きく異なる点である。
【０１２１】
変換部１１０１は、プログラム１０１に含まれる参照変数および代入変数をプログラム１０１の実行順にばらばらに記述するように変換する。これにより、コスト計測部１０４が、プログラム１０１に含まれる参照変数および代入変数を実行順に容易に抽出できるようになり、処理が簡単になる。
【０１２２】
次に、実施の形態２にかかるプログラム解析コスト計測装置１１００の解析コスト計測処理について、図１３を用いて詳細に説明する。図１３は、実施の形態２にかかるプログラム解析コスト計測装置の解析コスト計測処理を説明するための図である。
【０１２３】
まず、変換部１１０１がソースプログラム１３００を入力する。次に、変換部１１０１は、汎用のコンパイラファイルであるｊａｖａｃを用いてソースプログラム１３００をクラスファイル化する（ＳＴ１３０１）。
【０１２４】
なお、ソースプログラム１３００をクラスファイル化するコンパイラファイルはｊａｖａｃ以外であっても構わない。
【０１２５】
次に、変換部１１０１は、汎用のコンパイラファイルであるＤ−ｊａｖａを用いて、ＳＴ１３０１でクラスファイル化したプログラムをアセンブラファイル化したプログラム（ｊａｓｍｉｎ）に変換する（ＳＴ１３０２）。
【０１２６】
なお、クラスファイルをアセンブラファイル化するコンパイラファイルはＤ−ｊａｖａ以外であっても構わない。
【０１２７】
このように、プログラムを一度アセンブラファイル化することにより、コメントなどの余分な記述を削除でき、実行コードからなるファイルを生成できる。また、プログラムをアセンブラファイル化することにより、実行コードを実行順に記述したものにできる。この結果、プログラムに、参照変数および代入変数が実行順に記述されるので、プログラムトレース部１０３が構文解析をする必要がなくなる。また、プログラムのアセンブラファイル化に汎用のコンパイラファイルを使用しているので容易にアセンブラファイル化できる。
【０１２８】
次に、変換部１１０１は、ＳＴ１３０３においてアセンブラファイル化したプログラムを参照し、変数の参照や代入がある部分を抽出し、変数の参照や代入がある部分に変数の参照や代入があることを示すシンボルを出力する出力コード（ｔｒａｃｅｒ）を付加し（ａｄｄｔｒａｃｅ）、ｔｒａｃｅｒ付きｊａｓｍｉｎファイルを作成する。（ＳＴ１３０３）。
【０１２９】
そして、次に、変換部１１０１は、ＳＴ１３０３において変換したｔｒａｃｅｒ付きｊａｓｍｉｎファイルを、汎用のコンパイラファイルであるｊａｓｍｉｎを用いてクラスファイル（ｊａｖａクラス）化する（ＳＴ１３０４）。
【０１３０】
なお、アセンブラファイルをクラスファイル化するコンパイラファイルはｊａｓｍｉｎ以外であっても構わない。
【０１３１】
このようにして、変換部１１０１は、図中１３０１に示す出力コードが記述されたｊａｖａクラスファイル１３０２を生成する。この出力コードは、変数の参照や代入があったことを出力するコードである。
【０１３２】
次に、プログラムトレース部１０３が、ＳＴ１３０４で変換したクラスファイル１３０２を実行し、図中１３０４に示すファイルに変換する。
【０１３３】
次に、プログラムトレース部１０３が、ファイル１３０４をトレースしてコスト計測部１０４に出力する（Ｓ１３０５）。
【０１３４】
ファイル１３０４には、図中１３０３に示すように、変数の参照や代入がある場所に、参照もしくは代入された変数が記述されている。
【０１３５】
これにより、プログラムトレース部１０３は、ファイル１３０４を構文解析することなく、トレースすることにより、変数の代入および参照があった部分をプログラムの実行順に出力できる。
【０１３６】
そして、コスト計測部１０４が、プログラムトレース部１０３が出力した情報を受信し、図２に示すＳＴ２０１〜ＳＴ２１６を実行することにより、プログラム解析コストを計測する（ＳＴ１３０６）。
【０１３７】
このように、コスト計測部１０４には、プログラムの実行順に変数の代入および参照があったという情報が入力されるので、コスト計測部１０４は容易に解析コスト計測ができる。
【０１３８】
以上説明したように実施の形態２によれば、プログラムを、変数が実行順に出力されるファイルに変換してからプログラム解析コストの計測を行える。これにより、プログラム中の変数の実行順を容易に把握でき、変数に関する解析コストの計測を高速化することができる。
【０１３９】
また、実施の形態２によれば、プログラムを汎用のコンパイラファイルを用いて上述したように変換できるので、特別な手段を設けることなく、かつ簡単にプログラムの変換ができる。
【０１４０】
なお、変換部１１０１の処理をプログラムにし記憶媒体に格納し、コンピュータに行わせる形態であっても良い。
【０１４１】
【発明の効果】
以上説明したように、本発明によれば、プログラムの動作をトレースし、現在変数の参照が発生した実行ステップと、この参照されている変数が前回に処理された実行ステップ間のステップ数に基づいてプログラムの解析コストを計測するようにすることにより、プログラムの処理フローを考慮したプログラムの解析コストを計測することができる。
【図面の簡単な説明】
【図１】本発明の実施の形態１にかかるプログラム解析コスト計測装置のブロック図
【図２】実施の形態１にかかるプログラム解析コスト計測装置のプログラム解析フロー図
【図３】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第１の図
【図４】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第２の図
【図５】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第３の図
【図６】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第４の図
【図７】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第５の図
【図８】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第６の図
【図９】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第７の図
【図１０】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第８の図
【図１１】実施の形態１にかかるプログラム解析コスト計測装置の動作を説明するための第９の図
【図１２】本発明の実施の形態２にかかるプログラム解析コスト計測装置のブロック図
【図１３】実施の形態２にかかるプログラム解析コスト計測装置の解析コスト計測処理を説明するための図
【符号の説明】
１００、１１００  プログラム解析コスト計測装置
１０２  プログラム格納部
１０３  プログラムトレース部
１０４  コスト計測部
１０５  キュー
１０６  変数記憶部
１１０  結果出力部
１１０１  変換部
【図１】
2004272814.tif 000003
【図２】
2004272814.tif 000004
【図３】
2004272814.tif 000005
【図４】
2004272814.tif 000006
【図５】
2004272814.tif 000007
【図６】
2004272814.tif 000008
【図７】
2004272814.tif 000009
【図８】
2004272814.tif 000010
【図９】
2004272814.tif 000011
【図１０】
2004272814.tif 000012
【図１１】
2004272814.tif 000013
【図１２】
2004272814.tif 000014
【図１３】
2004272814.tif 000015