(57)【要約】【課題】  プログラムのコンパイル処理において、実行中の手続き内の変数に高頻度で与えられる値のプロファイル情報を収集し、最適化に利用する。【解決手段】  一次プロファイル処理部12は、解析処理部11で生成された中間形式データに、実行中の手続き内の変数に与えられる値で頻度が50% 以上になりうる値とその出現回数とを最大２組まで記録する処理を付加し、一次プロファイル情報31を得る。最終プロファイル処理部14は、中間形式データに、一次プロファイル情報31の２つ値の出現回数と手続きの実行回数を記録する処理を付加し、最終プロファイル情報32を得る。最適化部16は、最終プロファイル情報32をもとに変数に対し出現頻度が50% 以上の値を求め、この値に関する手続きを最適化し、目的プログラム生成部17は、目的プログラム5 を生成する。【選択図】図１
2005071135.tif 000002
【特許請求の範囲】
【請求項１】
プログラム言語で記述されたプログラムを翻訳してコンピュータが実行可能な目的プログラムを生成するコンパイル処理を、コンピュータに実行させるためのコンパイル処理プログラムにおいて、
第１回目のプログラム翻訳時に、前記プログラムの実行中に手続き内の変数に対して与えられる値と前記値が与えられる回数との組を最大２組までレコードに記録する統計処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された情報を一次プロファイル情報として出力する一次プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、
前記第１回目のプログラム実行の終了後に、出力された前記一次プロファイル情報を記憶部に記憶する処理と、
前記一次プロファイル情報を読み込み、前記一次プロファイル情報に記憶された前記値を前記レコードに設定する処理と、
第２回目のプログラム翻訳時に、前記レコードに設定された値の出現回数と前記値を変数に与える処理を含む手続きの実行回数とを前記レコードに記録する統計検証処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された前記出現回数および前記実行回数とを最終プロファイル情報として出力する最終プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、
前記第２回目のプログラム実行の終了後に、出力された前記最終プロファイル情報を記憶部に記憶する処理とを、
コンピュータに実行させる
ことを特徴とする変数の統計処理を行うコンパイル処理プログラム。
【請求項２】
さらに、前記最終プロファイル情報を読み込む処理と、
第３回目のプログラム翻訳時に、前記最終プロファイル情報から取得した前記値の出現回数と前記値を変数に与える処理を含む手続きの実行回数にもとづいて前記値の出現頻度を算出する処理と、
前記出現頻度が５０％以上である場合に、前記値により予測される動作を行う処理に最適化する処理とを、
コンピュータに実行させる
ことを特徴とする請求項１記載の変数の統計処理を行うコンパイル処理プログラム。
【請求項３】
プログラム言語で記述されたプログラムを翻訳してコンピュータが実行可能な目的プログラムを生成するコンパイル処理を、コンピュータに実行させるためのコンパイル処理プログラムを記録する記録媒体であって、
第１回目のプログラム翻訳時に、前記プログラムの実行中に手続き内の変数に対して与えられる値と前記値が与えられる回数との組を最大２組までレコードに記録する統計処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された情報を一次プロファイル情報として出力する一次プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、
前記第１回目のプログラム実行の終了後に、出力された前記一次プロファイル情報を記憶部に記憶する処理と、
前記一次プロファイル情報を読み込み、前記一次プロファイル情報に記憶された前記値を前記レコードに設定する処理と、
第２回目のプログラム翻訳時に、前記レコードに設定された値の出現回数と前記値を変数に与える処理を含む手続きの実行回数とを前記レコードに記録する統計検証処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された前記出現回数および前記実行回数とを最終プロファイル情報として出力する最終プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、
前記第２回目のプログラム実行の終了後に、出力された前記最終プロファイル情報を記憶部に記憶する処理とを、
コンピュータに実行させるプログラムを記録する
ことを特徴とする変数の統計処理を行うコンパイル処理プログラム記録媒体。
【請求項４】
プログラム言語で記述されたプログラムを翻訳してコンピュータが実行可能な目的プログラムを生成するコンパイル処理方法において、
第１回目のプログラム翻訳時に、前記プログラムの実行中に手続き内の変数に対して与えられる値と前記値が与えられる回数との組を最大２組までレコードに記録する統計処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された情報を一次プロファイル情報として出力する一次プロファイル出力処理を行う命令列とを、前記プログラムに付加し、
前記第１回目のプログラム実行の終了後に、出力された前記一次プロファイル情報を記憶部に記憶し、
前記一次プロファイル情報を読み込み、前記一次プロファイル情報に記憶された前記値を前記レコードに設定し、
第２回目のプログラム翻訳時に、前記レコードに設定された値の出現回数と前記値を変数に与える処理を含む手続きの実行回数とを前記レコードに記録する統計検証処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された前記出現回数および前記実行回数とを最終プロファイル情報として出力する最終プロファイル出力処理を行う命令列とを、前記プログラムに付加し、
前記第２回目のプログラム実行の終了後に、出力された前記最終プロファイル情報を記憶部に記憶する、
ことを特徴とする変数の統計処理を行うコンパイル処理方法。
【請求項５】
プログラム言語で記述されたプログラムを翻訳してコンピュータが実行可能な目的プログラムを生成するコンパイル処理装置において、
プロファイル情報を記憶する記憶部と、
第１回目のプログラム翻訳時に、前記プログラムの実行中に手続き内の変数に対して与えられる値と前記値が与えられる回数との組を最大２組までレコードに記録する統計処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された情報を一次プロファイル情報として出力する一次プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理手段と、
前記第１回目のプログラム実行の終了後に、出力された前記一次プロファイル情報を記憶部に記憶する処理手段と、
前記一次プロファイル情報を読み込み、前記一次プロファイル情報に記憶された前記値を前記レコードに設定する処理手段と、
第２回目のプログラム翻訳時に、前記レコードに設定された値の出現回数と前記値を変数に与える処理を含む手続きの実行回数とを前記レコードに記録する統計検証処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された前記出現回数および前記実行回数とを最終プロファイル情報として出力する最終プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理手段と、
前記第２回目のプログラム実行の終了後に、出力された前記最終プロファイル情報を記憶部に記憶する処理手段とを、備える
ことを特徴とする変数の統計処理を行うコンパイル処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム言語で記述された原始プログラムを翻訳して目的プログラムを生成するコンパイラ処理に関する。より詳しくは、本発明は、翻訳対象のプログラムの手続き中の変数に対して実行時に与えられる実際の値の統計情報を収集し、その統計情報を用いて手続きの最適化を行うコンパイラ処理に関する。
【背景技術】
【０００２】
コンピュータにおけるプログラムのコンパイル処理において、原始プログラムを翻訳し生成した目的プログラムの実行中に、その手続き中の変数に実際に与えられた値とその頻度とを統計情報（プロファイル情報）として記録し、この記録したプロファイル情報を次回以降の翻訳処理において手続きを最適化するために利用する方法がある（例えば、特許文献１参照）。
【０００３】
特許文献１「コンパイラとプログラム最適化方法およびその処理プログラムを記録した記録媒体」に記載されている手法では、各手続きのプロファイルの対象となる変数の１つ１つにプロファイルレコード( 以後単に「レコード」と呼ぶ) が用意される。そして、目的プログラムの実行時にその変数に与えられる値の種別の１つ１つに対し、値と与えられた回数との組を格納するためのレコード中のデータ構造( 以後「値リスト」と呼ぶ) を、単に複数個用意することで、実行時に得られる値を頻度の高い順に保存できるとしているが、特許文献１には、そのように作用する処理の詳細については述べられていない。
【０００４】
しかし、特許文献１に記載された説明に従う限りでは次の二通りが考えられる。
【０００５】
１）従来手法Ａ：先着順に登録
対象プログラムの手続きの実行時に、手続きが呼び出された順に変数に与えられた値を登録してゆき、値の種別がレコードの値リストの個数となった場合には、その時点以降に現れた新しい種別の値は登録しないものとする。
【０００６】
例えば、：ｓｕｂ（ｘ）という１個の引数ｘを取る手続きの入り口で変数ｘに与えられた実際の値を記録することを考える。この手続きが１０回呼び出されたときに、変数ｘに与えられた値が次のようだったとする。
【０００７】
ｘ＝｛４，４，４，７，７，１０，１０，３，６，１０｝
ここで、値リストの大きさが３であった場合に、３種類目の値“１０”が与えられた時点でレコードの全ての値リストには値が格納されているため、それ以降に出現する新しい種類の値（“３”と“６”）は登録しない。したがって、プログラムの終了時点での値リストの状態は以下のようになる。
【０００８】
｛値，回数｝＝｛４，３｝，｛７，２｝，｛１０，３｝
２）従来手法Ｂ：レコードの値リストが一杯になった時点で最小出現回数の値を切り捨て
対象プログラムの手続きの実行時に、手続きが呼び出された順に変数に与えられた値を登録してゆき、レコードの全ての値リストに値が格納されている場合に、その時点以降に新しい種別の値が現れた場合は、その時点で最も出現回数の少ない値を値リストから追い出し、新しい値を登録する。最も出現回数の少ない値が複数あった場合にはその中から適当に１つの値を選ぶ。
【０００９】
例えば、上記の例と同じ手続きが１０回呼び出されたときに、変数ｘに与えられた値が次のようだったとする。
【００１０】
ｘ＝｛４，４，４，７，７，１０，３，６，８，８｝
このとき、値リストの大きさが３であった場合に、６回目の呼び出しの時点での値リストの状態は以下のようになる。
【００１１】
｛値，回数｝＝｛４，３｝，｛７，２｝，｛１０，１｝
続いて、７回目に新しい値“３”と共に呼び出されたとき、全ての値リストはすでに値が格納されているので、この方法では最も出現回数の少ない値“１０”を値リストから追い出して、新しい値“３”を登録する。結果は以下のようになる。
【００１２】
｛値，回数｝＝｛４，３｝，｛７，２｝，｛３，１｝
さらに８回目の呼び出しでは、同様に値“３”が追い出されて代わりに値“６”が登録され、９回目の呼び出しでは同様に値“６”が追い出されて値“８”が登録される。この結果、プログラムの終了時点での値リストの状態は以下のようになる。
【００１３】
｛値，回数｝＝｛４，３｝，｛７，２｝，｛８，２｝
【特許文献１】特開平１１−１４９３８０号公報
【発明の開示】
【発明が解決しようとする課題】
【００１４】
上記の２通りの従来手法には、それぞれ以下のような問題点がある。
【００１５】
１）従来手法Ａの問題点
上記の処理例において、以下のような順序で値が与えられて手続きが呼ばれた場合に、レコードの値リストには、最も出現回数の高い値が保存されていない可能性がある。
【００１６】
ｘ＝｛１，２，３，４，４，５，５，６，６，６｝
この場合であれば、正しくは、以下のような値と回数との組が値リストに保存されていなければならない。
【００１７】
｛値，回数｝＝｛６，３｝，｛４，２｝，｛５，２｝
しかし、実際に保存される組は以下のとおりとなる。
【００１８】
｛値，回数｝＝｛１，１｝，｛２，１｝，｛３，１｝
２）従来手法Ｂの問題点
上記の処理例でいえば、以下のような順序で値が与えられて手続きが呼ばれた場合に、値リストには最も出現回数の高い値が保存されていない可能性がある。
【００１９】
ｘ＝｛１，３，３，５，５，７，７，１，６，１｝
この場合であれば、正しくは、以下のような値と回数との組が値リストに保存されていなければならない。
【００２０】
｛値、回数｝＝｛１，３｝，｛３，２｝，｛７，２｝
または｛１，３｝，｛３，２｝，｛５，２｝
しかし、実際に保存される組は以下のとおりとなる。
【００２１】
｛値，回数｝＝｛３，２｝，｛５，２｝，｛１，１｝
または｛７，２｝，｛５，２｝，｛１，１｝
または｛７，２｝，｛３，２｝，｛１，１｝
なお、実際にはどのような値と回数との組が値リストに保存されるかは、値リストが一杯になった時点でどの組を捨てるかによって変わることになる。
【００２２】
いずれの従来方法においても、手続きの実行時に得られる変数に与えられる値の種別が値リストの個数以上である場合に、値リストに保存された値と回数との組は信頼できないものとなる可能性があることがわかる。
【００２３】
特許文献１では明示的に言及されていないが、値リストの大きさは翻訳時に決定しなければならない。もし翻訳時に値リストの大きさを決定せずに実行時に動的に値リスト用の記憶領域を確保するとすれば、目的プログラム自身が動的に記憶領域を確保する処理を持つ場合に、その処理と干渉して悪影響を及ぼす可能性がある。そのため、例えば、ＪＡＶＡ（米国Ｓｕｎ  Ｍｉｃｒｏｓｙｔｅｍｓ，Ｉｎｃ．の登録商標）のＪＩＴ（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ）コンパイラにおける仮想マシンのように、システム側で適切な記憶管理を行える場合を除いて、一般的に安全には実行できない。
【００２４】
したがって、翻訳前に、値リストの大きさを、変数に与えられる値の種別数より十分に大きくして決定しておくことは実際上不可能である。
【００２５】
本発明の目的は、上記の問題点に鑑みて、プログラムのコンパイル処理において、翻訳対象のプログラムの実行中に、その手続きの変数に与えられる値であって５０％以上の出現頻度のものについてのプロファイル情報を確実に収集できるコンパイル処理をコンピュータに実行させるための処理プログラムを提供することである。
【００２６】
さらに、上記の処理プログラムにより収集したプロファイル情報を利用して最適化を行えるコンパイル処理をコンピュータに実行させるための処理プログラムを提供することである。
【００２７】
さらに、上記の処理プログラムを記録した記録媒体、および、上記処理プログラムで実行される処理を実現できる処理方法ならびに処理装置を提供することである。
【課題を解決するための手段】
【００２８】
上記の問題点を解決するため、本発明は、プログラム言語で記述されたプログラムを翻訳してコンピュータが実行可能な目的プログラムを生成するコンパイル処理を、コンピュータに実行させるためのコンパイル処理プログラムにおいて、以下の処理を行うものである。
【００２９】
本発明は、第１回目のプログラム翻訳時に、前記プログラムの実行中に手続き内の変数に対して与えられる値と前記値が与えられる回数との組を最大２組までレコードに記録する統計処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された情報を一次プロファイル情報として出力する一次プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、前記第１回目のプログラム実行の終了後に、出力された前記一次プロファイル情報を記憶部に記憶する処理と、前記一次プロファイル情報を読み込み、前記一次プロファイル情報に記憶された前記値を前記レコードに設定する処理と、第２回目のプログラム翻訳時に、前記レコードに設定された値の出現回数と前記値を変数に与える処理を含む手続きの実行回数とを前記レコードに記録する統計検証処理を行う命令列と、前記プログラムの実行終了後に前記レコードに記憶された前記出現回数および前記実行回数とを最終プロファイル情報として出力する最終プロファイル出力処理を行う命令列とを、前記プログラムに付加する処理と、前記第２回目のプログラム実行の終了後に、出力された前記最終プロファイル情報を記憶部に記憶する処理とを、コンピュータに実行させるものである。
【００３０】
また、本発明は、上記の処理プログラムを記録した記録媒体、または上記の処理を実現する処理方法ならびに処理装置である。
【００３１】
本発明は、原始プログラムから生成された目的プログラムの実行中に、その手続きの変数に与えられる値であって５０％以上の出現頻度のものについてのプロファイル情報を収集するために、コンパイル処理において以下の２つの処理を行う。
【００３２】
（１）一次プロファイル処理
本発明では、まず、翻訳対象のプログラムの手続き中の変数に与えられる値のうち出現頻度が５０％以上となりうる値を記録する処理（統計処理）を、翻訳対象のプログラムの適切な位置に挿入する処理を行う。ここで、統計処理の結果を記録するレコードとして、値リストの大きさを２に固定したレコードを用意する。
【００３３】
そして、翻訳対象プログラムの実行中に、変数に対する出現頻度が５０％以上になりうる値をレコードに記録し、レコードに記録された２つの値を一次プロファイル情報として出力する。
【００３４】
なお、出現頻度が５０％以上になりうる値を記録する統計処理は、従来手法Ｂと同様の手法とする。すなわち、２つの値レコードに既に値が格納されている場合には、その時点以降に新しい種別の値が現れたときは、その時点で出現回数の少ない値を値リストから追い出し、新しい値を格納する。
【００３５】
ここでは、後の統計検出処理において出現頻度が５０％以上になりうる値が記録されるようにするだけでよく、その出現回数を正確に記録する必要はない。例えば、上記の手続きｓｕｂ（ｘ）の例で、仮引数ｘに与えられた値が以下のようなものだったとする。
【００３６】
ｘ＝｛１，２，２，３，１，３，３，１，１，１｝
この場合に、実際に保存される組は以下のようになり、出現頻度５０％  の値“１”が記録される。
【００３７】
｛値，回数｝＝｛２，２｝，｛１，３｝または｛３，２｝，｛１，３｝
つまり、ある特定の値の出現頻度が５０％以上になりうるものであるならば、その値は、実行中の出現間隔が一時的にまばらな期間があるために一旦値リストから追い出されたとしても、実行中のいつかの時点で十分な頻繁さで出現するために必ず値リストに再格納されるので、大きさ２の値リストを持つレコードに記録されることになるからである。
【００３８】
しかし、このような統計処理だけでは、以下のような２つの問題点がある。
【００３９】
１) 値の出現回数は正しくない、すなわち実際より低く見積もられることがある。
【００４０】
２) 値リストには出現頻度が５０％未満の値も登録されることがある。
【００４１】
そこで、最終プロファイル処理により、上記の統計処理の処理結果を修正して問題点を解決する。
【００４２】
（２）最終プロファイル処理
本発明では、さらに、１）変数に値を与える処理を含む基本ブロックの実行回数を計測する処理と、２）変数に与えらた値が前記の統計処理で得られたものであった場合に、その値の出現回数を計測する処理との２つの処理（以下、２つの処理を「統計検証処理」とする）を、翻訳対象のプログラムの適切な位置に挿入する処理を行う。
【００４３】
なお、基本ブロックとは、１個以上の命令からなる命令列であって、該命令列の末尾以外に分岐命令がなく、該命令列の先頭以外に分岐命令の分岐先となる命令がない命令列である。
【００４４】
ここで、統計検証処理の結果を記録するレコードとして、統計処理で用いたレコードと同様に値リストの大きさが２に固定されているレコードを用意し、一次プロファイル情報として記憶されている２つの値をレコードの値リストに設定する。
【００４５】
そして、一次プロファイル処理においてプログラムを実行したときと同じ条件のもとでプログラムを実行し、手続き中の変数に与えられた値が、レコードの値リストに設定された値（ここでは、「２と１のいずれか」または「３と１のいずれか」) と同じである場合のみ、その値の出現回数をカウント（１つ増分）していく。また、手続き呼出し自体の呼出し回数を記録するレコードを設け、手続きの実行回数をカウント（１つ増分）する。そして、プログラムの実行終了後に、レコードの記録から最終プロファイル情報を出力する。
【００４６】
このように、最終プロファイル処理を経た後は、任意の変数に対し、
１）出現頻度が５０％以上の値があるかないか、
２）あるとすれば何（値）であるか、
についての統計情報（最終プロファイル情報）が取得できる。
【００４７】
したがって、以降の翻訳処理での最適化において、この最終プロファイル情報を使用することにより目的プログラムの高速化を図ることができる。
【００４８】
以降の翻訳処理において、最終プロファイル情報を参照して最適化を行い、目的プログラムを生成する。例えば、最終プロファイル情報の手続きの実行回数と値の出現回数とをもとに２つの値の出現頻度をそれぞれ算出し、出現頻度が５０％以上である値について、その値が与えられる変数を含む手続きを、予測した動作を行うように特殊化する最適化を行う。
【発明の効果】
【００４９】
本発明によれば、原始プログラムを翻訳して目的プログラムを生成するコンパイラの処理において、翻訳対象のプログラムの手続き中の変数に実際に与えられる値とその頻度とをプロファイル情報として記録する場合に、手続き中の変数に与えられる値の出現回数を誤りなく見積もることができ、特に、出現頻度が５０％を超える値を確実に記録したプロファイル情報を出力することができる。
【００５０】
よって、実行時に手続き中の変数に対して同一の値が高頻度で与えられるようなプログラムを翻訳処理する場合に、変数に与えられる特定の値により予測される動作を行うような処理に特殊化する最適化を施すことができ、一層高速化、効率化した目的プログラムを生成することができる。
【００５１】
本発明は、プログラムのコンパイルを行う一般的なコンパイル処理装置に利用することが可能であるが、変数に特定の値が参照されやすいようなプログラムについて、高速化な目的プログラムを生成するためのコンパイル処理装置に利用することができる。
【００５２】
例えば、組込み機器制御用のプログラムの最適化かつ高速化な目的プログラムを生成するためのコンパイル処理装置に利用することができる。
【００５３】
具体的には、自動車のエンジン、ブレーキなどの制御用機器では、ある１つの機器が複数の車種やグレードに採用されることが多い。この場合に、車種やグレードによってエンジン形式、車載装置、車体重量などが異なることが多く、制御対象の相違が機器制御用プログラム内のパラメータや外部センサから入力されるデータの典型値に影響することがある。しかし、このようなデータは事前に計算で求めることが困難であり、試走行などにより取得したデータから最適値を求めてプログラムに反映させる作業は、人手により行っていた。
【００５４】
しがたって、本発明をコンパイル処理装置に適用することにより、このような最適値のプログラムへの反映を自動化し、より最適化、高速化した目的プログラムを取得できるため、プログラム開発時における負担の軽減を図ることができる。
【発明を実施するための最良の形態】
【００５５】
本発明の最良の実施の形態として、本発明を、原始プログラムの翻訳処理において、翻訳時に、実行中の手続きの変数に実際に与えられる値に関するプロファイル情報を記録する処理を付加し、目的プログラムの実行中にそのプロファイル情報を収集・出力し、出力されたプロファイル情報を利用して最適化を行うコンパイル処理装置において実施した。
【実施例】
【００５６】
図１は、本発明の一実施例における構成例を示す図である。
【００５７】
コンパイル処理装置１は、解析処理部１１、一次プロファイル処理部１２、一次プロファイル読み込み部１３、最終プロファイル処理部１４、最終プロファイル読み込み部１５、最適化部１６、および目的プログラム生成部１７を備える。
【００５８】
解析処理部１１は、翻訳対象の原始プログラム４を読み込み、構文やデータを解析し、原始プログラムから中間形式データを生成する処理手段である。
【００５９】
一次プロファイル処理部１２は、目的プログラム５の実行中に手続き中の変数に与えられる値のうち出現頻度が５０％以上となりうるものをレコード６に記録する統計処理を行う命令列と、実行終了後にレコード６の内容をまとめて一次プロファイル情報３１としてファイル出力する処理を行う命令列とを、中間形式データの所定の位置に埋め込む処理手段である。
【００６０】
一次プロファイル読み込み部１３は、一次プロファイル情報３１を読み込む処理手段である。
【００６１】
最終プロファイル処理部１４は、目的プログラム５の変数に値を与える処理を含む基本ブロックの実行回数と、変数に与えられる値であって一次プロファイル情報３１に記憶されたものの出現回数とを計測する統計検証処理を行う命令列と、実行終了後にレコード６の内容をまとめて最終プロファイル情報３２としてファイル出力する処理を行う命令列とを、中間形式データの所定の位置に埋め込む処理手段である。
【００６２】
最終プロファイル読み込み部１５は、最終プロファイル情報３２を読み込み、最終プロファイル情報３２に設定された変数に与えられる２つの値それぞれについて値の出現頻度を求める処理手段である。
【００６３】
最適化部１６は、最終プロファイル情報３２を参照して、実行中に手続き中の変数に与えられる値のうち出現頻度が５０％以上のものに対し、その値により予測される動作を行うような最適化を行う処理手段である。
【００６４】
目的プログラム生成部１７は、中間形式データから目的プログラム５を生成する処理手段である。
【００６５】
目的プログラム５は、実行終了後に、一次プロファイル情報３１または最終プロファイル情報３２をファイル出力する。
【００６６】
図２に、本発明の処理フローを示す。
【００６７】
コンパイル処理装置１は、原始プログラム４に対して３回の翻訳処理を行い、最後の翻訳処理において最適化した目的プログラム５を生成する。
【００６８】
まず、第１回目の翻訳処理を行うため、コンパイル処理装置１は、一時プロファイル処理部１２を実施する指示を受けて起動される。
【００６９】
コンパイル処理装置１は、解析処理部１１により、原始プログラム４を読み込み、必要な構文解析やデータ解析などを行い、原始プログラム４を中間形式データに変換する。その際に原始プログラム４内の全ての基本ブロックと変数に固有の番号を振る（ステップＳ１０１）。
【００７０】
次に、一次プロファイル処理部１２により、プロファイル情報を取るよう指定した変数の１つ１つに対し、以下のような処理を行う（ステップＳ１０２）。
【００７１】
まず、一次プロファイル処理部１２は、中間形式データのデータ部分にその変数用のレコード６を用意する。そして、レコード６の基本ブロック番号欄と変数番号欄を設定し、中間形式データ内のその変数の定義点の直後に、統計処理を行う命令列を挿入する。
【００７２】
図３（Ａ）に、レコード６の構成例を示す。レコード６は、基本ブロックの固有の番号が設定される基本ブロック番号、基本ブロックが実行された回数が設定される基本ブロック実行カウンタ、変数の固有の番号が設定される変数番号、プログラムの実行中に基本ブロック中のその変数に与えられる値が設定される値Ｖおよび値Ｖの出現回数が設定されるカウンタＮの２つの項目を持つ２つの値リストＡおよび値リストＢで構成される。図３（Ｂ）は、図３（Ａ）のレコード６のデータ構造体のＣ言語による記述例である。
【００７３】
その後、目的プログラム生成部１７により、中間形式データから目的プログラム５を生成する（ステップＳ１０３）。
【００７４】
さらに、人手により、その目的プログラム５を仮に実行する（ステップＳ１０４）。目的プログラム５の実行中、ステップＳ１０２の処理で挿入された命令列により、以下のような統計処理が行われる。
【００７５】
図４に、統計処理の流れを示す。
【００７６】
まず、目的プログラム５の実行中に変数に与えられた値を取得し（ステップＳ２０）、取得した値がレコード６の値リストＡにあるかどうかを判定する（ステップＳ２１）。
【００７７】
取得した値がレコード６の値リストＡの値Ｖａと同じであれば、カウンタＮａを１つ増やす（ステップＳ２２）。
【００７８】
一方、取得した値が値リストＡになければ、その値がレコード６の値リストＢにあるかどうかを判定する（ステップＳ２３）。その値がレコード６の値リストＢにあれば、すなわち取得した値が値リストＢの値Ｖｂと同じであればカウンタＮｂを１つ増やし（ステップＳ２４）、カウンタＮｂの値がカウンタＮａの値より大きいかどうかを判定して（ステップＳ２５）、カウンタＮｂの値がカウンタＮａの値より大きければ、値リストＡと値リストＢとを入れ替える（ステップＳ２６）。
【００７９】
また、ステップＳ２３の処理において、その値がレコード６の値リストＢになければ、取得した値を値リストＢの値Ｖｂに登録し、カウンタＮｂの値を１にする（ステップＳ２７）。
【００８０】
実行の終了後、レコード６に記録された値がまとめられ、一次プロファイル情報３１としてファイル出力される（ステップＳ１０５）。
【００８１】
このようにして、実行中の手続きの変数に与えられる出現頻度が５０％以上になりうる値が一次プロファイル情報３１として記憶される。
【００８２】
次に、第２回目の翻訳処理を行うため、コンパイル処理装置１は、一時プロファイル読み込み部１３および最終プロファイル処理部１４を実施する指示を受けて起動される。
【００８３】
まず、解析処理部１１により、翻訳対象となる原始プログラム４を読み込み、ステップＳ１０１の処理と同様、必要な構文解析、データ解析などを行い、中間形式データに変換する。その際に、プログラム内の全ての基本ブロックと変数に固有の番号を振る（ステップＳ１０６）。
【００８４】
次に、一次プロファイル読み込み部１３により、一次プロファイル情報３１を読み込み、記憶されている２つの値をレコード６に設定する（ステップＳ１０７）。
【００８５】
さらに、最終プロファイル処理部１４により、プロファイル情報をとるよう指定した変数の１つ１つに対し、以下のような処理を行う（ステップＳ１０８）。
【００８６】
まず、最終プロファイル処理部１４は、中間形式データのデータ部分にその変数用のレコード６を用意する。なお、レコード６は、前記の統計処理において使用したものと同じデータ構造体である。そして、レコード６の基本ブロック番号欄と変数番号欄を設定し、一時プロファイル情報３１から得た２つの値を、値リストＡおよび値リストＢにそれぞれ設定する。さらに、中間形式データ内のその変数の定義点の直後に、統計検証処理を行う命令列を挿入する。
【００８７】
その後、目的プログラム生成部１７により、中間形式データから目的プログラム５を生成する（ステップＳ１０９）。さらに、人手により、目的プログラム５を仮に実行する（ステップＳ１１０）。目的プログラム５の実行中、ステップＳ１０８の処理で挿入された命令列により、以下のような統計検証処理が行われる。
【００８８】
図５に、挿入された命令列による統計検証処理の流れを示す。
【００８９】
まず、基本ブロックの実行回数カウンタを１つ増やす（ステップＳ３０）。そして、実行中に手続き中の変数に与えられた値を取得し（ステップＳ３１）、取得した値がレコード６の値リストＡにあるかどうかを判定する（ステップＳ３２）。
【００９０】
取得した値がレコード６の値リストＡの値Ｖａと同じであれば、カウンタＮａを１つ増やす（ステップＳ３３）。
【００９１】
一方、取得した値が値リストＡになければ、その値がレコード６の値リストＢにあるかどうかを判定する（ステップＳ３４）。
【００９２】
そして、その値がレコード６の値リストＢにあれば、すなわち取得した値が値リストＢの値Ｖｂと同じであればカウンタＮｂを１つ増やす（ステップＳ３５）。
【００９３】
実行の終了後、レコード６に記録された値がまとめられ、最終プロファイル情報３２としてファイル出力される（ステップＳ１１１）。
【００９４】
このようにして、統計処理で抽出された２つの値の出現回数と、その値が与えられる変数を含む手続きの実行回数とが最終プロファイル情報３２として記憶される。
【００９５】
次に、第３回目の翻訳処理を行うため、コンパイル処理装置１は、最終プロファイル読み込み部１５および最適化部１６を実施する指示を受けて起動される。
【００９６】
まず、解析処理部１１により、翻訳対象となる原始プログラム４を読み込み、ステップＳ１０１の処理と同様、必要な構文解析、データ解析などを行い、中間形式データに変換する。その際に、プログラム内の全ての基本ブロックと変数に固有の番号を振る（ステップＳ１１２）。
【００９７】
次に、最終プロファイル読み込み部１５により、最終プロファイル情報３２を読み込み、統計検証処理において設定された値リストＡおよび値リストＢの値について、それぞれの実行回数カウンタの値（ＮａまたはＮｂ）を基本ブロック実行カウンタで割り、それぞれの値の出現頻度を求める（ステップＳ１１３）。
【００９８】
そして、値リストＡまたは値リストＢの値のうち出現頻度が５０％以上の値があれば、最適化部１６により、その値を利用した最適化を行う（ステップＳ１１４）。そして、目的プログラム生成部１７により、目的プログラム５を生成する（ステップＳ１１５）。
【００９９】
図６に、最終プロファイル情報３２を用いた最適化の例を示す。
【０１００】
図６（Ａ）は、最適化前の原始プログラム４のある一部を示す。原始プログラム４の部分に記述されている関数ｆｏｏは、２つの整数引数をとり、その商を返す関数である。例えば、最終プロファイル読み込み部１５により、最終プロファイル情報３２を参照して、関数ｆｏｏの変数ｙのとりうる値が５０％以上の確率で「１７」であることが判明したとする。
【０１０１】
最適化部１６は、関数ｆｏｏについて、高頻度に与えられる変数ｙの値＝１７の場合と、それ以外の値の場合とに分けて動作を行い、高頻度の値を固定化して扱い処理速度を高速化する最適化を行う。
【０１０２】
図６（Ｂ）は、最適化が施されて生成された目的プログラム５の図６（Ａ）に示す部分を、可読性を確保して本発明の効果を明白にするために、原始プログラム４の記述形式で示したものである。図６（Ｂ）に示すように、この手続きにおいて頻度が５０％以上となる変数ｙの値＝１７の場合の処理は、最適化前の処理より高速化される。
【０１０３】
このように、高い出現頻度（５０％以上）で変数に与えられる値に対して特殊化するような最適化を行うことにより、その変数を含む手続き全体の高速化を図ることができる。結果的に、生成する目的プログラム５の高速化、効率化を図ることができる。
【０１０４】
以上、本発明をその実施の形態により説明したが、本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【０１０５】
例えば、ステップＳ１１３の処理において、一次プロファイル情報３１に基づいて設定したレコード６の値の出現頻度を求める割り算処理は、ステップＳ１１１の処理において、統計検証処理の結果と一緒に目的プログラム５に挿入して行い、最終プロファイル情報３２に記録するようにしてもよい。この場合に、最終プロファイル処理部１４は、上記の出現頻度を求める割り算処理を行う命令列を、中間形式データ中に埋め込む。
【０１０６】
また、統計処理および統計検証処理は、原始プログラム４に含まれる任意の変数を対象として行うようにしてもよい。この場合に、統計情報の対象とする変数に関する情報が、統計処理開始前にコンパイル処理装置１に与えられるようにする。なお、統計情報の対象とする変数は、ユーザが任意に設定できる。
【０１０７】
また、本発明は、コンピュータにより読み取られ実行される処理プログラムとして実施するものとして説明したが、本発明を実現する処理プログラムは、コンピュータが読み取り可能な、可搬媒体メモリ、半導体メモリ、ハードディスクなどの適当な記録媒体に格納することができ、これらの記録媒体に記録して提供され、または、通信インタフェースを介して種々の通信網を利用した送受信により提供されるものである。
【図面の簡単な説明】
【０１０８】
【図１】本発明の一実施例における構成例を示す図である。
【図２】本発明の処理フローを示す図である。
【図３】レコードの構成例を示す図である。
【図４】挿入された命令列による統計処理の流れを示す図である。
【図５】挿入された命令列による統計検証処理の流れを示す図である。
【図６】最終プロファイル情報を用いた最適化の例を示す図である。
【符号の説明】
【０１０９】
１  コンパイル処理装置
１１  解析処理部
１２  一時プロファイル処理部
１３  一時プロファイル読み込み部
１４  最終プロファイル処理部
１５  最終プロファイル読み込み部
１６  最適化部
１７  目的プログラム生成部
３１  一時プロファイル情報
３２  最終プロファイル情報
４  原始プログラム
５  目的プログラム
６  レコード
【図１】
2005071135.tif 000003
【図２】
2005071135.tif 000004
【図３】
2005071135.tif 000005
【図４】
2005071135.tif 000006
【図５】
2005071135.tif 000007
【図６】
2005071135.tif 000008