(57)【要約】【課題】プログラムのマシン命令レベルのダイナミックステップ数を、実行負荷を極端に高めることなく、最適化に左右されないで正確に計測する。【解決手段】ソースコード１１３をコンパイルして実行可能プログラム１１４を生成する際、オブジェクトコードの内部表現である擬似オブジェクトコードにて、最適化の最小単位となる基本ブロックに含まれる命令数をダイナミックステップ計測用のカウンタに加算する命令を生成し、生成した命令を基本ブロックの中に埋め込む機能を備えたコンパイラ１０４を用い、コンパイル１０４により生成した実行可能プログラム１１４を実行することで、実行時の条件に応じたダイナミックステップ数を計測し、計測した数をダイナミックステップ情報として補助記憶装置へ出力し、ダイナミックステップ表示部１１１により出力装置１１６へ表示する。【選択図】図２
2011103026.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードをコンパイルして生成するプログラムを実行するときにマシン命令レベルの実行命令数を計測する計算機システムにおける実行命令数計測方法において、
前記計算機システムの記憶部は、前記ソースコードと、前記コンパイルを行うコンパイラとを記憶しており、
前記計算機システムの制御部は、
前記コンパイラにより前記ソースコードをコンパイルしてオブジェクトコードの内部表現である擬似オブジェクトコードを生成するステップと、
前記擬似オブジェクトコードに含まれる命令を参照し、分岐も合流も含まない逐次的な命令列である基本ブロックに前記擬似オブジェクトコードを分割するステップと、
プログラムを実行する際に、前記基本ブロックに含まれる命令が実行されるときの命令数をカウンタに加算する加算命令を、前記基本ブロックに埋込むステップと、
プログラムを実行して前記加算命令が実行されたことにより、前記基本ブロックの前記命令数に基づいて前記実行命令数を表示部に表示させるステップと、を実行する
ことを特徴とする実行命令数計測方法。
【請求項２】
前記制御部は、
前記実行命令数としてのダイナミックステップ数を、（１）前記ソースコードに使用される関数若しくは手続き単位、（２）前記基本ブロック単位又は（３）前記ソースコードの行単位、のいずれかで前記表示部に表示させる
ことを特徴とする請求項１に記載の実行命令数計測方法。
【請求項３】
ソースコードをコンパイルして生成するプログラムを実行するときにマシン命令レベルの実行クロック数を計測する計算機システムにおける実行クロック数計測方法において、
前記計算機システムの記憶部は、前記ソースコードと、前記コンパイルを行うコンパイラとを記憶しており、
前記計算機システムの制御部は、
前記コンパイラにより前記ソースコードをコンパイルしてオブジェクトコードの内部表現である擬似オブジェクトコードを生成するステップと、
前記擬似オブジェクトコードに含まれる命令を参照し、分岐も合流も含まない逐次的な命令列である基本ブロックに前記擬似オブジェクトコードを分割するステップと、
プログラムを実行する際に、前記基本ブロックに含まれる命令を実行するのに必要となるクロック数をレジスタの依存関係に基づいて推定するステップと、
該推定した推定クロック数をカウンタに加算する加算命令を前記基本ブロックに埋込むステップと、
プログラムを実行して前記加算命令が実行されたことにより、前記基本ブロックの前記推定クロック数に基づいて前記実行クロック数を表示部に表示させるステップと、
を実行することを特徴とする実行クロック数計測方法。
【請求項４】
前記制御部は、
前記コンパイラによる最適化を行う前の前記推定クロック数と、前記最適化を行った後の前記推定クロック数との差分を前記カウンタに加算するクロック数差分加算命令を、前記基本ブロックに埋込むステップと、
プログラムを実行して前記クロック数差分加算命令が実行されたことにより、前記基本ブロックの前記差分に基づいて前記実行クロック数を前記表示部に表示させるステップと、を実行する
ことを特徴とする請求項３に記載の実行クロック数計測方法。
【請求項５】
ソースコードをコンパイルして生成するプログラムを実行するときにマシン命令レベルの実行命令数を計測する計算機システムにおいて、
前記ソースコードと、前記コンパイルを行うコンパイラとを記憶する記憶部を備え、
前記コンパイラにより前記ソースコードをコンパイルしてオブジェクトコードの内部表現である擬似オブジェクトコードを生成する制御と、
前記擬似オブジェクトコードに含まれる命令を参照し、分岐も合流も含まない逐次的な命令列である基本ブロックに前記擬似オブジェクトコードを分割する制御と、
プログラムを実行する際に、前記基本ブロックに含まれる命令が実行されるときの命令数をカウンタに加算する加算命令を、前記基本ブロックに埋込む制御と、
プログラムを実行して前記加算命令が実行されたことにより、前記基本ブロックの前記命令数に基づいて前記実行命令数を表示部に表示させる制御と、を実行する制御部を備える
ことを特徴とする計算機システム。
【請求項６】
ソースコードをコンパイルして生成するプログラムを実行するときにマシン命令レベルの実行クロック数を計測する計算機システムにおいて、
前記ソースコードと、前記コンパイルを行うコンパイラとを記憶する記憶部を備え、
前記計算機システムの制御部は、
前記コンパイラにより前記ソースコードをコンパイルしてオブジェクトコードの内部表現である擬似オブジェクトコードを生成する制御と、
前記擬似オブジェクトコードに含まれる命令を参照して、分岐も合流も含まない逐次的な命令列である基本ブロックに前記擬似オブジェクトコードを分割する制御と、
プログラムを実行する際に、前記基本ブロックに含まれる命令を実行するのに必要となるクロック数をレジスタの依存関係に基づいて推定する制御と、
該推定した推定クロック数をカウンタに加算する加算命令を前記基本ブロックに埋込む制御と、
プログラムを実行して前記加算命令が実行されたことにより、前記基本ブロックの前記推定クロック数に基づいて前記実行クロック数を表示部に表示させる制御と、を実行する制御部を備える
ことを特徴とする計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機システムにおいて、プログラムの実行時にどれだけのマシン命令数が実行されたかを表すダイナミックステップ数を計測する技術に関するものである。
【背景技術】
【０００２】
計算機システムにおけるプログラムの性能を評価する指標としてダイナミックステップ数がある。ダイナミックステップ数とは、プログラムの実行時にどれだけの処理（マシン命令数）が実行されたかを示す値である。なお、ダイナミックステップ数とは対照的に、前記指標としてスタティックなステップ数という値も存在する。
【０００３】
プログラムの総ステップ数を表すスタティックなステップ数はプログラムの実行前に決定する値であるため、ソースコードやコンパイル後のプログラムを静的に解析することで容易に取得できる。これに対し、ダイナミックステップ数はプログラムの実行時の条件により変化する実行パスのステップ数を計測する必要があるため、スタティックなステップ数を得ることに比べると困難である。
【０００４】
従来から、ダイナミックステップ数を計測するときには、主に、ソースコードレベルで計測する方法と、マシン命令レベルで計測する方法とが存在する。
例えば、高級言語のソースコードレベルでダイナミックステップ数を計測するために、デバッガやテストツールを用いて各行が実行されたかを調べる方法がある。この方法では、読み込んだソースコードの各行に対してその行が何回実行されたかを示すカウンタを割り当てておき、その状態でプログラムを実行することで、ダイナミックステップ数の計測が可能となる。
【０００５】
また、マシン命令レベルのダイナミックステップ数を計測する方法としては、ＯＳ（Operating System）の割り込み機能を利用して、オブジェクトプログラムのマシン命令１つ１つが実行されるたびにカウンタを加算する方法がある。この方法では、生成される命令１つ１つが実行されるたびに、ＯＳによる割り込みを発生させ、発生した割り込みを処理する割り込みハンドラによりダイナミックステップ数のカウンタを加算する。これにより、プログラムの実行終了時にダイナミックステップ数が得られる。
【０００６】
なお、特許文献１には、ソースコード対実行ステップ数対応データベースを保持することで、入力ソースコードに対応するプロセッサの実行ステップ数を計測する技術が開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−２７３１７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
例えば高級言語のソースコードレベルのダイナミックステップ数をデバッガやテストツールによる方法で計測したとしても、実際にどれだけの命令がＣＰＵ（Central Processing Unit）により実行されたか否かはアーキテクチャに依存して異なるため、正確な性能値を求めることができない。特許文献１の方法でもマシン命令レベルの測定はできるが、予測値のため誤差があったり、最適化の影響を受ける可能性があったりという問題がある。
また、ソースコードに対応した計測では、コンパイラが最適化を行なった際にマシン命令の順序を入れ替える可能性があるため、例えば繰り返し処理内の命令が最適化により繰り返し処理の外へ移動された場合、誤ったステップ数が計測されてしまうという問題がある。
【０００９】
一方、マシン命令レベルのダイナミックステップ数を計測する際に、ＯＳの割り込み機能を利用する方法では、１つ１つのマシン命令に対してダイナミックステップ数が計測されるため、コンパイラによる最適化の影響を受けずにマシン命令レベルの計測値を得ることができる。
しかしながら、この方法ではマシン命令毎に加算処理が生じてしまい、ダイナミックステップ数計測時の実行負荷が大きくなるため、実運用環境で計測するのには適さない。
【００１０】
本発明は前記事情を鑑みて、プログラムの実行負荷を抑えつつも、プログラムのマシン命令レベルのダイナミックステップ数を正確に計測することを目的とする。
【課題を解決するための手段】
【００１１】
前記目的を達成するために、本発明の計算機システムは、
ソースコードをコンパイルして実行可能プログラムを生成する手段として、
ソースコードを入力し、字句解析、構文解析、及び意味解析の処理を行う機能を備え、
ソースコードの解析結果から、コンパイラにおけるオブジェクトコードの内部表現である擬似オブジェクトコードを生成する機能を備え、
擬似オブジェクトコードを解析することでプログラムの実行効率を向上する最適化処理を行なった後で、基本ブロック毎の擬似オブジェクトコードに含まれる命令数をダイナミックステップ数計測用のカウンタに加算する命令を生成し、基本ブロックの擬似オブジェクトコードの中に生成した命令を埋め込む機能を備え、
擬似オブジェクトコードから、実行可能プログラムを生成する機能を備える。
【００１２】
また、前記コンパイラを用い、ソースコードをコンパイルして生成された実行可能プログラムを実行することでプログラムのダイナミックステップ数を計測し、
計測したダイナミックステップ数をダイナミックステップ情報として、例えば実行可能プログラムが利用するランタイムライブラリが備えるダイナミックステップ情報出力機能により補助記憶装置へ出力する。
補助記憶装置へ出力されたダイナミックステップ情報は、ダイナミックステップ情報表示装置により出力装置へ表示する。
詳細は後記する。
【発明の効果】
【００１３】
本発明によれば、プログラムの実行負荷を抑えつつも、プログラムのマシン命令レベルのダイナミックステップ数を正確に計測することができる。
【図面の簡単な説明】
【００１４】
【図１】本実施形態におけるハードウェア構成を示す図である。
【図２】本実施形態における全体のデータの流れを表すシステムの構成の概要図である。
【図３】本実施形態におけるコンパイル時のデータの流れを表すシステム構成図である。
【図４】本実施形態における実行時のデータの流れを表すシステム構成図である。
【図５】基本ブロック抽出処理のフロー図である。
【図６】ダイナミックステップ数をカウントする命令の埋込み処理のフロー図である。
【図７】基本ブロック内の命令をＣＰＵが実行するために要するクロック数の推定フロー図である。
【図８】コンパイラの入力データとなるソースコードの例である。
【図９】コンパイラが内部で生成する擬似オブジェクトコードの例である。
【図１０】コンパイラが内部で生成する基本ブロック管理テーブルの例である。
【図１１】ダイナミックステップ数のカウント命令が埋込まれた後の擬似オブジェクトコードの例である。
【図１２】各命令の実行に必要なクロック数を表したテーブルである。
【図１３】スケジューリング前のある基本ブロック内の命令列の例を表した図である。
【図１４】スケジューリング後の基本ブロック内の命令列の例を表した図である。
【図１５】関数単位のダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。
【図１６】基本ブロック単位のダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。
【図１７】ソースコードに関連付けたダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。
【発明を実施するための形態】
【００１５】
以下、本発明の実施の形態（以下、「実施形態」という）を、図面を用いて説明する。
図１は、本実施形態におけるハードウェア構成を示す図である。
本実施形態のハードウェア構成は、主にＣＰＵ（制御部）１０２と主記憶装置（記憶部）１０３からなる計算機システム１０１と、データ（ソースコード１１３、実行可能プログラム１１４、ダイナミックステップ情報１１５を含む。）を保存しておく補助記憶装置（記憶部）１１２、ＣＰＵ１０２による実行結果を例えば画面に表示する出力装置（表示部）１１６を含む。
【００１６】
図１に示すように、主記憶装置１０３には、コンパイラ１０４やダイナミックステップ表示部１１１、またコンパイラ１０４がコンパイル処理をするなかで参照及び書込みを行う擬似オブジェクトコード１０９や基本ブロック管理テーブル１１０、といったソフトウェアが読み込まれている。ＣＰＵ１０２は、前記した又は後記するソフトウェアを読み出し、計算機システム１０２が備える記憶領域（不図示）に所定の演算処理を実行することにより、ソフトウェアとハードウェアとの協働関係が実現される。コンパイラ１０４は、字句／構文／意味解析部１０５、擬似オブジェクト生成部１０６、命令レベル最適化部１０７及びオブジェクトプログラム生成部１０８といったソフトウェア（処理部）を含む。
【００１７】
また、補助記憶装置１１２には、コンパイラ１０４に入力されるソースコード１１３や、コンパイラ１０４によるコンパイルの結果生成される実行可能プログラム１１４、実行可能プログラム１１４を実行することにより出力されたダイナミックステップ情報１１５が記憶されている。
【００１８】
図２は、本実施形態における全体のデータの流れを表すシステム構成の概要図である。
まず、コンパイラ１０４がソースコード１１３をコンパイルする。コンパイルすることにより、実行可能生成プログラム１１４が生成される。
【００１９】
コンパイルにより生成された実行可能プログラム１１４は、ソースコード１１３に記述された処理を実行するユーザプログラム処理部２０１と、マシン命令レベルのダイナミックステップ数（マシン命令レベルの実行命令数）を計測するダイナミックステップ計測部２０２を備える。
実行可能プログラム１１４は主記憶装置１０３に読み込まれ、ＯＳから実行に必要な資源を割り当てられることで、プログラムの実行単位である実行プロセス２０３となり、プログラムの実行がなされる。
【００２０】
実行プロセス２０３内には、前記ユーザプログラム処理部２０１と、ダイナミックステップ計測部２０２とが実行状態となっているため、ソースコード１１３に書かれた処理に加え、実行時の条件に応じたダイナミックステップ数の計測の処理を適切に実行することができる。計測したダイナミックステップ数は、ダイナミックステップ情報１１５として補助記憶装置１１２へ出力される。
【００２１】
ダイナミックステップ情報１１５は、例えば画面表示用のプログラムであるダイナミックステップ表示部１１１により出力装置１１６にて表示される。このダイナミックステップ情報１１５は、計測したダイナミックステップ数を含んでいるが、加えて出力装置１１６の表示態様に応じた値を含んでいる。例えば、図２を参照すると、出力装置１１６は、後記する基本ブロック単位で前記ダイナミックステップ数を表示しているが、この場合は、ダイナミックステップ情報１１５は、基本ブロックの識別値（例：ＢＢ０００１）を含んでいる。このような表示の表示態様についても後記する。
以降、コンパイル時と実行時に分けて、データの流れの詳細を説明する。
【００２２】
図３は、本実施形態におけるコンパイル時のデータの流れを表すシステム構成図である。コンパイラ１０４はソースコード１１３を入力とし、コンパイルを行うことで実行可能プログラム１１４を出力する。コンパイラ１０４の内部はいくつかの処理部に分かれており、各処理部が段階的にコンパイル処理を行う。コンパイラ１０４は、字句／構文／意味解析部１０５、擬似オブジェクト生成部１０６、命令レベル最適化部１０７、オブジェクトプログラム生成部１０８を備えている。
【００２３】
字句／構文／意味解析部１０５では、入力されたソースコード１１３から字句を切り出し（字句解析）、切り出した字句集合の文法的な妥当性の解析（構文解析）及び意味的な妥当性の解析（意味解析）を行う。
【００２４】
擬似オブジェクト生成部１０６では、字句／構文／意味解析部１０５によるソースコード１１３の解析結果から、コンパイラ１０４におけるオブジェクトコードの内部表現である擬似オブジェクトコード１０９を生成する。
【００２５】
命令レベル最適化部１０７では、擬似オブジェクトコード１０９を解析することでプログラムの実行効率を向上するための最適化処理を行う。この命令レベル最適化部１０７は、基本ブロック抽出部３０１、フロー解析部３０２、最適化処理部３０３、ダイナミックステップカウント命令埋込部３０４により構成されている。
【００２６】
基本ブロック抽出部３０１は、擬似オブジェクトコード１０９において最適化を行う上での最小単位となる基本ブロックを抽出し、基本ブロック管理テーブル１１０にその基本ブロックの情報を格納する。
【００２７】
フロー解析部３０２は、擬似オブジェクトコード１０９と基本ブロック管理テーブル１１０を基に、プログラムがどのような経路を通り得るか（制御フロー解析）、データがどのように伝播するか（データフロー解析）、といった解析を行う。
【００２８】
最適化処理部３０３は、フロー解析部３０２により収集した情報、つまり制御フロー解析及びデータフロー解析の解析結果を基に、プログラムの実行効率を良くするための、定数伝播、レジスタリマッピング、不要命令削除など、といった最適化処理を行う。
【００２９】
ダイナミックステップカウント命令埋込部３０４は、前記最適化処理で解析した情報（最適化後の擬似オブジェクトコードに含まれる命令の命令列）を基に、ダイナミックステップ数をカウントする命令を生成し、生成した命令を擬似オブジェクトコード１０９の所定の箇所の中に埋め込むカウント命令埋め込み処理を行う。
【００３０】
オブジェクトプログラム生成部１０８では、前記最適化処理及びダイナミックステップ数のカウント命令埋め込み処理が施された擬似オブジェクトコード１０９から、実行可能プログラム１１４の生成処理を行う。
【００３１】
実行可能プログラム１１４内には、ユーザプログラム処理部３０６（基本ブロックが定められたときのユーザプログラム処理部２０１（図２参照）に相当）とダイナミックステップ計測部３０７（基本ブロックが定められたときのダイナミックステップ計測部２０２（図２参照）に相当）が基本ブロック群３０５のそれぞれに存在している。
【００３２】
なお、コンパイラ１０４は前記のような構成に限るものではなく、例えばダイナミックステップカウント命令埋込部３０４を命令レベル最適化部１０７の内部にではなく独立した処理部にする、といった構成であっても良い。
【００３３】
ここで、図３に示す構成のうち、擬似オブジェクトコード１０９、基本ブロック抽出部３０１、基本ブロック管理テーブル１１０及びダイナミックステップカウント命令埋込部３０４について詳しく説明する。
【００３４】
前記のように、コンパイラ１０４に入力されたソースコード１１３は、字句／構文／意味解析部１０５により解析され、擬似オブジェクト生成部１０６により生成される擬似オブジェクトコード１０９として表現される。例えば、図８のソースコード８０１を入力してコンパイルしたときに生成される擬似オブジェクトコードの例を図９に示す。
【００３５】
擬似オブジェクトコードの各命令は、命令の内容を示す値が格納される命令９０２と、それぞれの命令を識別する値が格納される命令ＩＤ９０１により構成されており、場合によっては、命令同士は命令ＩＤ９０１をリンクすることにより繋がれている。擬似オブジェクトコードの段階では便宜上、分岐先を示すラベル（例：ＴＨＥＮラベル、ＥＬＳＥラベル）も１つの命令として表現される。
なお、図９はあくまでも説明上の例であり、擬似オブジェクトコードの内容及び表現方法は図９の形態に限るものではない。例えば、命令同士を繋ぐリンクを示す値（例：リンク先の命令の内容、リンク元の命令の内容）が格納されるフィールドを備えるように擬似オブジェクトコードを構成しても良い。
【００３６】
ダイナミックステップカウント命令埋込部３０４の処理は、基本ブロックを単位として行なわれる。基本ブロックとは、分岐も合流も含まない逐次的な命令列（命令が１つである場合も含む）のことであり、オブジェクトコードにおいては、ある基本ブロックの先頭行が実行されるとその基本ブロック内の命令がすべて実行される処理単位である。制御フローグラフ（CFG：Control Flow Graph）でいえば、ノードや頂点に相当する。一般的に、プログラムの制御の流れを解析して行う最適化では、基本ブロックの単位で処理が行われる。基本ブロックは、基本ブロック抽出部３０１により擬似オブジェクトコード１０９から抽出される。
【００３７】
図５は、基本ブロック抽出部３０１による基本ブロックの抽出処理を示すフロー図である。また抽出した結果は、図１０で示す基本ブロック管理テーブル１１０として主記憶装置１０３に格納される。ここで、基本ブロックの抽出とは、擬似オブジェクトコード１０９から全ての基本ブロックを取り出す（抽出する）処理であり、擬似オブジェクトコード１０９を基本ブロックに分割する処理であるとも言える。
以下、図５を参照しながら本実施形態における基本ブロックの抽出方法について説明する。
【００３８】
まず、擬似オブジェクトコード１０９から最初の命令を取り出す（ステップ５０１）。
次に、基本ブロックの情報を管理する基本ブロック管理テーブル１１０のエントリを作成し、そのエントリの開始位置に取り出した命令の命令ＩＤを入れる（ステップ５０２）。具体的には、取り出した命令の命令ＩＤ９０１に格納された値を、前記エントリに含まれる開始位置フィールド１００２に格納する。
【００３９】
次に、取り出した命令がラベル以外かどうかを判定し（ステップ５０３）、もしラベルでなければ（ステップ５０３でＹｅｓ）、その取り出した命令は、真に何らかの命令であるので、その命令をカウントすべく、基本ブロック管理テーブル１１０のエントリに含まれる命令数フィールド１００３の値（命令数）を１加算する（ステップ５０４）。一方、ラベルであった場合は（ステップ５０３でＮｏ）、命令数フィールド１００３の値は加算せずに、ステップ５０４をスキップする。
【００４０】
次に、擬似オブジェクトコード１０９に次の命令があるかどうかの判定を行い（ステップ５０５）、次の命令がある場合は（ステップ５０５でＹｅｓ）その命令を取り出し（ステップ５０６）、もしなければ（ステップ５０５でＮｏ）抽出フローの処理を終了する。
【００４１】
次の命令が存在する場合は（ステップ５０５でＹｅｓ）、次の命令が新しい基本ブロックの始まりかどうかを判定する（ステップ５０７）。取り出した命令がラベルであれば、いずれかの分岐命令から合流してくる可能性があるため、このラベルから新しい基本ブロックの始まりとなる。また、１つ前の命令が分岐命令（条件分岐命令又は無条件分岐命令）であった場合、１つ前の命令から別の命令へ分岐する可能性があるため、それまでの基本ブロックは１つ前の命令で終了となり、新しい基本ブロックの始まりと判定できる。
【００４２】
ステップ５０７の判定で真となった場合（ステップ５０７でＹｅｓ）、ステップ５０６で取り出した命令以降が新しい基本ブロックとなるため、ステップ５０２に戻って新しい基本ブロック管理テーブル１１０のエントリを作成し、以降の処理を同様に繰り返す。ステップ５０７の判定で偽となった場合は（ステップ５０７でＮｏ）、基本ブロックが継続するため、ステップ５０４に戻り、以降の処理を繰り返す。
【００４３】
以上のフローにより抽出された基本ブロックの情報は、図１０で示す基本ブロック管理テーブルのブロックＩＤフィールド１００１、命令ＩＤ９０１の値のうち基本ブロックの開始位置を示す値が格納される開始位置フィールド１００２及び基本ブロックに含まれる命令数を格納する命令数フィールド１００３に格納される。なお、ブロックＩＤ１００１に格納される値は各基本ブロックを識別する値であり、基本ブロック管理テーブル１１０の新たなエントリが作成されるたびに一意に割り当てられるものとする。推定クロック数フィールド１００４については後述する別の実施形態において説明する。
【００４４】
図３に戻り、ダイナミックステップカウント命令埋込部３０４は、擬似オブジェクトコード１０９と基本ブロック管理テーブル１１０からダイナミックステップ数をカウントする命令を生成し、生成した命令を擬似オブジェクトコード１０９の中に埋め込む処理を実行する。
【００４５】
図６は、ダイナミックステップカウント命令埋込部３０４による、ダイナミックステップ数をカウントする命令の埋込み処理のフロー図である。
まず、基本ブロック管理テーブル１１０から、最初の基本ブロックの情報が格納されているエントリを取り出す（ステップ６０１）。
【００４６】
次に、取り出した基本管理テーブル１１０のエントリから、開始位置フィールド１００２と命令数フィールド１００３の情報（開始位置、命令数）を取得し（ステップ６０２）、取得した情報から基本ブロック内の命令数をダイナミックステップカウンタに加算する命令を生成する（ステップ６０３）。
【００４７】
ステップ６０３で生成した命令は、基本ブロックの開始位置の命令がラベルであるかどうかを判定し（ステップ６０４）、以下に示すように基本ブロックの中へ埋め込まれる。つまり、基本ブロックの開始位置がラベルであった場合（ステップ６０４でＹｅｓ）、他の分岐命令からラベルに合流してくる可能性があるため、ラベルの次の位置に前記生成した命令を埋込む（ステップ６０５）。もし基本ブロックの開始位置がラベルでなかった場合は（ステップ６０４でＮｏ）、処理の先頭となるように基本ブロック開始位置の命令の前に前記生成した命令を埋込む（ステップ６０６）。ステップ６０５及びステップ６０６を経た後は、ステップ６０７に処理が進む。
【００４８】
その後、基本ブロック管理テーブルの次のエントリがあるかどうかを判定し（ステップ６０７）、もしなければ（ステップ６０７でＮｏ）ダイナミックステップ数をカウントする命令の埋め込み処理を終了する。もしあれば（ステップ６０７でＹｅｓ）、基本ブロック管理テーブルの次のエントリを取り出し（ステップ６０８）、ステップ６０２の処理に戻り、以降の処理を同様に繰り返す。
以上のフローにより、基本ブロック単位でダイナミックステップ数のカウント命令埋め込み処理を行うことができる。
【００４９】
図１１は、図９の擬似オブジェクトコードと図１０の基本ブロック管理テーブルからダイナミックステップ数のカウント命令が埋め込まれた後の擬似オブジェクトコードの例を示す図である。命令ＩＤ１１０１及び命令１１０２は、それぞれ図９の命令ＩＤ９０１及び命令９０２と同等である。
【００５０】
最初の基本ブロックの開始位置に配置されているＦＵＮＣラベル１１０３の後ろには、最初の基本ブロックの命令数をカウントする処理がａｄｄ命令（加算命令）１１０４として埋め込まれている（図６のステップ６０５の処理を参照）。
また、次の基本ブロックの始まりであった無条件分岐命令１１０６の前には、次の基本ブロックの命令数をカウントするａｄｄ命令１１０５が埋め込まれている（図６のステップ６０６の処理を参照）。
同様に、ａｄｄ命令１１０７、１１０８、１１０９が、図６のステップ６０４の判定に従って、それぞれの基本ブロックの命令数をカウントする処理として埋め込まれている。このようにして、１つの基本ブロックに１つのａｄｄ命令が埋め込まれるようにして擬似オブジェクトコードが生成される。
【００５１】
以上、擬似オブジェクトコード１０９、基本ブロック抽出部３０１、基本ブロック管理テーブル１１０及びダイナミックステップカウント命令埋込部３０４についての詳細な説明を終える。
【００５２】
以上を踏まえた上で、改めて図３の流れを説明する。
本実施形態では、コンパイラ１０４がソースコード１１３をコンパイルする過程において、まず字句／構文／意味解析部１０５及び擬似オブジェクト生成部１０６がオブジェクトコードの内部表現である擬似オブジェクトコード１０９を生成する。この擬似オブジェクトコード１０９を基に、命令レベル最適化部１０７がプログラムの実行効率を上げるための最適化処理を行う。
【００５３】
最適化処理では、分岐と合流が含まれない基本ブロックを処理単位にして解析が行われる。基本ブロック抽出部３０１により擬似オブジェクトコード１０９から基本ブロックが抽出され、抽出した基本ブロックの情報は基本ブロック管理テーブル１１０に格納される。
さらに、フロー解析部３０２により擬似オブジェクトコード１０９と基本ブロック管理テーブル１１０を基に、制御フローやデータフローの解析が行なわれた後で、最適化処理部３０３により実行効率向上のための最適化処理が施される。
【００５４】
最適化処理の後、ダイナミックステップカウント命令埋込部３０４により、ダイナミックステップ数のカウント命令埋込み処理が行われる。ダイナミックステップカウント命令埋込部３０４では、最適化の際に抽出及び解析した擬似オブジェクトコード１０９と基本ブロック管理テーブル１１０の情報を用いて基本ブロックを単位にカウント用の命令の埋込み処理が行われる。擬似オブジェクトコード１０９内の各基本ブロックに対し、それぞれに含まれる命令数をカウンタに加算する命令が生成され、基本ブロック中に埋め込まれる。
【００５５】
以上の処理を経て、オブジェクトプログラム生成部１０８により生成される実行可能プログラム１１４には、ソースコード１１３に記述された処理を実行するユーザプログラム処理部３０６と、基本ブロック内の命令数をカウントするダイナミックステップ計測部３０７が基本ブロック群３０５のそれぞれに備えられている。
【００５６】
本実施形態では、コンパイルの過程でプログラムにおける基本ブロックの情報、例えば前記のように命令数を計測する命令を生成し、基本ブロックの中に、生成した命令を埋め込むことで、実行時の動的な条件に対応して基本ブロックの情報を計測する機能を備えた実行可能プログラムを生成することができる。
また、計測の対象となる基本ブロックの情報は、マシン命令レベルの情報であるため、実際にプログラムを動作させるマシン環境での性能値を正確に得ることができる。
また、基本ブロックを単位に加算命令を埋め込むため、コンパイル時の最適化処理の影響を受けることなく計測することが可能である。
以上、本実施形態におけるコンパイル時の特徴を説明した。続いて、実行時の特徴を、図４を参照しながら説明する。
【００５７】
図４は、本実施形態における実行時のデータの流れを表すシステム構成図である。
ソースコード１１３をコンパイルして生成された実行可能プログラム１１４は、主記憶装置１０３へ読み込まれ、ＯＳから必要な資源を割り当てられることで実行プロセス２０３として実行状態になる。
【００５８】
実行プロセス２０３には、基本ブロック群４０１（実行プロセス２０３として定められたときの基本ブロック群３０５に相当）の処理とダイナミックステップ情報出力部４０２が読み込まれている。ダイナミックステップ情報出力部４０２は、例えばプログラムが実行時に利用する実行時ライブラリ（ランタイムライブラリ）により提供される。
【００５９】
基本ブロック群４０１の、ダイナミックステップ計測部３０７により計測した情報は、ダイナミックステップ情報出力部４０２によりダイナミックステップ情報１１５として補助記憶装置１１２（図１参照）へ出力される。そして、ダイナミックステップ情報１１５は、ダイナミックステップ表示部１１１により、出力装置１１６へ表示される。
【００６０】
プログラムの実行時において、どのようなパスで処理が実行されるかは、ユーザの要求や連携プログラム、環境の条件などにより異なり、実行時になってみないとわからない。そのため、プログラム中のどの基本ブロックが実行されるかという点も実行時になってみないとわからない。
本実施形態では、前記のように基本ブロックを単位としてダイナミックステップ数を計測する機能が備えられているため、分岐や繰り返しによる制御がどのような条件で行なわれても、漏れなくダイナミックステップ数をカウントすることができる。
【００６１】
なお、基本ブロック単位で計測した情報は、擬似オブジェクトコード１０９全体におけるダイナミックステップ数の合計を求めたり、高級言語における関数単位や手続き単位で集計したりすることにより、プログラムの性能解析に役立てることができる。
また、ダイナミックステップ数の計測は基本ブロック毎にまとめて行われるため、実行時の負担を大幅に高めることなく計測することが可能である。
【００６２】
図１５、図１６、図１７を参照して、出力装置１１６へ表示されたダイナミックステップ情報の例を示す。図１５は、関数単位のダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。図１６は、基本ブロック単位のダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。図１７は、ソースコードに関連付けたダイナミックステップ情報をダイナミックステップ表示装置によって出力装置の画面に出力した表示例を表した図である。
【００６３】
図１５を参照すると、［関数名］及び［ステップ数］という項目を設けて、ソースコードに使用されている関数ごとのダイナミックステップ数が表示されている。さらに、表示するダイナミックステップ情報として、ソースコード全体におけるダイナミックステップ数、つまり、前記関数に対応するダイナミックステップ数の合計も表示される。このような表示態様で表示を行う場合、ダイナミックステップ情報１１５は、ソースコードに使用される関数の関数名、その関数が実行されたときのダイナミックステップ数を含んでいる。このように関数単位で表示することも可能であり、又手続き単位で表示することも可能である。
【００６４】
図１６を参照すると、［ブロックＩＤ］、［関数名］、［行情報］及び［ステップ数］という項目を設けて、擬似オブジェクトコードに対し設定した基本ブロックごとのダイナミックステップ数が表示されている。［関数名］の欄には、各基本ブロックが含まれる関数が表示される。また、［行情報］の欄には、基本ブロックの開始位置を示すソースコードの行番号が表示される。このような表示態様で表示を行う場合、ダイナミックステップ情報１１５は、基本ブロックの識別値、ソースコードに使用される関数の関数名、ソースコードの行情報、その基本ブロック内の関数が実行されたときのダイナミックステップ数を含んでいる。
【００６５】
図１７を参照すると、行番号付きのソースコードと、基本ブロックの範囲をソースコードに対応付けたダイナミックステップ数とが表示されている。このような表示態様で表示を行う場合、ダイナミックステップ情報１１５は、ソースコードの行情報、ソースコードそのもの、そのソースコードの各行にある関数や手続きが実行されたときのダイナミックステップ数を含んでいる。なお、関数や手続きが記載されていない行については、ダイナミックステップ数は表示しない。図１７のようにソースコードの行ごとにダイナミックステップ数を表示すれば、どの命令が実行されたか容易に把握できる。
【００６６】
≪この実施形態のまとめ≫
本実施形態によれば、コンパイラで生成された実行可能プログラムは、基本ブロック単位でダイナミックステップ数を計測する機能及び計測したダイナミックステップ数を出力する機能を有するため、このプログラムを実行することで、実行時の条件に応じたマシン命令レベルのダイナミックステップ数を正確に計測することが可能となる。
また、ダイナミックステップ数をカウントする命令の埋め込み処理は、最適化における最小単位である基本ブロックを処理の対象とするため、最適化処理による命令順序の入れ替えの影響を受けることなく、性能値を正しく計測することが可能となる。
また、ダイナミックステップ数の計測処理は基本ブロック単位でまとめて行なわれるため、マシン命令毎に加算処理を行う従来技術のように実行負荷が極端に大きくなることはなく、効率良く計測することが可能となる。
【００６７】
以上、本発明の好適な実施形態の例を説明したが、本発明の実施形態は前記説明に限るものではない。以降、別の実施形態について説明する。
【００６８】
≪別の実施形態≫
図６のフローでは、基本ブロックに命令数をカウントする処理の埋め込み方法を示しているが、基本ブロックに埋め込む命令はこの限りではなく、基本ブロックの推定クロック数（マシン命令レベルの実行クロック数）をカウントする命令（加算命令）を埋め込む形態が可能である。ここで、基本ブロックの推定クロック数とは、ＣＰＵがその基本ブロックを何クロックで処理することができるかを推定した値である。この値は最適化の命令スケジューリングを行う過程で推定しているため、その値を使用する。以下、ある基本ブロックを処理するために必要なクロック数を推定する処理について説明する。
【００６９】
図７は、基本ブロック内の命令をＣＰＵが実行するために要するクロック数の推定フロー図である。
まず、基本ブロック管理テーブル１１０のエントリから基本ブロック内の最初の命令を取り出す（ステップ７０１）。
【００７０】
次に、取り出した命令の使用しているレジスタ（使用レジスタ）と、その前後の命令との使用レジスタの依存関係を調べる（ステップ７０２）。レジスタの依存関係とは、同一のレジスタを使用する命令が２以上存在し、それらの命令において、ある命令を実行するまでは他の命令の実行を待機する関係、という意味を少なくとも含む。
次に、レジスタの依存関係から、待ち時間がより小さくなるように命令をスケジューリングする（ステップ７０３）。スケジューリングの詳細は、図１２、図１３、図１４を参照して後記する。
【００７１】
ステップ７０３の後、次の命令があるかどうかを判定し（ステップ７０４）、もしあれば（ステップ７０４でＹｅｓ）、次の命令を取り出して（ステップ７０５）、ステップ７０２に戻り、以降の処理を同様に繰り返す。次の命令がなければ（ステップ７０４でＮｏ）、基本ブロック内の命令が全てスケジューリングされたことになり、スケジューリングによるスケジューリング結果から基本ブロック単位の推定クロック数を求める（ステップ７０６）。なお、求めた推定クロック数は、最適化後のものであっても良いし、最適化前のものであっても良い。
以上で、クロック数を推定するフローに関する説明を終了する。
【００７２】
前記フローによるクロック数推定の例を、図１２、図１３、図１４を参照して説明する。
図１３は、スケジューリング前のある基本ブロック内に含まれる命令列の例を表した図である。この図では、命令の種類と、その命令を実行するときに使用するレジスタの識別値（「ｒ２」等で表記）とが命令ごとに格納されている。クロック数の推定処理（図７参照）では、この命令列からレジスタの依存関係を調べて、スケジューリングを行う。
【００７３】
図１３の命令列の場合、例えば最初のＬＤ命令１３０３と、次のＭＯＶ命令１３０４との間でレジスタｒ２の使用に依存関係がある。そのため、ＭＯＶ命令１３０４の実行を開始するためには、最初のＬＤ命令１３０３の実行が終わるまで待つ必要がある。
【００７４】
レジスタ使用の依存による待ち時間は、図１２に示す、各命令の実行に必要なクロック数のテーブルを参照することで得られる。テーブル中の値は、ＣＰＵが各命令１２０１を実行するのに必要なクロック数１２０２の例を示している。一連の命令列において使用するレジスタに依存関係があった場合、前記したようにレジスタが使用可能になるまで処理に待ち時間が生じる。待ち時間は依存する命令に応じて異なり、図１２のテーブル中の値で示される各命令のクロック数１２０２で示される。
図１３のＬＤ命令１３０３の場合、実行を終えるまで２クロック必要となるため、最初のＬＤ命令１３０３と次のＭＯＶ命令１３０４の間に２クロックの待ち時間を考慮してスケジューリングする。
【００７５】
前記した手順により図１３の命令列をスケジューリングした例、つまりスケジューリング後の基本ブロック内の命令列の例を図１４（（ａ）最適化前、（ｂ）最適化後）に示す。なお、図１２、図１３及び図１４に示すテーブルは、例えば、主記憶装置１０３に記憶されている。
前記したように、最初のＬＤ命令１４０４（図１３の符号１３０３に相当）と次のＭＯＶ命令１４０５（図１３の符号１３０４に相当）との間に２クロックの待ち時間がある。同様に、ＡＤＤ命令１４０６（図１３の符号１３０６に相当）とＭＯＶ命令１４０７（図１３の符号１３０３に相当）の間にもレジスタの依存関係により１クロックの待ち時間が生じている。
【００７６】
この待ち時間を小さくするために、スケジューリングでは命令順序の入れ替えによる最適化を行う。例えば図１４のスケジューリング例の場合、ＭＯＶ命令１４０７とＳＴ命令１４０８（図１３の符号１３０７に相当）の間にはレジスタの依存関係がないため、（ｂ）に示すように、ＳＴ命令１４０８を先に実行するように順番を入れ替えることができる。
また、ＳＴ命令１４０８はＡＤＤ命令１４０６ともレジスタに依存関係がないため、ＡＤＤ命令１４０６とＭＯＶ命令１４０７の間の待ちクロック中にＳＴ命令１４０８を実行することができ、順番入れ替え前に比べると、入れ替え後では（ｂ）最適化後の例１４０９で示すように推定クロック数が１クロック分減少する。
【００７７】
このようにスケジューリングするため、この基本ブロック内の最後の命令が実行を開始するまでのクロック数として７クロックという推定値を得ることができる。よって、推定した基本ブロックの推定クロック数をカウントする命令を生成し、生成した命令をその基本ブロックに埋込むことで、実行時の推定クロック数を計測することが可能となる。なお、推定クロック数をカウントする命令の埋込みに関する処理は、例えば図６に示した処理に準拠する。また、基本ブロック管理テーブル（図１０参照）には、この推定クロック数が基本ブロックごとに、推定クロック数フィールド１００４に格納される。計測したクロック数は、例えば図１５、図１６、図１７に示した表示態様に準じて表示することができる。
【００７８】
本実施形態のクロック数の推定処理は前記実施形式に限るものではない。例えば、命令のスケジューリングとは切り離して推定することも可能である。
本実施形態では、基本ブロックに埋め込む命令として最適化効果をカウントする命令を埋め込む形態も可能である。
【００７９】
図１４の例では最適化前後で推定クロック数が１クロック減少していることがわかる。そこで、命令スケジューリングを含む最適化前後の推定クロック数の差分（マシン命令レベルの実行クロック数）をカウンタに加算する命令（クロック数差分加算命令）を生成し、生成した命令を基本ブロックの中に埋め込む。これにより、最適化による実行効率向上の効果を計測することが可能となる。なお、推定クロック数の差分をカウントする命令の埋込みに関する処理は、例えば図６に示した処理に準拠する。
【００８０】
また、推定クロック数の差分を求める処理は、例えば図７に示した処理に準拠する。この場合、ステップ７０６において、最適化前後を示したスケジューリング結果（図１４の（ａ）（ｂ）参照）を比較して前記差分を求める。また、基本ブロック管理テーブル（図１０参照）には、この推定クロック数の差分が基本ブロックごとに、所定のフィールドに（例えば、推定クロック数フィールド１００４の代用として）格納される。計測したクロック数の差分は、例えば図１５、図１６、図１７に示した表示態様に準じて表示することができる。
【００８１】
なお、本実施形態では、図２や図４に示すように、ダイナミックステップ数を表示するための方法として、ダイナミックステップ情報１１５を補助記憶装置１１２へ出力し、ダイナミックステップ表示部１１１により出力装置１１６へ表示しているが、表示のための形態はこの限りではない。例えば、ダイナミックステップ表示部１１１の機能を実行可能プログラム１１４や、実行時ライブラリに持たせることで、ダイナミックステップ情報１１５を補助記憶装置１１２へ出力することなく、直接出力装置１１６へ表示する形態が可能である。プログラムの開発の便宜を考慮して、これらの表示の形態のいずれかを採用するように設計変更することが好ましい。
【００８２】
≪その他≫
例えば、ａｄｄ命令が埋め込まれた基本ブロックの実行プロセスが実行されるときには、ａｄｄ命令自身はカウントしないようにして基本ブロックの命令数をカウントしないように設計すると良い。そのカウントをするように設計したときには、埋込んだａｄｄ命令の数をダイナミックステップ数等から減算することが好ましい。
【００８３】
基本ブロック管理テーブル（図１０参照）を構成するエントリにおいて、開始位置フィールド１００２を用いて基本ブロックの開始位置にある命令の命令ＩＤを用いる代わりに、基本ブロックの終了位置にある命令の命令ＩＤを用いるようにしても良い。または、開始位置及び終了位置の両方の命令ＩＤを用いるようにしても良い。
基本ブロックの開始位置の命令としては、例えば、手続きや関数のエントリーポイント 、ジャンプや分岐の対象、条件分岐命令の後の、分岐しなかった場合のコード、例外を発生させる命令の後のコード、例外ハンドラがあり、これらの命令ＩＤを用いるようにしても良い。
また、基本ブロックの終了位置の命令としては、例えば、無条件あるいは条件分岐命令（直接分岐も間接分岐も含む）、呼び出し元の手続きへのReturn、例外処理を発生させうる命令、復帰しない関数（例：exit関数）があり、これらの命令ＩＤを用いるようにしても良い。ただし、制御フローが基本ブロックの最後を通過することは基本的にはないため、基本ブロックの境界は、基本ブロックを見つけた後に修正しなければならない場合もある。そのための擬似オブジェクトコード等の設計変更を行うようにすると良い。
【００８４】
前記した各実施形態において説明した技術事項の一部又は全部を組み合わせた発明を実現することできるのは勿論である。
その他、ハードウェア、ソフトウェア、フローチャート、テーブル等の具体的な構成について、本発明の趣旨を逸脱しない範囲で適宜変更が可能である。
【符号の説明】
【００８５】
１０１  計算機システム
１０２  ＣＰＵ（制御部）
１０３  主記憶装置（記憶部）
１０４  コンパイラ
１０５  字句／構文／意味解析部
１０６  擬似オブジェクトコ生成部
１０７  命令レベル最適化部
１０８  オブジェクトプログラム生成部
１０９  擬似オブジェクトコード
１１０  基本ブロック管理テーブル
１１１  ダイナミックステップ表示部
１１２  補助記憶装置（記憶部）
１１３  ソースコード
１１４  実行可能プログラム
１１５  ダイナミックステップ情報
１１６  出力装置（表示部）
２０１  ユーザプログラム処理部
２０２  ダイナミックステップ計測部
２０３  実行プロセス
３０１  基本ブロック抽出部
３０２  フロー解析部
３０３  最適化処理部
３０４  ダイナミックステップカウント命令埋込部
４０２  ダイナミックステップ情報出力部
【図１】
2011103026.tif 000003
【図２】
2011103026.tif 000004
【図３】
2011103026.tif 000005
【図４】
2011103026.tif 000006
【図５】
2011103026.tif 000007
【図６】
2011103026.tif 000008
【図７】
2011103026.tif 000009
【図８】
2011103026.tif 000010
【図９】
2011103026.tif 000011
【図１０】
2011103026.tif 000012
【図１１】
2011103026.tif 000013
【図１２】
2011103026.tif 000014
【図１３】
2011103026.tif 000015
【図１４】
2011103026.tif 000016
【図１５】
2011103026.tif 000017
【図１６】
2011103026.tif 000018
【図１７】
2011103026.tif 000019